[Mplayerxp-cvslog] SF.net SVN: mplayerxp:[168] mplayerxp
Brought to you by:
olov
From: <nic...@us...> - 2012-10-18 11:33:08
|
Revision: 168 http://mplayerxp.svn.sourceforge.net/mplayerxp/?rev=168&view=rev Author: nickols_k Date: 2012-10-18 11:32:55 +0000 (Thu, 18 Oct 2012) Log Message: ----------- improve readability of source code Modified Paths: -------------- mplayerxp/dump.c mplayerxp/libmpdemux/demux_aiff.c mplayerxp/libmpdemux/demux_asf.c mplayerxp/libmpdemux/demux_audio.c mplayerxp/libmpdemux/demux_avi.c mplayerxp/libmpdemux/demux_demuxers.c mplayerxp/libmpdemux/demux_dv.c mplayerxp/libmpdemux/demux_film.c mplayerxp/libmpdemux/demux_fli.c mplayerxp/libmpdemux/demux_lavf.c mplayerxp/libmpdemux/demux_mkv.c mplayerxp/libmpdemux/demux_mov.c mplayerxp/libmpdemux/demux_mpg.c mplayerxp/libmpdemux/demux_mpxp64.c mplayerxp/libmpdemux/demux_nsv.c mplayerxp/libmpdemux/demux_nuv.c mplayerxp/libmpdemux/demux_ogg.c mplayerxp/libmpdemux/demux_pva.c mplayerxp/libmpdemux/demux_ra.c mplayerxp/libmpdemux/demux_rawaudio.c mplayerxp/libmpdemux/demux_rawvideo.c mplayerxp/libmpdemux/demux_real.c mplayerxp/libmpdemux/demux_smjpeg.c mplayerxp/libmpdemux/demux_ts.c mplayerxp/libmpdemux/demux_ty.c mplayerxp/libmpdemux/demux_vqf.c mplayerxp/libmpdemux/demux_y4m.c mplayerxp/libmpdemux/demuxer.c mplayerxp/libmpdemux/demuxer.h mplayerxp/libmpdemux/demuxer_r.c mplayerxp/libmpdemux/demuxer_r.h mplayerxp/mplayer.c Modified: mplayerxp/dump.c =================================================================== --- mplayerxp/dump.c 2012-10-17 17:33:30 UTC (rev 167) +++ mplayerxp/dump.c 2012-10-18 11:32:55 UTC (rev 168) @@ -332,6 +332,7 @@ if (seek_to_sec) { float d; float rel_seek_secs=0; + seek_args_t seek_p = { 0, 1}; int a,b; if (sscanf(seek_to_sec, "%d:%d:%f", &a,&b,&d)==3) rel_seek_secs += 3600*a +60*b +d ; @@ -342,7 +343,8 @@ seek_to_sec = NULL; MSG_INFO("seeking to %u seconds\n"); - demux_seek_r(demuxer,rel_seek_secs,1); + seek_p.secs=rel_seek_secs; + demux_seek_r(demuxer,&seek_p); } aeof=sh_audio?0:1; veof=sh_video?0:1; Modified: mplayerxp/libmpdemux/demux_aiff.c =================================================================== --- mplayerxp/libmpdemux/demux_aiff.c 2012-10-17 17:33:30 UTC (rev 167) +++ mplayerxp/libmpdemux/demux_aiff.c 2012-10-18 11:32:55 UTC (rev 168) @@ -197,13 +197,13 @@ return 1; } -static void aiff_seek(demuxer_t *demuxer,float rel_seek_secs,int flags){ +static void aiff_seek(demuxer_t *demuxer,const seek_args_t* seeka){ stream_t* s = demuxer->stream; sh_audio_t* sh_audio = demuxer->audio->sh; off_t base,pos; - base = (flags&DEMUX_SEEK_SET) ? demuxer->movi_start : stream_tell(s); - pos=base+(flags&DEMUX_SEEK_PERCENTS?(demuxer->movi_end - demuxer->movi_start):sh_audio->i_bps)*rel_seek_secs; + base = (seeka->flags&DEMUX_SEEK_SET) ? demuxer->movi_start : stream_tell(s); + pos=base+(seeka->flags&DEMUX_SEEK_PERCENTS?(demuxer->movi_end - demuxer->movi_start):sh_audio->i_bps)*seeka->secs; pos -= (pos % (sh_audio->channels * sh_audio->samplesize) ); stream_seek(s,pos); resync_audio_stream(sh_audio); Modified: mplayerxp/libmpdemux/demux_asf.c =================================================================== --- mplayerxp/libmpdemux/demux_asf.c 2012-10-17 17:33:30 UTC (rev 167) +++ mplayerxp/libmpdemux/demux_asf.c 2012-10-18 11:32:55 UTC (rev 168) @@ -678,7 +678,7 @@ } -static void asf_seek(demuxer_t *demuxer,float rel_seek_secs,int flags){ +static void asf_seek(demuxer_t *demuxer,const seek_args_t* seeka){ demux_stream_t *d_audio=demuxer->audio; demux_stream_t *d_video=demuxer->video; asf_priv_t *apriv=demuxer->priv; @@ -686,12 +686,12 @@ /*================= seek in ASF ==========================*/ float p_rate=apriv->asf_packetrate; // packets / sec - off_t rel_seek_packs=(flags&DEMUX_SEEK_PERCENTS)? // FIXME: int may be enough? - (rel_seek_secs*(demuxer->movi_end-demuxer->movi_start)/apriv->asf_packetsize): - (rel_seek_secs*p_rate); + off_t rel_seek_packs=(seeka->flags&DEMUX_SEEK_PERCENTS)? // FIXME: int may be enough? + (seeka->secs*(demuxer->movi_end-demuxer->movi_start)/apriv->asf_packetsize): + (seeka->secs*p_rate); off_t rel_seek_bytes=rel_seek_packs*apriv->asf_packetsize; off_t newpos; - newpos=((flags&DEMUX_SEEK_SET)?demuxer->movi_start:demuxer->filepos)+rel_seek_bytes; + newpos=((seeka->flags&DEMUX_SEEK_SET)?demuxer->movi_start:demuxer->filepos)+rel_seek_bytes; if(newpos<0 || newpos<demuxer->movi_start) newpos=demuxer->movi_start; stream_seek(demuxer->stream,newpos); Modified: mplayerxp/libmpdemux/demux_audio.c =================================================================== --- mplayerxp/libmpdemux/demux_audio.c 2012-10-17 17:33:30 UTC (rev 167) +++ mplayerxp/libmpdemux/demux_audio.c 2012-10-18 11:32:55 UTC (rev 168) @@ -1150,7 +1150,7 @@ sh_audio->wf->nAvgBytesPerSec = 32 * 1024; // dummy to make mplayerxp not hang sh_audio->wf->cbSize = 24; break; - } + } case RAW_VOC: { char chunk[4]; @@ -1186,7 +1186,6 @@ unsigned int chunk_type; unsigned int chunk_size; WAVEFORMATEX* w; - unsigned char *pfcc; int l; sh_audio->wf = w = (WAVEFORMATEX*)malloc(sizeof(WAVEFORMATEX)); do @@ -1538,8 +1537,8 @@ int bit_len; demux_packet_t* dp; sh_audio_t* sh_audio = ds->sh; - da_priv_t* priv = demux->priv; - stream_t* s = demux->stream; + priv = demux->priv; + s = demux->stream; sh_audio = ds->sh; if (s->eof) return 0; @@ -1630,7 +1629,7 @@ } } -static void audio_seek(demuxer_t *demuxer,float rel_seek_secs,int flags){ +static void audio_seek(demuxer_t *demuxer,const seek_args_t* seeka){ sh_audio_t* sh_audio; stream_t* s; int base,pos,frmt; @@ -1642,11 +1641,11 @@ priv = demuxer->priv; if(priv->frmt==RAW_MUSEPACK) { - da_priv_t* priv = demuxer->priv; - stream_t* s = demuxer->stream; - float target = rel_seek_secs; - if (flags & DEMUX_SEEK_PERCENTS) target *= priv->length; - if (!(flags & DEMUX_SEEK_SET)) target += priv->last_pts; + priv = demuxer->priv; + s = demuxer->stream; + float target = seeka->secs; + if (seeka->flags & DEMUX_SEEK_PERCENTS) target *= priv->length; + if (!(seeka->flags & DEMUX_SEEK_SET)) target += priv->last_pts; if (target < priv->last_pts) { stream_seek(s, demuxer->movi_start); priv->pos = 32; // empty bit buffer @@ -1670,10 +1669,10 @@ { unsigned percents,cpercents,npercents; off_t newpos,spos; - percents = (unsigned)(rel_seek_secs*100.)/(float)demuxer->movi_length; + percents = (unsigned)(seeka->secs*100.)/(float)demuxer->movi_length; spos=stream_tell(demuxer->stream); cpercents=(unsigned)((float)spos*100./(float)priv->nbytes); - npercents=(flags&DEMUX_SEEK_SET)?percents:cpercents+percents; + npercents=(seeka->flags&DEMUX_SEEK_SET)?percents:cpercents+percents; if(npercents>100) npercents=100; newpos=demuxer->movi_start+(off_t)(((float)priv->toc[npercents]/256.0)*priv->nbytes); MSG_DBG2("xing seeking: secs=%f prcnts=%u cprcnts=%u spos=%llu newpos=%llu\n",rel_seek_secs,npercents,cpercents,spos,newpos); @@ -1681,8 +1680,8 @@ priv->last_pts=(((float)demuxer->movi_length*npercents)/100.)*1000.; return; } - if((priv->frmt == RAW_MP3 || priv->frmt == RAW_MP2 || priv->frmt == RAW_MP1) && hr_mp3_seek && !(flags & DEMUX_SEEK_PERCENTS)) { - len = (flags & DEMUX_SEEK_SET) ? rel_seek_secs - priv->last_pts : rel_seek_secs; + if((priv->frmt == RAW_MP3 || priv->frmt == RAW_MP2 || priv->frmt == RAW_MP1) && hr_mp3_seek && !(seeka->flags & DEMUX_SEEK_PERCENTS)) { + len = (seeka->flags & DEMUX_SEEK_SET) ? seeka->secs - priv->last_pts : seeka->secs; if(len < 0) { stream_seek(s,demuxer->movi_start); len = priv->last_pts + len; @@ -1695,8 +1694,8 @@ return; } - base = flags&DEMUX_SEEK_SET ? demuxer->movi_start : stream_tell(s); - pos=base+(flags&DEMUX_SEEK_PERCENTS?(demuxer->movi_end - demuxer->movi_start):sh_audio->i_bps)*rel_seek_secs; + base = seeka->flags&DEMUX_SEEK_SET ? demuxer->movi_start : stream_tell(s); + pos=base+(seeka->flags&DEMUX_SEEK_PERCENTS?(demuxer->movi_end - demuxer->movi_start):sh_audio->i_bps)*seeka->secs; if(demuxer->movi_end && pos >= demuxer->movi_end) { sh_audio->timer = (stream_tell(s) - demuxer->movi_start)/(float)sh_audio->i_bps; @@ -1706,7 +1705,7 @@ priv->last_pts = (pos-demuxer->movi_start)/(float)sh_audio->i_bps; sh_audio->timer = priv->last_pts - (ds_tell_pts(demuxer->audio)-sh_audio->a_in_buffer_len)/(float)sh_audio->i_bps; - + frmt=priv->frmt; if(frmt==RAW_WAV) { @@ -1719,7 +1718,7 @@ } switch(frmt) { case RAW_AC3: { - len = (flags & DEMUX_SEEK_SET) ? rel_seek_secs - priv->last_pts : rel_seek_secs; + len = (seeka->flags & DEMUX_SEEK_SET) ? seeka->secs - priv->last_pts : seeka->secs; if(len < 0) { stream_seek(s,demuxer->movi_start); len = priv->last_pts + len; @@ -1732,7 +1731,7 @@ return; } case RAW_DCA: { - len = (flags & DEMUX_SEEK_SET) ? rel_seek_secs - priv->last_pts : rel_seek_secs; + len = (seeka->flags & DEMUX_SEEK_SET) ? seeka->secs - priv->last_pts : seeka->secs; if(len < 0) { stream_seek(s,demuxer->movi_start); len = priv->last_pts + len; Modified: mplayerxp/libmpdemux/demux_avi.c =================================================================== --- mplayerxp/libmpdemux/demux_avi.c 2012-10-17 17:33:30 UTC (rev 167) +++ mplayerxp/libmpdemux/demux_avi.c 2012-10-18 11:32:55 UTC (rev 168) @@ -1336,7 +1336,7 @@ return demuxer; } -static void avi_seek(demuxer_t *demuxer,float rel_seek_secs,int flags){ +static void avi_seek(demuxer_t *demuxer,const seek_args_t* seeka){ avi_priv_t *priv=demuxer->priv; demux_stream_t *d_audio=demuxer->audio; demux_stream_t *d_video=demuxer->video; @@ -1346,17 +1346,17 @@ //FIXME: OFF_T - Didn't check AVI case yet (avi files can't be >2G anyway?) //================= seek in AVI ========================== - int rel_seek_frames=rel_seek_secs*sh_video->fps; + int rel_seek_frames=seeka->secs*sh_video->fps; int video_chunk_pos=d_video->pos; int i; - if(flags&DEMUX_SEEK_SET){ + if(seeka->flags&DEMUX_SEEK_SET){ // seek SOF video_chunk_pos=0; } - if(flags&DEMUX_SEEK_PERCENTS){ - rel_seek_frames=rel_seek_secs*priv->numberofframes; + if(seeka->flags&DEMUX_SEEK_PERCENTS){ + rel_seek_frames=seeka->secs*priv->numberofframes; } priv->skip_video_frames=0; @@ -1396,7 +1396,7 @@ sh_video->num_frames=sh_video->num_frames_decoded=d_video->pack_no; priv->avi_video_pts=d_video->pack_no*(float)sh_video->video.dwScale/(float)sh_video->video.dwRate; d_video->pos=video_chunk_pos; - + MSG_DBG2("V_SEEK: pack=%d pts=%5.3f chunk=%d \n",d_video->pack_no,priv->avi_video_pts,video_chunk_pos); // ------------ STEP 2: seek audio, find the right chunk & pos ------------ @@ -1448,12 +1448,12 @@ MSG_V("SEEK: i=%d (max:%d) dpos=%d (wanted:%d) \n", i,chunk_max,(int)d_audio->dpos,curr_audio_pos); - + } else { // VBR audio int chunks=(priv->avi_video_pts)*(float)sh_audio->audio.dwRate/(float)sh_audio->audio.dwScale; audio_chunk_pos=0; - + // find audio chunk pos: for(i=0;i<priv->idx_size && chunks>0;i++){ int id=((AVIINDEXENTRY *)priv->idx)[i].ckid; @@ -1474,9 +1474,9 @@ } } //if(audio_chunk_pos>chunk_max) audio_chunk_pos=chunk_max; - + } - + // Now we have: // audio_chunk_pos = chunk no in index table (it's <=chunk_max) // skip_audio_bytes = bytes to be skipped after chunk seek Modified: mplayerxp/libmpdemux/demux_demuxers.c =================================================================== --- mplayerxp/libmpdemux/demux_demuxers.c 2012-10-17 17:33:30 UTC (rev 167) +++ mplayerxp/libmpdemux/demux_demuxers.c 2012-10-18 11:32:55 UTC (rev 168) @@ -19,7 +19,7 @@ dd_priv_t* priv; ret = (demuxer_t*)calloc(1,sizeof(demuxer_t)); - + priv = (dd_priv_t*)malloc(sizeof(dd_priv_t)); priv->vd = vd; priv->ad = ad; @@ -30,15 +30,15 @@ // Video is the most important :-) ret->stream = vd->stream; ret->flags = (vd->flags&DEMUXF_SEEKABLE) && (ad->flags&DEMUXF_SEEKABLE) && (sd->flags&DEMUXF_SEEKABLE); - + ret->video = vd->video; ret->audio = ad->audio; ret->sub = sd->sub; - + return ret; } -int demux_demuxers_fill_buffer(demuxer_t *demux,demux_stream_t *ds) { +static int demux_demuxers_fill_buffer(demuxer_t *demux,demux_stream_t *ds) { dd_priv_t* priv; priv=demux->priv; @@ -49,27 +49,28 @@ return demux_fill_buffer(priv->ad,ds); else if(ds->demuxer == priv->sd) return demux_fill_buffer(priv->sd,ds); - + MSG_ERR("Demux demuxers fill_buffer error : bad demuxer : not vd, ad nor sd\n"); return 0; } -void demux_demuxers_seek(demuxer_t *demuxer,float rel_seek_secs,int flags) { +static void demux_demuxers_seek(demuxer_t *demuxer,const seek_args_t* seeka) { dd_priv_t* priv; float pos; priv=demuxer->priv; + seek_args_t seek_p = { seeka->secs, 1 }; stream_set_eof(priv->ad->stream,0); stream_set_eof(priv->sd->stream,0); // Seek video - demux_seek(priv->vd,rel_seek_secs,flags); + demux_seek(priv->vd,seeka); // Get the new pos pos = demuxer->video->pts; if(priv->ad != priv->vd) { sh_audio_t* sh = (sh_audio_t*)demuxer->audio->sh; - demux_seek(priv->ad,pos,1); + demux_seek(priv->ad,&seek_p); // In case the demuxer don't set pts if(!demuxer->audio->pts) demuxer->audio->pts = pos-((ds_tell_pts(demuxer->audio)-sh->a_in_buffer_len)/(float)sh->i_bps); @@ -78,11 +79,11 @@ } if(priv->sd != priv->vd) - demux_seek(priv->sd,pos,1); + demux_seek(priv->sd,&seek_p); } -void demux_close_demuxers(demuxer_t* demuxer) { +static void demux_close_demuxers(demuxer_t* demuxer) { dd_priv_t* priv = demuxer->priv; if(priv->vd) @@ -96,4 +97,3 @@ demux_info_free(demuxer); free(demuxer); } - Modified: mplayerxp/libmpdemux/demux_dv.c =================================================================== --- mplayerxp/libmpdemux/demux_dv.c 2012-10-17 17:33:30 UTC (rev 167) +++ mplayerxp/libmpdemux/demux_dv.c 2012-10-18 11:32:55 UTC (rev 168) @@ -46,20 +46,17 @@ dv_decoder_t *decoder; } rawdv_frames_t; -static void dv_seek(demuxer_t *demuxer,float rel_seek_secs,float audio_delay,int flags) +static void dv_seek(demuxer_t *demuxer,const seek_args_t* seeka) { rawdv_frames_t *frames = (rawdv_frames_t *)demuxer->priv; sh_video_t *sh_video = demuxer->video->sh; - off_t newpos=(flags&DEMUX_SEEK_SET)?0:frames->current_frame; - if(flags&DEMUX_SEEK_PERCENTS) - { + off_t newpos=(seeka->flags&DEMUX_SEEK_SET)?0:frames->current_frame; + if(seeka->flags&DEMUX_SEEK_PERCENTS) { // float 0..1 - newpos+=rel_seek_secs*frames->frame_number; - } - else - { + newpos+=seeka->secs*frames->frame_number; + } else { // secs - newpos+=rel_seek_secs*sh_video->fps; + newpos+=seeka->secs*sh_video->fps; } if(newpos<0) newpos=0; Modified: mplayerxp/libmpdemux/demux_film.c =================================================================== --- mplayerxp/libmpdemux/demux_film.c 2012-10-17 17:33:30 UTC (rev 167) +++ mplayerxp/libmpdemux/demux_film.c 2012-10-18 11:32:55 UTC (rev 168) @@ -49,16 +49,16 @@ unsigned int film_version; } film_data_t; -static void film_seek(demuxer_t *demuxer, float rel_seek_secs, int flags) +static void film_seek(demuxer_t *demuxer, const seek_args_t* seeka) { film_data_t *film_data = (film_data_t *)demuxer->priv; - int new_current_chunk=(flags&DEMUX_SEEK_SET)?0:film_data->current_chunk; + int new_current_chunk=(seeka->flags&DEMUX_SEEK_SET)?0:film_data->current_chunk; - new_current_chunk += rel_seek_secs *(flags&DEMUX_SEEK_PERCENTS?film_data->total_chunks:film_data->chunks_per_second); + new_current_chunk += seeka->secs *(seeka->flags&DEMUX_SEEK_PERCENTS?film_data->total_chunks:film_data->chunks_per_second); MSG_V("current, total chunks = %d, %d; seek %5.3f sec, new chunk guess = %d\n", film_data->current_chunk, film_data->total_chunks, - rel_seek_secs, new_current_chunk); + seeka->secs, new_current_chunk); // check if the new chunk number is valid if (new_current_chunk < 0) @@ -74,9 +74,9 @@ film_data->current_chunk = new_current_chunk; MSG_V(" (flags = %X) actual new chunk = %d (syncinfo1 = %08X)\n", - flags, film_data->current_chunk, film_data->chunks[film_data->current_chunk].syncinfo1); + seeka->flags, film_data->current_chunk, film_data->chunks[film_data->current_chunk].syncinfo1); demuxer->video->pts=film_data->chunks[film_data->current_chunk].pts; - + } // return value: Modified: mplayerxp/libmpdemux/demux_fli.c =================================================================== --- mplayerxp/libmpdemux/demux_fli.c 2012-10-17 17:33:30 UTC (rev 167) +++ mplayerxp/libmpdemux/demux_fli.c 2012-10-18 11:32:55 UTC (rev 168) @@ -25,11 +25,11 @@ unsigned int *frame_size; } fli_frames_t; -static void fli_seek(demuxer_t *demuxer,float rel_seek_secs,int flags){ +static void fli_seek(demuxer_t *demuxer,const seek_args_t* seeka){ fli_frames_t *frames = (fli_frames_t *)demuxer->priv; sh_video_t *sh_video = demuxer->video->sh; - int newpos=(flags&DEMUX_SEEK_SET)?0:frames->current_frame; - newpos+=rel_seek_secs*(flags&DEMUX_SEEK_PERCENTS?frames->num_frames:sh_video->fps); + int newpos=(seeka->flags&DEMUX_SEEK_SET)?0:frames->current_frame; + newpos+=seeka->secs*(seeka->flags&DEMUX_SEEK_PERCENTS?frames->num_frames:sh_video->fps); if(newpos<0) newpos=0; else if(newpos>frames->num_frames) newpos=frames->num_frames; frames->current_frame=newpos; Modified: mplayerxp/libmpdemux/demux_lavf.c =================================================================== --- mplayerxp/libmpdemux/demux_lavf.c 2012-10-17 17:33:30 UTC (rev 167) +++ mplayerxp/libmpdemux/demux_lavf.c 2012-10-18 11:32:55 UTC (rev 168) @@ -473,11 +473,11 @@ return 1; } -static void lavf_seek(demuxer_t *demuxer, float rel_seek_secs, int flags){ +static void lavf_seek(demuxer_t *demuxer,const seek_args_t* seeka){ lavf_priv_t *priv = demuxer->priv; - MSG_DBG2("lavf_demux(%p, %f, %d)\n", demuxer, rel_seek_secs, flags); + MSG_DBG2("lavf_demux(%p, %f, %d)\n", demuxer, seeka->secs, seeka->flags); - av_seek_frame(priv->avfc, -1, priv->last_pts + rel_seek_secs*AV_TIME_BASE, rel_seek_secs < 0 ? AVSEEK_FLAG_BACKWARD : 0); + av_seek_frame(priv->avfc, -1, priv->last_pts + seeka->secs*AV_TIME_BASE, seeka->secs < 0 ? AVSEEK_FLAG_BACKWARD : 0); } static int lavf_control(demuxer_t *demuxer, int cmd, any_t*arg) Modified: mplayerxp/libmpdemux/demux_mkv.c =================================================================== --- mplayerxp/libmpdemux/demux_mkv.c 2012-10-17 17:33:30 UTC (rev 167) +++ mplayerxp/libmpdemux/demux_mkv.c 2012-10-18 11:32:55 UTC (rev 168) @@ -2698,7 +2698,7 @@ return 0; } -static void mkv_seek (demuxer_t *demuxer, float rel_seek_secs, int flags); +static void mkv_seek (demuxer_t *demuxer,const seek_args_t* seeka); /** \brief Given a matroska track number and type, find the id that mplayer would ask for. * \param d The demuxer for which the subtitle id should be returned. @@ -2989,12 +2989,15 @@ demuxer->flags |= DEMUXF_SEEKABLE; if (mkv_d->chapters && dvd_chapter>1 && dvd_chapter<=mkv_d->num_chapters) { + seek_args_t seeka; if (!mkv_d->has_first_tc) { mkv_d->first_tc = 0; mkv_d->has_first_tc = 1; } - mkv_seek (demuxer, mkv_d->chapters[dvd_chapter-1].start/1000.0, 1); + seeka.secs=mkv_d->chapters[dvd_chapter-1].start/1000.0; + seeka.flags=1; + mkv_seek (demuxer, &seeka); } } @@ -3473,7 +3476,7 @@ uint64_t old_length; int64_t tc; uint32_t *lace_size; - uint8_t laces, flags; + uint8_t laces=0, flags; int i, num, tmp, use_this_block = 1; float current_pts; int16_t time; @@ -3776,19 +3779,19 @@ return 0; } -static void mkv_seek (demuxer_t *demuxer, float rel_seek_secs, int flags) +static void mkv_seek (demuxer_t *demuxer,const seek_args_t* seeka) { free_cached_dps (demuxer); - if (!(flags & 2)) /* time in secs */ + if (!(seeka->flags & 2)) /* time in secs */ { mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv; stream_t *s = demuxer->stream; int64_t target_timecode = 0, diff, min_diff=0xFFFFFFFFFFFFFFFLL; int i; - if (!(flags & 1)) /* relative seek */ + if (!(seeka->flags & 1)) /* relative seek */ target_timecode = (int64_t) (mkv_d->last_pts * 1000.0); - target_timecode += (int64_t)(rel_seek_secs * 1000.0); + target_timecode += (int64_t)(seeka->secs * 1000.0); if (target_timecode < 0) target_timecode = 0; @@ -3832,12 +3835,12 @@ for (i=0; i < mkv_d->num_cluster_pos; i++) { diff = mkv_d->cluster_positions[i] - target_filepos; - if (rel_seek_secs < 0 && diff < 0 && -diff < min_diff) + if (seeka->secs < 0 && diff < 0 && -diff < min_diff) { cluster_pos = mkv_d->cluster_positions[i]; min_diff = -diff; } - else if (rel_seek_secs > 0 + else if (seeka->secs > 0 && (diff < 0 ? -1 * diff : diff) < min_diff) { cluster_pos = mkv_d->cluster_positions[i]; @@ -3850,10 +3853,10 @@ } else { - mkv_index_t *index = NULL; - int seek_id = (demuxer->video->id < 0) ? demuxer->audio->id : demuxer->video->id; + mkv_index_t *_index = NULL; + int seek_id = (demuxer->video->id < 0) ? demuxer->audio->id : demuxer->video->id; - /* let's find the entry in the indexes with the smallest */ + /* let's find the entry in the _indexes with the smallest */ /* difference to the wanted timecode. */ for (i=0; i < mkv_d->num_indexes; i++) if (mkv_d->indexes[i].tnum == seek_id) @@ -3861,15 +3864,15 @@ diff = target_timecode + mkv_d->first_tc - (int64_t) mkv_d->indexes[i].timecode * mkv_d->tc_scale / 1000000.0; - if ((flags & 1 || target_timecode <= mkv_d->last_pts*1000)) { - // SOF seek or seek backward: find the last index + if ((seeka->flags & 1 || target_timecode <= mkv_d->last_pts*1000)) { + // SOF seek or seek backward: find the last _index // position before target time if (diff < 0 || diff >= min_diff) continue; } else { - // Relative seek forward: find the first index position - // after target time. If no such index exists, find last + // Relative seek forward: find the first _index position + // after target time. If no such _index exists, find last // position between current position and target time. if (diff <= 0) { if (min_diff <= 0 && diff <= min_diff) @@ -3880,58 +3883,58 @@ continue; } min_diff = diff; - index = mkv_d->indexes + i; + _index = mkv_d->indexes + i; } - if (index) /* We've found an entry. */ + if (_index) /* We've found an entry. */ { mkv_d->cluster_size = mkv_d->blockgroup_size = 0; - stream_seek (s, index->filepos); + stream_seek (s, _index->filepos); } } if (demuxer->video->id >= 0) mkv_d->v_skip_to_keyframe = 1; - if (rel_seek_secs > 0.0) + if (seeka->secs > 0.0) mkv_d->skip_to_timecode = target_timecode; mkv_d->a_skip_to_keyframe = 1; mkv_demux(demuxer, NULL); } - else if ((demuxer->movi_end <= 0) || !(flags & 1)) + else if ((demuxer->movi_end <= 0) || !(seeka->flags & 1)) MSG_V( "[mkv] seek unsupported flags\n"); else { mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv; stream_t *s = demuxer->stream; uint64_t target_filepos; - mkv_index_t *index = NULL; + mkv_index_t *_index = NULL; int i; - if (mkv_d->indexes == NULL) /* no index was found */ + if (mkv_d->indexes == NULL) /* no _index was found */ { /* I'm lazy... */ MSG_V( "[mkv] seek unsupported flags\n"); return; } - target_filepos = (uint64_t)(demuxer->movi_end * rel_seek_secs); + target_filepos = (uint64_t)(demuxer->movi_end * seeka->secs); for (i=0; i < mkv_d->num_indexes; i++) if (mkv_d->indexes[i].tnum == demuxer->video->id) - if ((index == NULL) || + if ((_index == NULL) || ((mkv_d->indexes[i].filepos >= target_filepos) && - ((index->filepos < target_filepos) || - (mkv_d->indexes[i].filepos < index->filepos)))) - index = &mkv_d->indexes[i]; + ((_index->filepos < target_filepos) || + (mkv_d->indexes[i].filepos < _index->filepos)))) + _index = &mkv_d->indexes[i]; - if (!index) + if (!_index) return; mkv_d->cluster_size = mkv_d->blockgroup_size = 0; - stream_seek (s, index->filepos); + stream_seek (s, _index->filepos); if (demuxer->video->id >= 0) mkv_d->v_skip_to_keyframe = 1; - mkv_d->skip_to_timecode = index->timecode; + mkv_d->skip_to_timecode = _index->timecode; mkv_d->a_skip_to_keyframe = 1; mkv_demux(demuxer, NULL); Modified: mplayerxp/libmpdemux/demux_mov.c =================================================================== --- mplayerxp/libmpdemux/demux_mov.c 2012-10-17 17:33:30 UTC (rev 167) +++ mplayerxp/libmpdemux/demux_mov.c 2012-10-18 11:32:55 UTC (rev 168) @@ -639,9 +639,9 @@ // --- // optional additional atom-based fields // ([int32_t size,int32_t type,some data ],repeat) - } my_stdata; + } my_stdata; #endif - int version, adjust; + int version=0, adjust; int is_vorbis = 0; sh_audio_t* sh=new_sh_audio(demuxer,priv->track_db); sh->format=trak->fourcc; @@ -1070,7 +1070,7 @@ // AVC decoder configuration record MSG_V("MOV: AVC decoder configuration record atom (%d)!\n", atom_len); if(atom_len > 8) { - int i, poffs, cnt; + int i, poffs, cnt=0; // Parse some parts of avcC, just for fun :) // real parsing is done by avc1 decoder MSG_V("MOV: avcC version: %d\n", *(trak->stdata+pos+8)); @@ -1999,26 +1999,26 @@ ds_add_packet(ds,dp); } else ds_read_packet(ds,demuxer->stream,x,pts,pos,DP_NONKEYFRAME); - + ++trak->pos; return 1; - + } -static float mov_seek_track(mov_track_t* trak,float pts,int flags){ +static float mov_seek_track(mov_track_t* trak,const seek_args_t* seeka){ + float pts=seeka->secs; + pts*=(seeka->flags&DEMUX_SEEK_PERCENTS?trak->length:(float)trak->timescale); - pts*=(flags&DEMUX_SEEK_PERCENTS?trak->length:(float)trak->timescale); - if(trak->samplesize){ int sample=pts/trak->duration; - if(!(flags&DEMUX_SEEK_SET)) sample+=trak->chunks[trak->pos].sample; // relative + if(!(seeka->flags&DEMUX_SEEK_SET)) sample+=trak->chunks[trak->pos].sample; // relative trak->pos=0; while(trak->pos<trak->chunks_size && trak->chunks[trak->pos].sample<sample) ++trak->pos; if (trak->pos == trak->chunks_size) return -1; pts=(float)(trak->chunks[trak->pos].sample*trak->duration)/(float)trak->timescale; } else { unsigned int ipts; - if(!(flags&DEMUX_SEEK_SET)) pts+=trak->samples[trak->pos].pts; + if(!(seeka->flags&DEMUX_SEEK_SET)) pts+=trak->samples[trak->pos].pts; if(pts<0) pts=0; ipts=pts; for(trak->pos=0;trak->pos<trak->samples_size;++trak->pos){ @@ -2042,7 +2042,7 @@ return pts; } -static void mov_seek(demuxer_t *demuxer,float pts,int flags){ +static void mov_seek(demuxer_t *demuxer,const seek_args_t* seeka){ mov_priv_t* priv=demuxer->priv; demux_stream_t* ds; mov_track_t* trak; @@ -2052,10 +2052,10 @@ if (trak) { //if(flags&2) pts*=(float)trak->length/(float)trak->timescale; //if(!(flags&1)) pts+=ds->pts; - ds->pts=mov_seek_track(trak,pts,flags); + ds->pts=mov_seek_track(trak,seeka); if (ds->pts < 0) ds->eof = 1; - else pts = ds->pts; - flags=DEMUX_SEEK_SET|DEMUX_SEEK_SECONDS; +// else pts = ds->pts; +// flags=DEMUX_SEEK_SET|DEMUX_SEEK_SECONDS; } ds=demuxer->audio; @@ -2063,7 +2063,7 @@ if (trak) { //if(flags&2) pts*=(float)trak->length/(float)trak->timescale; //if(!(flags&1)) pts+=ds->pts; - ds->pts=mov_seek_track(trak,pts,flags); + ds->pts=mov_seek_track(trak,seeka); if (ds->pts < 0) ds->eof = 1; } } Modified: mplayerxp/libmpdemux/demux_mpg.c =================================================================== --- mplayerxp/libmpdemux/demux_mpg.c 2012-10-17 17:33:30 UTC (rev 167) +++ mplayerxp/libmpdemux/demux_mpg.c 2012-10-18 11:32:55 UTC (rev 168) @@ -546,24 +546,24 @@ return 1; } -static void mpgps_seek(demuxer_t *demuxer,float rel_seek_secs,int flags){ +static void mpgps_seek(demuxer_t *demuxer,const seek_args_t* seeka){ demux_stream_t *d_audio=demuxer->audio; demux_stream_t *d_video=demuxer->video; sh_audio_t *sh_audio=d_audio->sh; sh_video_t *sh_video=d_video->sh; //================= seek in MPEG ========================== - off_t newpos=(flags&DEMUX_SEEK_SET)?demuxer->movi_start:demuxer->filepos; + off_t newpos=(seeka->flags&DEMUX_SEEK_SET)?demuxer->movi_start:demuxer->filepos; - if(flags&DEMUX_SEEK_PERCENTS){ + if(seeka->flags&DEMUX_SEEK_PERCENTS){ // float seek 0..1 - newpos+=(demuxer->movi_end-demuxer->movi_start)*rel_seek_secs; + newpos+=(demuxer->movi_end-demuxer->movi_start)*seeka->secs; } else { // time seek (secs) if(!sh_video->i_bps) // unspecified or VBR - newpos+=2324*75*rel_seek_secs; // 174.3 kbyte/sec + newpos+=2324*75*seeka->secs; // 174.3 kbyte/sec else - newpos+=sh_video->i_bps*rel_seek_secs; + newpos+=sh_video->i_bps*seeka->secs; } if(newpos<demuxer->movi_start){ @@ -591,7 +591,7 @@ int i; if(sh_audio && !d_audio->eof && d_video->pts && d_audio->pts){ float a_pts=d_audio->pts; - a_pts+=(ds_tell_pts(d_audio)-sh_audio->a_in_buffer_len)/(float)sh_audio->i_bps; + a_pts+=(ds_tell_pts(d_audio)-sh_audio->a_in_buffer_len)/(float)sh_audio->i_bps; if(d_video->pts>a_pts){ skip_audio_frame(sh_audio); // sync audio continue; Modified: mplayerxp/libmpdemux/demux_mpxp64.c =================================================================== --- mplayerxp/libmpdemux/demux_mpxp64.c 2012-10-17 17:33:30 UTC (rev 167) +++ mplayerxp/libmpdemux/demux_mpxp64.c 2012-10-18 11:32:55 UTC (rev 168) @@ -794,16 +794,16 @@ } #define USE_INDEXES 1 -static void mpxpav64_seek(demuxer_t *demuxer,float rel_seek_secs,int flags){ +static void mpxpav64_seek(demuxer_t *demuxer,const seek_args_t* seeka){ mpxpav64_priv_t *priv=demuxer->priv; float brate=priv->fprop.AveBitrate; - off_t rel_seek_bytes=(flags&DEMUX_SEEK_PERCENTS)? - (rel_seek_secs*(demuxer->movi_end-demuxer->movi_start)): - (rel_seek_secs*brate); + off_t rel_seek_bytes=(seeka->flags&DEMUX_SEEK_PERCENTS)? + (seeka->secs*(demuxer->movi_end-demuxer->movi_start)): + (seeka->secs*brate); uint64_t newpos,cpos; int has_idx; cpos=stream_tell(demuxer->stream); - newpos=((flags&DEMUX_SEEK_SET)?demuxer->movi_start:demuxer->filepos)+rel_seek_bytes; + newpos=((seeka->flags&DEMUX_SEEK_SET)?demuxer->movi_start:demuxer->filepos)+rel_seek_bytes; MSG_V("MPXPAV64_SEEK: We want %016llX newpos\n",newpos); /* have indexes */ has_idx=0; Modified: mplayerxp/libmpdemux/demux_nsv.c =================================================================== --- mplayerxp/libmpdemux/demux_nsv.c 2012-10-17 17:33:30 UTC (rev 167) +++ mplayerxp/libmpdemux/demux_nsv.c 2012-10-18 11:32:55 UTC (rev 168) @@ -33,7 +33,7 @@ /** * Seeking still to be implemented */ -static void nsv_seek ( demuxer_t *demuxer, float rel_seek_secs, int flags ) +static void nsv_seek ( demuxer_t *demuxer, const seek_args_t* seeka ) { // seeking is not yet implemented } Modified: mplayerxp/libmpdemux/demux_nuv.c =================================================================== --- mplayerxp/libmpdemux/demux_nuv.c 2012-10-17 17:33:30 UTC (rev 167) +++ mplayerxp/libmpdemux/demux_nuv.c 2012-10-18 11:32:55 UTC (rev 168) @@ -51,7 +51,7 @@ /** * Seek to a position relative to the current position, indicated in time. */ -static void nuv_seek ( demuxer_t *demuxer, float rel_seek_secs, int flags ) +static void nuv_seek ( demuxer_t *demuxer, const seek_args_t* seeka ) { #define MAX_TIME 1000000 nuv_priv_t* priv = demuxer->priv; @@ -60,11 +60,11 @@ off_t curr_pos; float current_time = 0; float start_time = MAX_TIME; - float target_time = start_time + rel_seek_secs * 1000; /* target_time, start_time are ms, rel_seek_secs s */ + float target_time = start_time + seeka->secs * 1000; /* target_time, start_time are ms, rel_seek_secs s */ orig_pos = stream_tell ( demuxer->stream ); - if ( rel_seek_secs > 0 ) + if ( seeka->secs > 0 ) { /* Seeking forward */ @@ -88,7 +88,7 @@ { start_time = rtjpeg_frameheader.timecode; /* Recalculate target time with real start time */ - target_time = start_time + rel_seek_secs*1000; + target_time = start_time + seeka->secs*1000; } current_time = rtjpeg_frameheader.timecode; @@ -104,7 +104,7 @@ { start_time = rtjpeg_frameheader.timecode; /* Recalculate target time with real start time */ - target_time = start_time + rel_seek_secs * 1000; + target_time = start_time + seeka->secs * 1000; } current_time = rtjpeg_frameheader.timecode; @@ -121,7 +121,7 @@ start_time = priv->current_position->time; /* Recalculate target time with real start time */ - target_time = start_time + rel_seek_secs * 1000; + target_time = start_time + seeka->secs * 1000; if(target_time < 0) Modified: mplayerxp/libmpdemux/demux_ogg.c =================================================================== --- mplayerxp/libmpdemux/demux_ogg.c 2012-10-17 17:33:30 UTC (rev 167) +++ mplayerxp/libmpdemux/demux_ogg.c 2012-10-18 11:32:55 UTC (rev 168) @@ -1250,7 +1250,7 @@ } -static void ogg_seek(demuxer_t *demuxer,float rel_seek_secs,int flags) { +static void ogg_seek(demuxer_t *demuxer,const seek_args_t* seeka) { ogg_demuxer_t* ogg_d = demuxer->priv; ogg_sync_state* sync = &ogg_d->sync; ogg_page* page= &ogg_d->page; @@ -1294,14 +1294,14 @@ old_pos = ogg_d->pos; //calculate the granulepos to seek to - gp = flags & DEMUX_SEEK_SET ? 0 : os->lastpos; - if(flags & DEMUX_SEEK_PERCENTS) { + gp = seeka->flags & DEMUX_SEEK_SET ? 0 : os->lastpos; + if(seeka->flags & DEMUX_SEEK_PERCENTS) { if (ogg_d->final_granulepos > 0) - gp += ogg_d->final_granulepos * rel_seek_secs; + gp += ogg_d->final_granulepos * seeka->secs; else - gp += rel_seek_secs * (demuxer->movi_end - demuxer->movi_start) * os->lastpos / ogg_d->pos; + gp += seeka->secs * (demuxer->movi_end - demuxer->movi_start) * os->lastpos / ogg_d->pos; } else - gp += rel_seek_secs * rate; + gp += seeka->secs * rate; if (gp < 0) gp = 0; //calculate the filepos to seek to @@ -1320,14 +1320,14 @@ pos = ogg_d->syncpoints[sp].page_pos; precision = 0; } else { - pos = flags & DEMUX_SEEK_SET ? 0 : ogg_d->pos; - if(flags & DEMUX_SEEK_PERCENTS) - pos += (demuxer->movi_end - demuxer->movi_start) * rel_seek_secs; + pos = seeka->flags & DEMUX_SEEK_SET ? 0 : ogg_d->pos; + if(seeka->flags & DEMUX_SEEK_PERCENTS) + pos += (demuxer->movi_end - demuxer->movi_start) * seeka->secs; else { if (ogg_d->final_granulepos > 0) { - pos += rel_seek_secs * (demuxer->movi_end - demuxer->movi_start) / (ogg_d->final_granulepos / rate); + pos += seeka->secs * (demuxer->movi_end - demuxer->movi_start) / (ogg_d->final_granulepos / rate); } else if (os->lastpos > 0) { - pos += rel_seek_secs * ogg_d->pos / (os->lastpos / rate); + pos += seeka->secs * ogg_d->pos / (os->lastpos / rate); } } if (pos < 0) pos = 0; Modified: mplayerxp/libmpdemux/demux_pva.c =================================================================== --- mplayerxp/libmpdemux/demux_pva.c 2012-10-17 17:33:30 UTC (rev 167) +++ mplayerxp/libmpdemux/demux_pva.c 2012-10-18 11:32:55 UTC (rev 168) @@ -471,7 +471,7 @@ return 1; } -static void pva_seek(demuxer_t * demuxer,float rel_seek_secs,int flags) +static void pva_seek(demuxer_t * demuxer,const seek_args_t* seeka) { int total_bitrate=0; off_t dest_offset; @@ -487,7 +487,7 @@ * If the calculated SOF offset is negative, seek to the beginning of the file. */ - dest_offset=(flags&DEMUX_SEEK_SET?demuxer->movi_start:stream_tell(demuxer->stream))+rel_seek_secs*total_bitrate; + dest_offset=(seeka->flags&DEMUX_SEEK_SET?demuxer->movi_start:stream_tell(demuxer->stream))+seeka->secs*total_bitrate; if(dest_offset<0) dest_offset=0; stream_seek(demuxer->stream,dest_offset); Modified: mplayerxp/libmpdemux/demux_ra.c =================================================================== --- mplayerxp/libmpdemux/demux_ra.c 2012-10-17 17:33:30 UTC (rev 167) +++ mplayerxp/libmpdemux/demux_ra.c 2012-10-18 11:32:55 UTC (rev 168) @@ -287,7 +287,7 @@ #if 0 /* please upload RV10 samples WITH INDEX CHUNK */ -int demux_seek_ra(demuxer_t *demuxer, float rel_seek_secs, int flags) +int demux_seek_ra(demuxer_t *demuxer,const seek_args_t* seeka) { real_priv_t *priv = demuxer->priv; demux_stream_t *d_audio = demuxer->audio; Modified: mplayerxp/libmpdemux/demux_rawaudio.c =================================================================== --- mplayerxp/libmpdemux/demux_rawaudio.c 2012-10-17 17:33:30 UTC (rev 167) +++ mplayerxp/libmpdemux/demux_rawaudio.c 2012-10-18 11:32:55 UTC (rev 168) @@ -92,13 +92,13 @@ return 1; } -static void rawaudio_seek(demuxer_t *demuxer,float rel_seek_secs,int flags){ +static void rawaudio_seek(demuxer_t *demuxer,const seek_args_t* seeka){ stream_t* s = demuxer->stream; sh_audio_t* sh_audio = demuxer->audio->sh; off_t base,pos; - base = (flags & DEMUX_SEEK_SET) ? demuxer->movi_start : stream_tell(s); - pos=base+(flags&DEMUX_SEEK_PERCENTS?demuxer->movi_end-demuxer->movi_start:sh_audio->i_bps)*rel_seek_secs; + base = (seeka->flags & DEMUX_SEEK_SET) ? demuxer->movi_start : stream_tell(s); + pos=base+(seeka->flags&DEMUX_SEEK_PERCENTS?demuxer->movi_end-demuxer->movi_start:sh_audio->i_bps)*seeka->secs; pos -= (pos % (sh_audio->channels * sh_audio->samplesize) ); stream_seek(s,pos); resync_audio_stream(sh_audio); Modified: mplayerxp/libmpdemux/demux_rawvideo.c =================================================================== --- mplayerxp/libmpdemux/demux_rawvideo.c 2012-10-17 17:33:30 UTC (rev 167) +++ mplayerxp/libmpdemux/demux_rawvideo.c 2012-10-18 11:32:55 UTC (rev 168) @@ -128,13 +128,13 @@ return 1; } -static void rawvideo_seek(demuxer_t *demuxer,float rel_seek_secs,int flags){ +static void rawvideo_seek(demuxer_t *demuxer,const seek_args_t* seeka){ stream_t* s = demuxer->stream; sh_video_t* sh_video = demuxer->video->sh; off_t pos; - pos =(flags & DEMUX_SEEK_SET)?demuxer->movi_start:stream_tell(s); - pos+=(flags&DEMUX_SEEK_PERCENTS?demuxer->movi_end-demuxer->movi_start:sh_video->i_bps)*rel_seek_secs; + pos =(seeka->flags & DEMUX_SEEK_SET)?demuxer->movi_start:stream_tell(s); + pos+=(seeka->flags&DEMUX_SEEK_PERCENTS?demuxer->movi_end-demuxer->movi_start:sh_video->i_bps)*seeka->secs; pos/=imgsize; stream_seek(s,pos*imgsize); sh_video->timer=pos * sh_video->frametime; Modified: mplayerxp/libmpdemux/demux_real.c =================================================================== --- mplayerxp/libmpdemux/demux_real.c 2012-10-17 17:33:30 UTC (rev 167) +++ mplayerxp/libmpdemux/demux_real.c 2012-10-18 11:32:55 UTC (rev 168) @@ -1499,7 +1499,7 @@ } /* please upload RV10 samples WITH INDEX CHUNK */ -static void real_seek(demuxer_t *demuxer, float rel_seek_secs, int flags) +static void real_seek(demuxer_t *demuxer,const seek_args_t* seeka) { real_priv_t *priv = demuxer->priv; demux_stream_t *d_audio = demuxer->audio; @@ -1523,7 +1523,7 @@ if (!streams) return; - if (flags & DEMUX_SEEK_SET) + if (seeka->flags & DEMUX_SEEK_SET) /* seek SOF */ priv->current_apacket = priv->current_vpacket = 0; @@ -1533,52 +1533,52 @@ priv->current_apacket = priv->index_table_size[aid] - 1; // if (index_mode == 1 || index_mode == 2) { - if (streams & 1) {// use the video index if we have one + if (streams & 1) {// use the video index if we have one cur_timestamp = priv->index_table[vid][priv->current_vpacket].timestamp; - if (rel_seek_secs > 0) - while ((priv->index_table[vid][priv->current_vpacket].timestamp - cur_timestamp) < rel_seek_secs * 1000){ - priv->current_vpacket += 1; - if (priv->current_vpacket >= priv->index_table_size[vid]) { - priv->current_vpacket = priv->index_table_size[vid] - 1; + if (seeka->secs > 0) + while ((priv->index_table[vid][priv->current_vpacket].timestamp - cur_timestamp) < seeka->secs * 1000){ + priv->current_vpacket += 1; + if (priv->current_vpacket >= priv->index_table_size[vid]) { + priv->current_vpacket = priv->index_table_size[vid] - 1; if (!retried) { stream_seek(demuxer->stream, priv->index_table[vid][priv->current_vpacket].offset); - add_index_segment(demuxer, vid, cur_timestamp + rel_seek_secs * 1000); + add_index_segment(demuxer, vid, cur_timestamp + seeka->secs * 1000); retried = 1; } else - break; - } - } - else if (rel_seek_secs < 0) - while ((cur_timestamp - priv->index_table[vid][priv->current_vpacket].timestamp) < - rel_seek_secs * 1000){ - priv->current_vpacket -= 1; - if (priv->current_vpacket < 0) { - priv->current_vpacket = 0; - break; - } - } + break; + } + } + else if (seeka->secs < 0) + while ((cur_timestamp - priv->index_table[vid][priv->current_vpacket].timestamp) < - seeka->secs * 1000){ + priv->current_vpacket -= 1; + if (priv->current_vpacket < 0) { + priv->current_vpacket = 0; + break; + } + } next_offset = priv->index_table[vid][priv->current_vpacket].offset; priv->audio_need_keyframe = 1; priv->video_after_seek = 1; - } - else if (streams & 2) { - cur_timestamp = priv->index_table[aid][priv->current_apacket].timestamp; - if (rel_seek_secs > 0) - while ((priv->index_table[aid][priv->current_apacket].timestamp - cur_timestamp) < rel_seek_secs * 1000){ - priv->current_apacket += 1; - if (priv->current_apacket >= priv->index_table_size[aid]) { - priv->current_apacket = priv->index_table_size[aid] - 1; - break; - } - } - else if (rel_seek_secs < 0) - while ((cur_timestamp - priv->index_table[aid][priv->current_apacket].timestamp) < - rel_seek_secs * 1000){ - priv->current_apacket -= 1; - if (priv->current_apacket < 0) { - priv->current_apacket = 0; - break; - } - } + } + else if (streams & 2) { + cur_timestamp = priv->index_table[aid][priv->current_apacket].timestamp; + if (seeka->secs > 0) + while ((priv->index_table[aid][priv->current_apacket].timestamp - cur_timestamp) < seeka->secs * 1000){ + priv->current_apacket += 1; + if (priv->current_apacket >= priv->index_table_size[aid]) { + priv->current_apacket = priv->index_table_size[aid] - 1; + break; + } + } + else if (seeka->secs < 0) + while ((cur_timestamp - priv->index_table[aid][priv->current_apacket].timestamp) < - seeka->secs * 1000){ + priv->current_apacket -= 1; + if (priv->current_apacket < 0) { + priv->current_apacket = 0; + break; + } + } next_offset = priv->index_table[aid][priv->current_apacket].offset; } // } Modified: mplayerxp/libmpdemux/demux_smjpeg.c =================================================================== --- mplayerxp/libmpdemux/demux_smjpeg.c 2012-10-17 17:33:30 UTC (rev 167) +++ mplayerxp/libmpdemux/demux_smjpeg.c 2012-10-18 11:32:55 UTC (rev 168) @@ -166,7 +166,7 @@ } demuxer->flags &= ~DEMUXF_SEEKABLE; - + return demuxer; } Modified: mplayerxp/libmpdemux/demux_ts.c =================================================================== --- mplayerxp/libmpdemux/demux_ts.c 2012-10-17 17:33:30 UTC (rev 167) +++ mplayerxp/libmpdemux/demux_ts.c 2012-10-18 11:32:55 UTC (rev 168) @@ -3059,7 +3059,7 @@ extern int sync_video_packet(demux_stream_t *); extern int skip_video_packet(demux_stream_t *); -static void ts_seek(demuxer_t *demuxer, float rel_seek_secs, int flags) +static void ts_seek(demuxer_t *demuxer,const seek_args_t* seeka) { demux_stream_t *d_audio=demuxer->audio; demux_stream_t *d_video=demuxer->video; @@ -3094,16 +3094,16 @@ video_stats = sh_video->i_bps; } - newpos = (flags & DEMUX_SEEK_SET) ? demuxer->movi_start : demuxer->filepos; - if(flags & DEMUX_SEEK_PERCENTS) // float seek 0..1 - newpos+=(demuxer->movi_end-demuxer->movi_start)*rel_seek_secs; + newpos = (seeka->flags & DEMUX_SEEK_SET) ? demuxer->movi_start : demuxer->filepos; + if(seeka->flags & DEMUX_SEEK_PERCENTS) // float seek 0..1 + newpos+=(demuxer->movi_end-demuxer->movi_start)*seeka->secs; else { // time seek (secs) if(! video_stats) // unspecified or VBR - newpos += 2324*75*rel_seek_secs; // 174.3 kbyte/sec + newpos += 2324*75*seeka->secs; // 174.3 kbyte/sec else - newpos += video_stats*rel_seek_secs; + newpos += video_stats*seeka->secs; } Modified: mplayerxp/libmpdemux/demux_ty.c =================================================================== --- mplayerxp/libmpdemux/demux_ty.c 2012-10-17 17:33:30 UTC (rev 167) +++ mplayerxp/libmpdemux/demux_ty.c 2012-10-18 11:32:55 UTC (rev 168) @@ -744,7 +744,7 @@ return 1; } -static void ty_seek( demuxer_t *demuxer, float rel_seek_secs, int flags ) +static void ty_seek( demuxer_t *demuxer, const seek_args_t* seeka ) { demux_stream_t *d_audio = demuxer->audio; demux_stream_t *d_video = demuxer->video; @@ -763,24 +763,24 @@ //================= seek in MPEG ========================== demuxer->filepos = stream_tell( demuxer->stream ); - newpos = ( flags & 1 ) ? demuxer->movi_start : demuxer->filepos; + newpos = ( seeka->flags & 1 ) ? demuxer->movi_start : demuxer->filepos; - if( flags & 2 ) + if( seeka->flags & 2 ) // float seek 0..1 - newpos += ( demuxer->movi_end - demuxer->movi_start ) * rel_seek_secs; + newpos += ( demuxer->movi_end - demuxer->movi_start ) * seeka->secs; else { // time seek (secs) if( ! sh_video->i_bps ) // unspecified or VBR - newpos += 2324 * 75 * rel_seek_secs; // 174.3 kbyte/sec + newpos += 2324 * 75 * seeka->secs; // 174.3 kbyte/sec else - newpos += sh_video->i_bps * rel_seek_secs; + newpos += sh_video->i_bps * seeka->secs; } if ( newpos < demuxer->movi_start ) newpos = demuxer->movi_start; res = newpos / CHUNKSIZE; - if ( rel_seek_secs >= 0 ) + if ( seeka->secs >= 0 ) newpos = ( res + 1 ) * CHUNKSIZE; else newpos = res * CHUNKSIZE; Modified: mplayerxp/libmpdemux/demux_vqf.c =================================================================== --- mplayerxp/libmpdemux/demux_vqf.c 2012-10-17 17:33:30 UTC (rev 167) +++ mplayerxp/libmpdemux/demux_vqf.c 2012-10-18 11:32:55 UTC (rev 168) @@ -203,13 +203,13 @@ return 1; } -static void vqf_seek(demuxer_t *demuxer,float rel_seek_secs,int flags){ +static void vqf_seek(demuxer_t *demuxer,const seek_args_t* seeka){ stream_t* s = demuxer->stream; sh_audio_t* sh_audio = demuxer->audio->sh; off_t base,pos; - base = (flags&DEMUX_SEEK_SET) ? demuxer->movi_start : stream_tell(s); - pos=base+(flags&DEMUX_SEEK_PERCENTS?demuxer->movi_end-demuxer->movi_start:sh_audio->i_bps)*rel_seek_secs; + base = (seeka->flags&DEMUX_SEEK_SET) ? demuxer->movi_start : stream_tell(s); + pos=base+(seeka->flags&DEMUX_SEEK_PERCENTS?demuxer->movi_end-demuxer->movi_start:sh_audio->i_bps)*seeka->secs; pos -= (pos % (sh_audio->channels * sh_audio->samplesize) ); stream_seek(s,pos); resync_audio_stream(sh_audio); Modified: mplayerxp/libmpdemux/demux_y4m.c =================================================================== --- mplayerxp/libmpdemux/demux_y4m.c 2012-10-17 17:33:30 UTC (rev 167) +++ mplayerxp/libmpdemux/demux_y4m.c 2012-10-18 11:32:55 UTC (rev 168) @@ -228,10 +228,10 @@ return demuxer; } -static void y4m_seek(demuxer_t *demuxer, float rel_seek_secs, int flags) { +static void y4m_seek(demuxer_t *demuxer,const seek_args_t* seeka) { sh_video_t* sh = demuxer->video->sh; y4m_priv_t* priv = demuxer->priv; - int rel_seek_frames = sh->fps*rel_seek_secs; + int rel_seek_frames = sh->fps*seeka->secs; int size = 3*sh->disp_w*sh->disp_h/2; off_t curr_pos = stream_tell(demuxer->stream); Modified: mplayerxp/libmpdemux/demuxer.c =================================================================== --- mplayerxp/libmpdemux/demuxer.c 2012-10-17 17:33:30 UTC (rev 167) +++ mplayerxp/libmpdemux/demuxer.c 2012-10-18 11:32:55 UTC (rev 168) @@ -642,7 +642,7 @@ return vd; } -int demux_seek(demuxer_t *demuxer,float rel_seek_secs,int flags){ +int demux_seek(demuxer_t *demuxer,const seek_args_t* seeka){ demux_stream_t *d_audio=demuxer->audio; demux_stream_t *d_video=demuxer->video; sh_audio_t *sh_audio=d_audio->sh; @@ -662,7 +662,7 @@ // clear demux buffers: if(sh_audio){ ds_free_packs(d_audio);sh_audio->a_buffer_len=0;} ds_free_packs(d_video); - + stream_set_eof(demuxer->stream,0); // clear eof flag demuxer->video->eof=0; demuxer->audio->eof=0; @@ -675,7 +675,7 @@ if(sh_audio) sh_audio->timer=0; if(sh_video) sh_video->timer=0; // !!!!!! #endif - if(demuxer->driver->seek) demuxer->driver->seek(demuxer,rel_seek_secs,flags); + if(demuxer->driver->seek) demuxer->driver->seek(demuxer,seeka); else MSG_WARN("Demuxer seek error\n"); return 1; } Modified: mplayerxp/libmpdemux/demuxer.h =================================================================== --- mplayerxp/libmpdemux/demuxer.h 2012-10-17 17:33:30 UTC (rev 167) +++ mplayerxp/libmpdemux/demuxer.h 2012-10-18 11:32:55 UTC (rev 168) @@ -130,6 +130,15 @@ #define DEMUX_FALSE 0 #define DEMUX_OK 1 +#define DEMUX_SEEK_CUR 0x00 +#define DEMUX_SEEK_SET 0x01 +#define DEMUX_SEEK_SECONDS 0x00 +#define DEMUX_SEEK_PERCENTS 0x02 +typedef struct seek_args_s { + float secs; + unsigned flags; +}seek_args_t; + /* Commands for control interface */ #define DEMUX_CMD_SWITCH_AUDIO 1 #define DEMUX_CMD_SWITCH_VIDEO 2 @@ -161,7 +170,7 @@ * @param flags 0x01 - seek from start else seek_cur, 0x02 - rel_seek_secs indicates pos in percents/100 else in seconds * @note this function is optional and maybe NULL **/ - void (*seek)(demuxer_t *d,float rel_seek_secs,int flags); + void (*seek)(demuxer_t *d,const seek_args_t* seeka); /** Closes driver * @param d _this demuxer **/ @@ -258,11 +267,7 @@ } demuxer_t* demux_open(stream_t *stream,int file_format,int aid,int vid,int sid); -#define DEMUX_SEEK_CUR 0x00 -#define DEMUX_SEEK_SET 0x01 -#define DEMUX_SEEK_SECONDS 0x00 -#define DEMUX_SEEK_PERCENTS 0x02 -int demux_seek(demuxer_t *demuxer,float rel_seek_secs,int flags); +int demux_seek(demuxer_t *demuxer,const seek_args_t* seeka); demuxer_t* new_demuxers_demuxer(demuxer_t* vd, demuxer_t* ad, demuxer_t* sd); /* AVI demuxer params: */ Modified: mplayerxp/libmpdemux/demuxer_r.c =================================================================== --- mplayerxp/libmpdemux/demuxer_r.c 2012-10-17 17:33:30 UTC (rev 167) +++ mplayerxp/libmpdemux/demuxer_r.c 2012-10-18 11:32:55 UTC (rev 168) @@ -147,7 +147,7 @@ /* TODO : FIXME we need to redesign blocking of mutexes before enabling this function*/ -int demux_seek_r(demuxer_t *demuxer,float rel_seek_secs,int flags) +int demux_seek_r(demuxer_t *demuxer,const seek_args_t* seeka) { int retval; unsigned int t=0; @@ -155,7 +155,7 @@ double tt; // LOCK_DEMUXER(); if(benchmark) t=GetTimer(); - retval = demux_seek(demuxer,rel_seek_secs,flags); + retval = demux_seek(demuxer,seeka); if(benchmark) { t2=GetTimer();t=t2-t; Modified: mplayerxp/libmpdemux/demuxer_r.h =================================================================== --- mplayerxp/libmpdemux/demuxer_r.h 2012-10-17 17:33:30 UTC (rev 167) +++ mplayerxp/libmpdemux/demuxer_r.h 2012-10-18 11:32:55 UTC (rev 168) @@ -22,7 +22,7 @@ extern int demux_read_data_r(demux_stream_t *ds,unsigned char* mem,int len,float *pts); extern int ds_get_packet_r(demux_stream_t *ds,unsigned char **start,float *pts); -extern int demux_seek_r(demuxer_t *demuxer,float rel_seek_secs,int flags); +extern int demux_seek_r(demuxer_t *demuxer,const seek_args_t* seeka); extern int demuxer_switch_audio_r(demuxer_t *, int id); extern int demuxer_switch_video_r(demuxer_t *, int id); Modified: mplayerxp/mplayer.c =================================================================== --- mplayerxp/mplayer.c 2012-10-17 17:33:30 UTC (rev 167) +++ mplayerxp/mplayer.c 2012-10-18 11:32:55 UTC (rev 168) @@ -1581,6 +1581,11 @@ fflush(stdout); } +typedef struct osd_args_s { + int visible; + int info_factor; +}osd_args_t; + int xp_decore_video( int rtc_fd, video_stat_t *vstat, float *aq_sleep_time, float *v_pts ) { float time_frame=0; @@ -1815,12 +1820,12 @@ return 0; } -void mpxp_seek( int _xp_id, video_stat_t *vstat, int *osd_visible,float v_pts,float pos,int flags) +void mpxp_seek( int _xp_id, video_stat_t *vstat, osd_args_t *osd,float v_pts,const seek_args_t* seek) { int seek_rval=1; audio_eof=0; - if(pos || flags&DEMUX_SEEK_SET) { - seek_rval=demux_seek_r(demuxer,pos,flags); + if(seek->secs || seek->flags&DEMUX_SEEK_SET) { + seek_rval=demux_seek_r(demuxer,seek); mpxp_after_seek=25; /* 1 sec delay */ } if(seek_rval){ @@ -1875,7 +1880,7 @@ if(osd_level){ int len=((demuxer->movi_end-demuxer->movi_start)>>8); if (len>0){ - if(osd_visible) *osd_visible=sh_video->fps<=60?sh_video->fps:25; + if(osd) osd->visible=sh_video->fps<=60?sh_video->fps:25; vo.osd_progbar_type=0; vo.osd_progbar_value=(demuxer->filepos-demuxer->movi_start)/len; vo_osd_changed(OSDTYPE_PROGBAR); @@ -1885,7 +1890,7 @@ if(sh_video) { c_total=0; max_pts_correction=0.1; - if(osd_visible) *osd_visible=sh_video->fps<=60?sh_video->fps:25; // to rewert to PLAY pointer after 1 sec + if(osd) osd->visible=sh_video->fps<=60?sh_video->fps:25; // to rewert to PLAY pointer after 1 sec audio_time_usage=0; audio_decode_time_usage=0; video_time_usage=0; vout_time_usage=0; if(vstat) { @@ -1906,8 +1911,9 @@ void mpxp_reset_vcache(void) { unsigned i; + seek_args_t seek = { 0, DEMUX_SEEK_CUR|DEMUX_SEEK_SECONDS }; for(i=0;i<xp_threads;i++) if(strcmp(pinfo[i].thread_name,"main")==0) break; - if(shva) mpxp_seek(i,NULL,NULL,shva[dec_ahead_active_frame].v_pts,0,DEMUX_SEEK_CUR|DEMUX_SEEK_SECONDS); + if(shva) mpxp_seek(i,NULL,NULL,shva[dec_ahead_active_frame].v_pts,&seek); return; } @@ -2057,7 +2063,7 @@ // for multifile support: play_tree_iter_t* playtree_iter = NULL; -static void init_keyboard_fifo(void) +static void mpxp_init_keyboard_fifo(void) { #ifdef HAVE_TERMCAP load_termcap(NULL); // load key-codes @@ -2075,7 +2081,7 @@ inited_flags|=INITED_INPUT; } -static void init_fond_menu_osd(void) { +static void mpxp_init_osd(void) { // check font #ifdef USE_OSD if(font_name){ @@ -2106,7 +2112,7 @@ vo_init_osd(); } -static void init_output_sub_systems(void) { +static void mpxp_init_output_subsystems(void) { unsigned i; // check video_out driver name: if (video_driver) @@ -2155,7 +2161,7 @@ } } -static int init_vobsub(const char *filename) { +static int mpxp_init_vobsub(const char *filename) { int forced_subs_only=0; pinfo[xp_id].current_module="vobsub"; if (vobsub_name){ @@ -2181,9 +2187,44 @@ sub_auto=0; // don't do autosub for textsubs if vobsub found inited_flags|=INITED_VOBSUB; } + return forced_subs_only; } -static void init_nls(void) { +static int mpxp_handle_playlist(const char *filename) { + int eof=0; + play_tree_t* entry; + // Handle playlist + pinfo[xp_id].current_module="handle_playlist"; + MSG_V("Parsing playlist %s...\n",filename); + entry = parse_playtree(stream); + if(!entry) { + entry = playtree_iter->tree; + if(play_tree_iter_step(playtree_iter,1,0) != PLAY_TREE_ITER_ENTRY) { + eof = PT_NEXT_ENTRY; + return eof; + } + if(playtree_iter->tree == entry ) { // Loop with a single file + if(play_tree_iter_up_step(playtree_iter,1,0) != PLAY_TREE_ITER_ENTRY) { + eof = PT_NEXT_ENTRY; + return eof; + } + } + play_tree_remove(entry,1,1); + eof = PT_NEXT_SRC; + return eof; + } + play_tree_insert_entry(playtree_iter->tree,entry); + entry = playtree_iter->tree; + if(play_tree_iter_step(playtree_iter,1,0) != PLAY_TREE_ITER_ENTRY) { + eof = PT_NEXT_ENTRY; + return eof; + } + play_tree_remove(entry,1,1); + eof = PT_NEXT_SRC; + return eof; +} + +static void mpxp_init_dvd_nls(void) { /* Add NLS support here */ char *lang; if(!audio_lang) audio_lang=nls_get_screen_cp(); @@ -2207,7 +2248,7 @@ } #ifdef HAVE_LIBCSS -static void init_dvd_key(void) { +static void mpxp_init_dvdkey(void) { pinfo[xp_id].current_module="libcss"; if (dvdimportkey) { if (dvd_import_key(dvdimportkey)) { @@ -2226,242 +2267,22 @@ } #endif -/******************************************\ -* MAIN MPLAYERXP FUNCTION !!! * -\******************************************/ -int main(int argc,char* argv[], char *envp[]){ - -int stream_dump_type=0; -int after_dvdmenu=0; -char* filename=NULL; //"MI2-Trailer.avi"; -int file_format=DEMUXER_TYPE_UNKNOWN; -int (*decore_video_ptr)( int rtc_fd, video_stat_t *vstat, float *aq_sleep_time, float *v_pts ) - = mp09_decore_video; - -// movie info: -int eof=0; - -int osd_visible=100; -int osd_info_factor=9; -video_stat_t vstat; -int rtc_fd=-1; -int i; -int forced_subs_only=0; -float seek_secs=0; -int seek_flags=DEMUX_SEEK_CUR|DEMUX_SEEK_SECONDS; - - vo_preinit_structs(); - - mplayer_pid= - pinfo[xp_id].pid=getpid(); - mplayer_pth_id= - pinfo[xp_id].pth_id=pthread_self(); - pinfo[xp_id].thread_name = "main"; - memset(&vstat,0,sizeof(video_stat_t)); - - mp_msg_init(MSGL_STATUS); - MSG_INFO("%s",banner_text); -// memset(&vtune,0,sizeof(vo_tune_info_t)); - /* Test for cpu capabilities (and corresponding OS support) for optimizing */ - - playtree = play_tree_new(); - - mconfig = m_config_new(playtree); - m_config_register_options(mconfig,mplayer_opts); - // TODO : add something to let modules register their options - mp_register_options(mconfig); - parse_cfgfiles(mconfig); - - if(m_config_parse_command_line(mconfig, argc, argv, envp) < 0) exit(1); // error parsing cmdline - - xp_num_cpu=get_number_cpu(); -#if defined( ARCH_X86 ) || defined(ARCH_X86_64) - get_mmx_optimizations(); -#endif - if(!sws_init()) { - MSG_ERR("MPlayerXP requires working copy of libswscaler\n"); - return 0; - } - if(shuffle_playback) playtree->flags|=PLAY_TREE_RND; - else playtree->flags&=~PLAY_TREE_RND; - pla... [truncated message content] |