[Mplayerxp-cvslog] SF.net SVN: mplayerxp:[506] mplayerxp
Brought to you by:
olov
From: <nic...@us...> - 2012-12-04 12:36:09
|
Revision: 506 http://mplayerxp.svn.sourceforge.net/mplayerxp/?rev=506&view=rev Author: nickols_k Date: 2012-12-04 12:35:59 +0000 (Tue, 04 Dec 2012) Log Message: ----------- move xp_core into MPXPContext Modified Paths: -------------- mplayerxp/libao2/ao_wav.cpp mplayerxp/libmpcodecs/dec_audio.cpp mplayerxp/libmpcodecs/dec_video.cpp mplayerxp/libmpdemux/demuxer_r.cpp mplayerxp/libmpstream/cache2.cpp mplayerxp/libmpsub/spudec.cpp mplayerxp/libvo/sub.cpp mplayerxp/libvo/video_out.cpp mplayerxp/mplayerxp.cpp mplayerxp/mplayerxp.h mplayerxp/postproc/vf.cpp mplayerxp/xmpcore/sig_hand.cpp mplayerxp/xmpcore/sig_hand.h mplayerxp/xmpcore/xmp_adecoder.cpp mplayerxp/xmpcore/xmp_aplayer.cpp mplayerxp/xmpcore/xmp_core.cpp mplayerxp/xmpcore/xmp_core.h mplayerxp/xmpcore/xmp_vdecoder.cpp mplayerxp/xmpcore/xmp_vplayer.cpp Modified: mplayerxp/libao2/ao_wav.cpp =================================================================== --- mplayerxp/libao2/ao_wav.cpp 2012-12-04 11:26:21 UTC (rev 505) +++ mplayerxp/libao2/ao_wav.cpp 2012-12-04 12:35:59 UTC (rev 506) @@ -222,7 +222,7 @@ // return: how many bytes can be played without blocking static unsigned get_space(const ao_data_t* ao){ priv_t* priv=reinterpret_cast<priv_t*>(ao->priv); - float pts=dae_played_frame(xp_core->video).v_pts; + float pts=dae_played_frame(mpxp_context().engine().xp_core->video).v_pts; if(pts) return ao->pts < pts + priv->fast * 30000 ? ao->outburst : 0; return ao->outburst; Modified: mplayerxp/libmpcodecs/dec_audio.cpp =================================================================== --- mplayerxp/libmpcodecs/dec_audio.cpp 2012-12-04 11:26:21 UTC (rev 505) +++ mplayerxp/libmpcodecs/dec_audio.cpp 2012-12-04 12:35:59 UTC (rev 506) @@ -154,9 +154,9 @@ warned=1; MSG_WARN(MSGTR_CODEC_INITAL_AV_RESYNC); } - } else if(xp_core->initial_apts_corr.need_correction==1) { - xp_core->initial_apts += ((float)(xp_core->initial_apts_corr.pts_bytes-xp_core->initial_apts_corr.nbytes))/(float)sh_audio->i_bps; - xp_core->initial_apts_corr.need_correction=0; + } else if(mpxp_context().engine().xp_core->initial_apts_corr.need_correction==1) { + mpxp_context().engine().xp_core->initial_apts += ((float)(mpxp_context().engine().xp_core->initial_apts_corr.pts_bytes-mpxp_context().engine().xp_core->initial_apts_corr.nbytes))/(float)sh_audio->i_bps; + mpxp_context().engine().xp_core->initial_apts_corr.need_correction=0; } MSG_OK("[AC] %s decoder: [%s] drv:%s.%s ratio %i->%i\n",mp_conf.audio_codec?"Forcing":"Selecting" ,ac Modified: mplayerxp/libmpcodecs/dec_video.cpp =================================================================== --- mplayerxp/libmpcodecs/dec_video.cpp 2012-12-04 11:26:21 UTC (rev 505) +++ mplayerxp/libmpcodecs/dec_video.cpp 2012-12-04 12:35:59 UTC (rev 506) @@ -358,7 +358,7 @@ if(frame->flags) return 0; update_subtitle(opaque,frame->pts,mpi->xp_idx); - mpxp_context().video().output->flush_page(dae_curr_vdecoded(xp_core)); + mpxp_context().video().output->flush_page(dae_curr_vdecoded(mpxp_context().engine().xp_core)); t2=GetTimer()-t2; tt=t2*0.000001f; @@ -628,7 +628,7 @@ sh_video_t* sh = priv->parent; vf_stream_t* s = priv->vfilter; // MSG_DBG2("mpcodecs_get_image(vf_%s,%i,%i,%i,%i) was called\n",((vf_instance_t *)(sh->vfilter))->info->name,mp_imgtype,mp_imgflag,w,h); - mp_image_t* mpi=vf_get_new_image(s,sh->codec->outfmt[sh->outfmtidx],mp_imgtype,mp_imgflag,w,h,dae_curr_vdecoded(xp_core)); + mp_image_t* mpi=vf_get_new_image(s,sh->codec->outfmt[sh->outfmtidx],mp_imgtype,mp_imgflag,w,h,dae_curr_vdecoded(mpxp_context().engine().xp_core)); mpi->x=mpi->y=0; if(mpi->xp_idx==XP_IDX_INVALID) MSG_V("[mpcodecs_get_image] Incorrect mpi->xp_idx. Be ready for segfault!\n"); Modified: mplayerxp/libmpdemux/demuxer_r.cpp =================================================================== --- mplayerxp/libmpdemux/demuxer_r.cpp 2012-12-04 11:26:21 UTC (rev 505) +++ mplayerxp/libmpdemux/demuxer_r.cpp 2012-12-04 12:35:59 UTC (rev 506) @@ -38,7 +38,7 @@ { float retval; demuxer_t*demuxer=ds->demuxer; - xp_core->initial_apts_corr.need_correction=0; + mpxp_context().engine().xp_core->initial_apts_corr.need_correction=0; MSG_DBG2("initial_apts from: stream_pts=%f pts_bytes=%u got_bytes=%u i_bps=%u\n" ,ds->pts,ds->tell_pts(),nbytes,((sh_audio_t*)ds->demuxer->audio->sh)->i_bps); /* FIXUP AUDIO PTS*/ @@ -64,9 +64,9 @@ retval = ds->pts+ds->pts_corr+((float)(ds->tell_pts()-nbytes))/(float)(((sh_audio_t*)ds->demuxer->audio->sh)->i_bps); else { - xp_core->initial_apts_corr.need_correction=1; - xp_core->initial_apts_corr.pts_bytes=ds->tell_pts(); - xp_core->initial_apts_corr.nbytes=nbytes; + mpxp_context().engine().xp_core->initial_apts_corr.need_correction=1; + mpxp_context().engine().xp_core->initial_apts_corr.pts_bytes=ds->tell_pts(); + mpxp_context().engine().xp_core->initial_apts_corr.nbytes=nbytes; retval = ds->pts; } MSG_DBG2("initial_apts is: %f\n",retval); @@ -83,7 +83,7 @@ if(mp_conf.benchmark) t=GetTimer(); retval = ds->getch(); *pts=get_ds_stream_pts(ds,1); - if(xp_core->initial_apts == HUGE) xp_core->initial_apts=*pts; + if(mpxp_context().engine().xp_core->initial_apts == HUGE) mpxp_context().engine().xp_core->initial_apts=*pts; if(mp_conf.benchmark) { t2=GetTimer();t=t2-t; @@ -134,7 +134,7 @@ if(mp_conf.benchmark) t=GetTimer(); retval = ds->read_data(mem,len); *pts=get_ds_stream_pts(ds,retval); - if(xp_core->initial_apts == HUGE) xp_core->initial_apts=*pts; + if(mpxp_context().engine().xp_core->initial_apts == HUGE) mpxp_context().engine().xp_core->initial_apts=*pts; if(mp_conf.benchmark) { t2=GetTimer();t=t2-t; @@ -158,7 +158,7 @@ if(mp_conf.benchmark) t=GetTimer(); retval = ds->get_packet(start); *pts=get_ds_stream_pts(ds,retval); - if(xp_core->initial_apts == HUGE) xp_core->initial_apts=*pts; + if(mpxp_context().engine().xp_core->initial_apts == HUGE) mpxp_context().engine().xp_core->initial_apts=*pts; if(mp_conf.benchmark) { t2=GetTimer();t=t2-t; Modified: mplayerxp/libmpstream/cache2.cpp =================================================================== --- mplayerxp/libmpstream/cache2.cpp 2012-12-04 11:26:21 UTC (rev 505) +++ mplayerxp/libmpstream/cache2.cpp 2012-12-04 12:35:59 UTC (rev 506) @@ -286,7 +286,7 @@ unsigned rc; if((rc=xmp_register_thread(NULL,sig_cache2,cache2_routine,"cache2"))==UINT_MAX) return 0; - c->pth=xp_core->mpxp_threads[rc]; + c->pth=mpxp_context().engine().xp_core->mpxp_threads[rc]; // wait until cache is filled at least prefill_init % MSG_V("CACHE_PRE_INIT: %lld [%lld] %lld pre:%d eof:%d SS=%u \n", START_FILEPOS(c),c->read_filepos,END_FILEPOS(c),_min,c->eof,ss); Modified: mplayerxp/libmpsub/spudec.cpp =================================================================== --- mplayerxp/libmpsub/spudec.cpp 2012-12-04 11:26:21 UTC (rev 505) +++ mplayerxp/libmpsub/spudec.cpp 2012-12-04 12:35:59 UTC (rev 506) @@ -611,7 +611,7 @@ spudec_handle_t *spu = (spudec_handle_t *)self; if (spu->start_pts <= spu->now_pts && spu->now_pts < spu->end_pts && spu->image) { - draw_alpha(vo,dae_curr_vdecoded(xp_core),spu->start_col, spu->start_row, spu->width, spu->height, + draw_alpha(vo,dae_curr_vdecoded(mpxp_context().engine().xp_core),spu->start_col, spu->start_row, spu->width, spu->height, spu->image, spu->aimage, spu->stride); spu->spu_changed = 0; } @@ -767,7 +767,7 @@ || (spu->orig_frame_width == dxs && spu->orig_frame_height == dys))) { if (spu->image) { - draw_alpha(vo,dae_curr_vdecoded(xp_core),spu->start_col, spu->start_row, spu->width, spu->height, + draw_alpha(vo,dae_curr_vdecoded(mpxp_context().engine().xp_core),spu->start_col, spu->start_row, spu->width, spu->height, spu->image, spu->aimage, spu->stride); spu->spu_changed = 0; } @@ -1073,7 +1073,7 @@ if ((int)(spu->scaled_start_row) < 0) spu->scaled_start_row = 0; break; } - draw_alpha(vo,dae_curr_vdecoded(xp_core),spu->scaled_start_col, spu->scaled_start_row, spu->scaled_width, spu->scaled_height, + draw_alpha(vo,dae_curr_vdecoded(mpxp_context().engine().xp_core),spu->scaled_start_col, spu->scaled_start_row, spu->scaled_width, spu->scaled_height, spu->scaled_image, spu->scaled_aimage, spu->scaled_stride); spu->spu_changed = 0; } Modified: mplayerxp/libvo/sub.cpp =================================================================== --- mplayerxp/libvo/sub.cpp 2012-12-04 11:26:21 UTC (rev 505) +++ mplayerxp/libvo/sub.cpp 2012-12-04 12:35:59 UTC (rev 506) @@ -518,7 +518,7 @@ // obj->flags&=~OSDFLAG_OLD_BBOX; if(obj->cleared_frames>=0) { obj->cleared_frames++; - if(obj->cleared_frames>=xp_core->num_v_buffs) + if(obj->cleared_frames>=mpxp_context().engine().xp_core->num_v_buffs) obj->cleared_frames=-1; // All cleared stop } } Modified: mplayerxp/libvo/video_out.cpp =================================================================== --- mplayerxp/libvo/video_out.cpp 2012-12-04 11:26:21 UTC (rev 505) +++ mplayerxp/libvo/video_out.cpp 2012-12-04 12:35:59 UTC (rev 506) @@ -305,7 +305,7 @@ dri_tune(priv.image_width,priv.image_height); /* TODO: smart analizer of scaling possibilities of vo_driver */ if(is_resize) { - xp_core->in_resize=1; + mpxp_context().engine().xp_core->in_resize=1; vf_reinit_vo(priv.parent,priv.dri.cap.w,priv.dri.cap.h,priv.dri.cap.fourcc,1); } vf_reinit_vo(priv.parent,priv.dri.cap.w,priv.dri.cap.h,priv.dri.cap.fourcc,0); Modified: mplayerxp/mplayerxp.cpp =================================================================== --- mplayerxp/mplayerxp.cpp 2012-12-04 11:26:21 UTC (rev 505) +++ mplayerxp/mplayerxp.cpp 2012-12-04 12:35:59 UTC (rev 506) @@ -236,7 +236,7 @@ MP_Config mp_conf; MPXPContext::MPXPContext() - :MPXPSys(*new(zeromem)MPXPSystem), + :_engine(new(zeromem) mpxp_engine_t), _audio(new(zeromem) audio_processing_t), _video(new(zeromem) video_processing_t) { @@ -244,17 +244,17 @@ bench=new(zeromem) time_usage_t; use_pts_fix2=-1; rtc_fd=-1; + _engine->MPXPSys = new(zeromem) MPXPSystem; } MPXPContext::~MPXPContext() { - delete &MPXPSys; + delete _engine->MPXPSys; delete bench; } static volatile char antiviral_hole2[__VM_PAGE_SIZE__] __PAGE_ALIGNED__; static LocalPtr<MPXPContext> MPXPCtx(new(zeromem) MPXPContext); -xp_core_t* xp_core=NULL; static volatile char antiviral_hole3[__VM_PAGE_SIZE__] __PAGE_ALIGNED__; volatile MPXPSecureKeys* secure_keys; /************************************************************************** @@ -424,7 +424,7 @@ fflush(stdout); fflush(stderr); - mpxp_context().MPXPSys.uninit_player(INITED_ALL); + mpxp_context().engine().MPXPSys->uninit_player(INITED_ALL); MP_UNIT("exit_player"); @@ -640,7 +640,7 @@ } void show_long_help(void) { - MPXPSystem& MPXPSys=mpxp_context().MPXPSys; + MPXPSystem& MPXPSys=*mpxp_context().engine().MPXPSys; m_config_show_options(mpxp_context().mconfig); mp_input_print_binds(MPXPSys.libinput()); print_stream_drivers(); @@ -669,7 +669,7 @@ //================= Update OSD ==================== void update_osd( float v_pts ) { - MPXPSystem& MPXPSys=mpxp_context().MPXPSys; + MPXPSystem& MPXPSys=*mpxp_context().engine().MPXPSys; static char osd_text_buffer[64]; static int osd_last_pts=-303; //================= Update OSD ==================== @@ -713,7 +713,7 @@ sh_video_t* sh_video=reinterpret_cast<sh_video_t*>(_demuxer->video->sh); Demuxer_Stream *d_dvdsub=_demuxer->sub; int seek_rval=1; - xp_core->audio->eof=0; + mpxp_context().engine().xp_core->audio->eof=0; if(_seek->secs || _seek->flags&DEMUX_SEEK_SET) { seek_rval=demux_seek_r(_demuxer,_seek); mpxp_context().mpxp_after_seek=25; /* 1 sec delay */ @@ -774,12 +774,12 @@ } } - if(sh_video) dae_wait_decoder_outrun(xp_core->video); + if(sh_video) dae_wait_decoder_outrun(mpxp_context().engine().xp_core->video); } void mpxp_reset_vcache(void) { - MPXPSystem& MPXPSys=mpxp_context().MPXPSys; + MPXPSystem& MPXPSys=*mpxp_context().engine().MPXPSys; sh_video_t* sh_video=reinterpret_cast<sh_video_t*>(MPXPSys.demuxer()->video->sh); seek_args_t _seek = { 0, DEMUX_SEEK_CUR|DEMUX_SEEK_SECONDS }; if(sh_video) MPXPSys.seek(NULL,&_seek); @@ -832,14 +832,14 @@ 100.0*mpxp_context().bench->demux/total_time_usage, 100.0*mpxp_context().bench->c2/total_time_usage, 100.0*tot/total_time_usage); - unsigned nframes=xp_core->video->num_played_frames; + unsigned nframes=mpxp_context().engine().xp_core->video->num_played_frames; MSG_INFO("\nREAL RESULTS: from %u was dropped=%u\n" - ,nframes,xp_core->video->num_dropped_frames); + ,nframes,mpxp_context().engine().xp_core->video->num_dropped_frames); } static void show_benchmark_status(void) { - MPXPSystem& MPXPSys=mpxp_context().MPXPSys; + MPXPSystem& MPXPSys=*mpxp_context().engine().MPXPSys; sh_audio_t* sh_audio=reinterpret_cast<sh_audio_t*>(MPXPSys.demuxer()->audio->sh); if(xmp_test_model(XMP_Run_AudioPlayback)) MSG_STATUS("A:%6.1f %4.1f%%\r" @@ -868,7 +868,7 @@ } void mplayer_put_key(int code){ - MPXPSystem& MPXPSys=mpxp_context().MPXPSys; + MPXPSystem& MPXPSys=*mpxp_context().engine().MPXPSys; mp_cmd_t* cmd; cmd=mp_input_get_cmd_from_keys(MPXPSys.libinput(),1,&code); mp_input_queue_cmd(MPXPSys.libinput(),cmd); @@ -1310,18 +1310,18 @@ sh_audio_t* sh_audio=reinterpret_cast<sh_audio_t*>(_demuxer->audio->sh); sh_video_t* sh_video=reinterpret_cast<sh_video_t*>(_demuxer->video->sh); MP_UNIT("init_xp"); - if(sh_video && xp_core->num_v_buffs < 3) {/* we need at least 3 buffers to suppress screen judering */ - MSG_FATAL("Not enough buffers for DECODING AHEAD!\nNeed %u buffers but exist only %u\n",3,xp_core->num_v_buffs); + if(sh_video && mpxp_context().engine().xp_core->num_v_buffs < 3) {/* we need at least 3 buffers to suppress screen judering */ + MSG_FATAL("Not enough buffers for DECODING AHEAD!\nNeed %u buffers but exist only %u\n",3,mpxp_context().engine().xp_core->num_v_buffs); exit_player("Try other '-vo' driver.\n"); } if(xmp_init_engine(sh_video,sh_audio)!=0) exit_player("Can't initialize decoding ahead!\n"); if(xmp_run_decoders()!=0) exit_player("Can't run decoding ahead!\n"); - if(sh_video) MSG_OK("Using DECODING AHEAD mplayer's core with %u video buffers\n",xp_core->num_v_buffs); - else MSG_OK("Using DECODING AHEAD mplayer's core with %u audio buffers\n",xp_core->num_a_buffs); + if(sh_video) MSG_OK("Using DECODING AHEAD mplayer's core with %u video buffers\n",mpxp_context().engine().xp_core->num_v_buffs); + else MSG_OK("Using DECODING AHEAD mplayer's core with %u audio buffers\n",mpxp_context().engine().xp_core->num_a_buffs); /* reset counters */ - if(sh_video) xp_core->video->num_dropped_frames=0; + if(sh_video) mpxp_context().engine().xp_core->video->num_dropped_frames=0; inited_flags|=INITED_XMP; } @@ -1387,7 +1387,7 @@ if (ao_inited==MPXP_Ok && sh_audio) { if(xmp_test_model(XMP_Run_AudioPlayer)) { - xp_core->in_pause=1; + mpxp_context().engine().xp_core->in_pause=1; while( !dec_ahead_can_aseek ) yield_timeslice(); } ao_pause(mpxp_context().audio().output); // pause audio, keep data if possible @@ -1407,7 +1407,7 @@ if (ao_inited==MPXP_Ok && sh_audio) { ao_resume(mpxp_context().audio().output); // resume audio if(xmp_test_model(XMP_Run_AudioPlayer)) { - xp_core->in_pause=0; + mpxp_context().engine().xp_core->in_pause=0; __MP_SYNCHRONIZE(audio_play_mutex,pthread_cond_signal(&audio_play_cond)); } } @@ -1443,7 +1443,7 @@ i_abs = (cmd->nargs > 1) ? cmd->args[1].v.i : 0; if(i_abs) { _seek->flags = DEMUX_SEEK_SET|DEMUX_SEEK_PERCENTS; - if(sh_video) osd_function= (v > dae_played_frame(xp_core->video).v_pts) ? OSD_FFW : OSD_REW; + if(sh_video) osd_function= (v > dae_played_frame(mpxp_context().engine().xp_core->video).v_pts) ? OSD_FFW : OSD_REW; _seek->secs = v/100.; } else { _seek->flags = DEMUX_SEEK_CUR|DEMUX_SEEK_SECONDS; @@ -1625,7 +1625,7 @@ mpxp_context().video().output->fullscreen(); break; case MP_CMD_VO_SCREENSHOT: - mpxp_context().video().output->screenshot(dae_curr_vplayed(xp_core)); + mpxp_context().video().output->screenshot(dae_curr_vplayed(mpxp_context().engine().xp_core)); break; case MP_CMD_SUB_POS: { int v; @@ -1694,7 +1694,7 @@ secure_keys=ptr_protector.protect(new MPXPSecureKeys(10)); mpxp_init_structs(); - MPXPSystem& MPXPSys=mpxp_context().MPXPSys; + MPXPSystem& MPXPSys=*mpxp_context().engine().MPXPSys; mpxp_context().video().output=new(zeromem) Video_Output; init_signal_handling(); @@ -1752,7 +1752,7 @@ } } - xp_core->num_a_buffs = vo_conf.xp_buffs; + mpxp_context().engine().xp_core->num_a_buffs = vo_conf.xp_buffs; init_player(); @@ -1834,7 +1834,7 @@ //============ Open MPXPSys.demuxer()S --- DETECT file type ======================= if(mp_conf.playbackspeed_factor!=1.0) mp_conf.has_audio=0; - xp_core->initial_apts=HUGE; + mpxp_context().engine().xp_core->initial_apts=HUGE; if(!mp_conf.has_audio) mp_conf.audio_id=-2; // do NOT read audio packets... if(!mp_conf.has_video) mp_conf.video_id=-2; // do NOT read video packets... if(!mp_conf.has_dvdsub) mp_conf.dvdsub_id=-2;// do NOT read subtitle packets... @@ -1921,7 +1921,7 @@ goto main; } - xp_core->num_v_buffs=mpxp_context().video().output->get_num_frames(); /* that really known after init_vcodecs */ + mpxp_context().engine().xp_core->num_v_buffs=mpxp_context().video().output->get_num_frames(); /* that really known after init_vcodecs */ if(mp_conf.autoq>0){ /* Auto quality option enabled*/ @@ -2016,19 +2016,19 @@ */ mpxp_context().seek_time = GetTimerMS(); - if(sh_video) dae_wait_decoder_outrun(xp_core->video); + if(sh_video) dae_wait_decoder_outrun(mpxp_context().engine().xp_core->video); // TODO: rewrite test backtrace in .asm // mpxp_test_backtrace(); if(xmp_run_players()!=0) exit_player("Can't run xp players!\n"); - MSG_OK("Using the next %i threads:\n",xp_core->num_threads); + MSG_OK("Using the next %i threads:\n",mpxp_context().engine().xp_core->num_threads); unsigned idx; - for(idx=0;idx<xp_core->num_threads;idx++) + for(idx=0;idx<mpxp_context().engine().xp_core->num_threads;idx++) MSG_OK("[%i] %s (id=%u, pth_id=%lu)\n" ,idx - ,xp_core->mpxp_threads[idx]->name - ,xp_core->mpxp_threads[idx]->pid - ,xp_core->mpxp_threads[idx]->pth_id); + ,mpxp_context().engine().xp_core->mpxp_threads[idx]->name + ,mpxp_context().engine().xp_core->mpxp_threads[idx]->pid + ,mpxp_context().engine().xp_core->mpxp_threads[idx]->pth_id); //==================== START PLAYING ======================= @@ -2038,11 +2038,11 @@ while(!eof){ int in_pause=0; - eof |= xp_core->audio->eof; + eof |= mpxp_context().engine().xp_core->audio->eof; /*========================== UPDATE TIMERS ============================*/ MP_UNIT("Update timers"); - if(sh_audio) eof = xp_core->audio->eof; - if(sh_video) eof|=dae_played_eof(xp_core->video); + if(sh_audio) eof = mpxp_context().engine().xp_core->audio->eof; + if(sh_video) eof|=dae_played_eof(mpxp_context().engine().xp_core->video); if(!sh_video) { if(mp_conf.benchmark && mp_conf.verbose) show_benchmark_status(); else MPXPSys.print_audio_status(); @@ -2078,7 +2078,7 @@ if(mp_conf.loop_times==1) mp_conf.loop_times=-1; eof=0; - xp_core->audio->eof=0; + mpxp_context().engine().xp_core->audio->eof=0; seek_args.flags=DEMUX_SEEK_SET|DEMUX_SEEK_PERCENTS; seek_args.secs=0; // seek to start of movie (0%) } @@ -2089,14 +2089,14 @@ xmp_halt_threads(0); if(seek_args.secs && sh_video) { - xmp_frame_t shvap = dae_played_frame(xp_core->video); - xmp_frame_t shvad = dae_prev_decoded_frame(xp_core->video); - seek_args.secs -= (xp_core->bad_pts?shvad.v_pts:d_video->pts)-shvap.v_pts; + xmp_frame_t shvap = dae_played_frame(mpxp_context().engine().xp_core->video); + xmp_frame_t shvad = dae_prev_decoded_frame(mpxp_context().engine().xp_core->video); + seek_args.secs -= (mpxp_context().engine().xp_core->bad_pts?shvad.v_pts:d_video->pts)-shvap.v_pts; } MPXPSys.seek(&osd,&seek_args); - xp_core->audio->eof=0; + mpxp_context().engine().xp_core->audio->eof=0; seek_args.secs=0; seek_args.flags=DEMUX_SEEK_CUR|DEMUX_SEEK_SECONDS; @@ -2162,7 +2162,7 @@ MPXPSys.vo_inited=0; MPXPSys.ao_inited=MPXP_False; eof = 0; - xp_core->audio->eof=0; + mpxp_context().engine().xp_core->audio->eof=0; goto play_next_file; } Modified: mplayerxp/mplayerxp.h =================================================================== --- mplayerxp/mplayerxp.h 2012-12-04 11:26:21 UTC (rev 505) +++ mplayerxp/mplayerxp.h 2012-12-04 12:35:59 UTC (rev 506) @@ -123,6 +123,13 @@ double total_start; }time_usage_t; + struct MPXPSystem; + struct xp_core_t; + struct mpxp_engine_t { + MPXPSystem* MPXPSys; + xp_core_t* xp_core; + }; + struct audio_processing_t { audio_decoder_t* decoder; ao_data_t* output; @@ -133,13 +140,13 @@ Video_Output* output; }; - struct MPXPSystem; /* non-configurable through command line stuff */ struct MPXPContext :public Opaque { public: MPXPContext(); virtual ~MPXPContext(); + virtual mpxp_engine_t& engine() const { return *_engine; } virtual audio_processing_t& audio() const { return *_audio; } virtual video_processing_t& video() const { return *_video; } @@ -152,9 +159,9 @@ subtitle* subtitles; m_config_t* mconfig; time_usage_t* bench; - MPXPSystem& MPXPSys; any_t* msg_priv; private: + LocalPtr<mpxp_engine_t> _engine; LocalPtr<audio_processing_t> _audio; LocalPtr<video_processing_t> _video; }; Modified: mplayerxp/postproc/vf.cpp =================================================================== --- mplayerxp/postproc/vf.cpp 2012-12-04 11:26:21 UTC (rev 505) +++ mplayerxp/postproc/vf.cpp 2012-12-04 12:35:59 UTC (rev 506) @@ -240,7 +240,7 @@ } // if !DIRECT } else { MSG_DBG2("vf_get_new_image forces xp_idx retrieving\n"); - mpi->xp_idx=dae_curr_vdecoded(xp_core); + mpi->xp_idx=dae_curr_vdecoded(mpxp_context().engine().xp_core); mpi->flags&=~MP_IMGFLAG_ALLOCATED; } if(mpi->flags&MP_IMGFLAG_DRAW_CALLBACK && vf->start_slice) Modified: mplayerxp/xmpcore/sig_hand.cpp =================================================================== --- mplayerxp/xmpcore/sig_hand.cpp 2012-12-04 11:26:21 UTC (rev 505) +++ mplayerxp/xmpcore/sig_hand.cpp 2012-12-04 12:35:59 UTC (rev 506) @@ -36,18 +36,18 @@ { int i; pthread_t _self = pthread_self(); - for(i=0; i < xp_core->num_threads && !pthread_equal(xp_core->mpxp_threads[i]->pth_id, _self); i++); - if(i >= xp_core->num_threads || - !pthread_equal(xp_core->mpxp_threads[i]->pth_id, _self)) i = 0; /* Use 0 as default handler */ + for(i=0; i < mpxp_context().engine().xp_core->num_threads && !pthread_equal(mpxp_context().engine().xp_core->mpxp_threads[i]->pth_id, _self); i++); + if(i >= mpxp_context().engine().xp_core->num_threads || + !pthread_equal(mpxp_context().engine().xp_core->mpxp_threads[i]->pth_id, _self)) i = 0; /* Use 0 as default handler */ MSG_FATAL("catching signal: %s in thread: %s (%i) in module: %s\n" ,strsignal(signo) - ,xp_core->mpxp_threads[i]->name + ,mpxp_context().engine().xp_core->mpxp_threads[i]->name ,i - ,xp_core->mpxp_threads[i]->unit); + ,mpxp_context().engine().xp_core->mpxp_threads[i]->unit); dump_trace(); #ifdef NDEBUG - xp_core->mpxp_threads[i]->sigfunc(); + mpxp_context().engine().xp_core->mpxp_threads[i]->sigfunc(); #endif signal(signo,SIG_DFL); /* try coredump*/ Modified: mplayerxp/xmpcore/sig_hand.h =================================================================== --- mplayerxp/xmpcore/sig_hand.h 2012-12-04 11:26:21 UTC (rev 505) +++ mplayerxp/xmpcore/sig_hand.h 2012-12-04 12:35:59 UTC (rev 506) @@ -6,10 +6,11 @@ #include <sys/types.h> #include "xmpcore/xmp_core.h" +#include "mplayerxp.h" namespace mpxp { - inline void __MP_UNIT(unsigned id,const char *name) { xp_core->mpxp_threads[id]->unit=name; } - inline void MP_UNIT(const char *name) { xp_core->mpxp_threads[main_id]->unit=name; } + inline void __MP_UNIT(unsigned id,const char *name) { mpxp_context().engine().xp_core->mpxp_threads[id]->unit=name; } + inline void MP_UNIT(const char *name) { mpxp_context().engine().xp_core->mpxp_threads[main_id]->unit=name; } void init_signal_handling( void ); void uninit_signal_handling( int xp_id ); Modified: mplayerxp/xmpcore/xmp_adecoder.cpp =================================================================== --- mplayerxp/xmpcore/xmp_adecoder.cpp 2012-12-04 11:26:21 UTC (rev 505) +++ mplayerxp/xmpcore/xmp_adecoder.cpp 2012-12-04 12:35:59 UTC (rev 506) @@ -384,16 +384,16 @@ int xp_thread_decode_audio(Demuxer_Stream *d_audio) { - sh_audio_t* sh_audio=reinterpret_cast<sh_audio_t*>(xp_core->audio->sh); + sh_audio_t* sh_audio=reinterpret_cast<sh_audio_t*>(mpxp_context().engine().xp_core->audio->sh); sh_video_t* sh_video=NULL; - if(xp_core->video) sh_video=reinterpret_cast<sh_video_t*>(xp_core->video->sh); + if(mpxp_context().engine().xp_core->video) sh_video=reinterpret_cast<sh_video_t*>(mpxp_context().engine().xp_core->video->sh); int free_buf, vbuf_size, pref_buf; unsigned len=0; free_buf = get_free_audio_buffer(); if( free_buf == -1 ) { /* End of file */ - xp_core->audio->eof = 1; + mpxp_context().engine().xp_core->audio->eof = 1; return 0; } if( free_buf < (int)sh_audio->audio_out_minsize ) /* full */ @@ -404,9 +404,9 @@ if( len < MAX_OUTBURST ) /* Buffer underrun */ return decode_audio_buffer(d_audio,MAX_OUTBURST); - if(xp_core->video) { + if(mpxp_context().engine().xp_core->video) { /* Match video buffer */ - vbuf_size = dae_get_decoder_outrun(xp_core->video); + vbuf_size = dae_get_decoder_outrun(mpxp_context().engine().xp_core->video); pref_buf = vbuf_size / sh_video->fps * sh_audio->af_bps; pref_buf -= len; if( pref_buf > 0 ) { @@ -435,8 +435,8 @@ float d; priv->state=Pth_Run; - if(xp_core->video) xp_core->video->eof=0; - xp_core->audio->eof=0; + if(mpxp_context().engine().xp_core->video) mpxp_context().engine().xp_core->video->eof=0; + mpxp_context().engine().xp_core->audio->eof=0; MSG_T("\nDEC_AHEAD: entering...\n"); priv->pid = getpid(); __MP_UNIT(priv->p_idx,"dec_ahead"); @@ -450,7 +450,7 @@ } __MP_UNIT(priv->p_idx,"decode audio"); while((ret = xp_thread_decode_audio(d_audio)) == 2) {/* Almost empty buffer */ - if(xp_core->audio->eof) break; + if(mpxp_context().engine().xp_core->audio->eof) break; } dec_ahead_can_adseek=1; @@ -459,7 +459,7 @@ __MP_UNIT(priv->p_idx,"sleep"); LOCK_AUDIO_DECODE(); if(priv->state!=Pth_Canceling) { - if(xp_core->audio->eof) { + if(mpxp_context().engine().xp_core->audio->eof) { __MP_UNIT(priv->p_idx,"wait end of work"); pthread_cond_wait( &audio_decode_cond, &audio_decode_mutex ); } else if(ret==0) { /* Full buffer or end of file */ @@ -471,7 +471,7 @@ } else timeout.tv_sec = audio_play_timeout.tv_sec; } else { - if(xp_core->in_pause) + if(mpxp_context().engine().xp_core->in_pause) d = 1.0; else d = 0.1; Modified: mplayerxp/xmpcore/xmp_aplayer.cpp =================================================================== --- mplayerxp/xmpcore/xmp_aplayer.cpp 2012-12-04 11:26:21 UTC (rev 505) +++ mplayerxp/xmpcore/xmp_aplayer.cpp 2012-12-04 12:35:59 UTC (rev 506) @@ -60,7 +60,7 @@ // Update buffer if needed MP_UNIT("mpca_decode"); // Enter AUDIO decoder module t=GetTimer(); - while(sh_audio->a_buffer_len<playsize && !xp_core->audio->eof){ + while(sh_audio->a_buffer_len<playsize && !mpxp_context().engine().xp_core->audio->eof){ if(!xmp_test_model(XMP_Run_AudioPlayback)) { ret=read_audio_buffer(sh_audio,(unsigned char *)&sh_audio->a_buffer[sh_audio->a_buffer_len], playsize-sh_audio->a_buffer_len,sh_audio->a_buffer_size-sh_audio->a_buffer_len,&pts); @@ -71,7 +71,7 @@ if(ret>0) sh_audio->a_buffer_len+=ret; else { if(!d_audio->eof) break; - xp_core->audio->eof=1; + mpxp_context().engine().xp_core->audio->eof=1; break; } } @@ -201,7 +201,7 @@ samples = 10; min_audio = MAX_AUDIO_TIME; max_audio = 0; - } else if( !xp_core->audio->eof && collect_samples) { + } else if( !mpxp_context().engine().xp_core->audio->eof && collect_samples) { if( dec_ahead_audio_delay < min_audio ) min_audio = dec_ahead_audio_delay; if( dec_ahead_audio_delay > max_audio ) @@ -258,7 +258,7 @@ __MP_UNIT(priv->p_idx,"audio pause"); LOCK_AUDIO_PLAY(); - while( xp_core->in_pause && priv->state!=Pth_Canceling) { + while( mpxp_context().engine().xp_core->in_pause && priv->state!=Pth_Canceling) { pthread_cond_wait( &audio_play_cond, &audio_play_mutex ); } UNLOCK_AUDIO_PLAY(); Modified: mplayerxp/xmpcore/xmp_core.cpp =================================================================== --- mplayerxp/xmpcore/xmp_core.cpp 2012-12-04 11:26:21 UTC (rev 505) +++ mplayerxp/xmpcore/xmp_core.cpp 2012-12-04 12:35:59 UTC (rev 506) @@ -59,32 +59,32 @@ #endif void xmp_init(void) { - xp_core=(xp_core_t*)mp_mallocz(sizeof(xp_core_t)); - xp_core->initial_apts=HUGE; + mpxp_context().engine().xp_core=new(zeromem) xp_core_t; + mpxp_context().engine().xp_core->initial_apts=HUGE; } void xmp_uninit(void) { - delete xp_core->mpxp_threads[0]; - delete xp_core; - xp_core=NULL; + delete mpxp_context().engine().xp_core->mpxp_threads[0]; + delete mpxp_context().engine().xp_core; + mpxp_context().engine().xp_core=NULL; } unsigned xmp_register_main(sig_handler_t sigfunc) { unsigned idx=0; - xp_core->mpxp_threads[idx]=(mpxp_thread_t*)mp_mallocz(sizeof(mpxp_thread_t)); - xp_core->mpxp_threads[idx]->p_idx=idx; - xp_core->mpxp_threads[idx]->pid=getpid(); - xp_core->main_pth_id=xp_core->mpxp_threads[idx]->pth_id=pthread_self(); - xp_core->mpxp_threads[idx]->name = "main"; - xp_core->mpxp_threads[idx]->sigfunc = sigfunc; - xp_core->mpxp_threads[idx]->dae = NULL; - xp_core->num_threads++; + mpxp_context().engine().xp_core->mpxp_threads[idx]=(mpxp_thread_t*)mp_mallocz(sizeof(mpxp_thread_t)); + mpxp_context().engine().xp_core->mpxp_threads[idx]->p_idx=idx; + mpxp_context().engine().xp_core->mpxp_threads[idx]->pid=getpid(); + mpxp_context().engine().xp_core->main_pth_id=mpxp_context().engine().xp_core->mpxp_threads[idx]->pth_id=pthread_self(); + mpxp_context().engine().xp_core->mpxp_threads[idx]->name = "main"; + mpxp_context().engine().xp_core->mpxp_threads[idx]->sigfunc = sigfunc; + mpxp_context().engine().xp_core->mpxp_threads[idx]->dae = NULL; + mpxp_context().engine().xp_core->num_threads++; return idx; } static void print_stopped_thread(unsigned idx) { - MSG_OK("*** stop thread: [%i] %s\n",idx,xp_core->mpxp_threads[idx]->name); + MSG_OK("*** stop thread: [%i] %s\n",idx,mpxp_context().engine().xp_core->mpxp_threads[idx]->name); } void xmp_killall_threads(pthread_t _self) @@ -92,12 +92,12 @@ unsigned i; for(i=0;i < MAX_MPXP_THREADS;i++) { if( _self && - xp_core->mpxp_threads[i]->pth_id && - xp_core->mpxp_threads[i]->pth_id != xp_core->main_pth_id) { - pthread_kill(xp_core->mpxp_threads[i]->pth_id,SIGKILL); + mpxp_context().engine().xp_core->mpxp_threads[i]->pth_id && + mpxp_context().engine().xp_core->mpxp_threads[i]->pth_id != mpxp_context().engine().xp_core->main_pth_id) { + pthread_kill(mpxp_context().engine().xp_core->mpxp_threads[i]->pth_id,SIGKILL); print_stopped_thread(i); - delete xp_core->mpxp_threads[i]; - xp_core->mpxp_threads[i]=NULL; + delete mpxp_context().engine().xp_core->mpxp_threads[i]; + mpxp_context().engine().xp_core->mpxp_threads[i]=NULL; } } } @@ -168,7 +168,7 @@ if(it) { do { yield_timeslice(); - }while(dae_get_decoder_outrun(it) < xp_core->num_v_buffs/2); + }while(dae_get_decoder_outrun(it) < mpxp_context().engine().xp_core->num_v_buffs/2); } } @@ -212,6 +212,8 @@ it->frame[idx].v_pts=HUGE_VALF; } +int xmp_test_model(xmp_model_e value) { return (mpxp_context().engine().xp_core->flags&value)!=0; } + static xmp_model_e xmp_engine_compute_model(sh_video_t *shv, sh_audio_t *sha) { xmp_model_e rc; if(!shv && sha) { @@ -239,10 +241,10 @@ int xmp_init_engine(sh_video_t *shv, sh_audio_t *sha) { - xp_core->flags=xmp_engine_compute_model(shv,sha); + mpxp_context().engine().xp_core->flags=xmp_engine_compute_model(shv,sha); if(shv) { - xp_core->video=(dec_ahead_engine_t*)mp_mallocz(sizeof(dec_ahead_engine_t)); - dae_init(xp_core->video,xp_core->num_v_buffs,shv); + mpxp_context().engine().xp_core->video=(dec_ahead_engine_t*)mp_mallocz(sizeof(dec_ahead_engine_t)); + dae_init(mpxp_context().engine().xp_core->video,mpxp_context().engine().xp_core->num_v_buffs,shv); } if(sha) { if(xmp_test_model(XMP_Run_AudioPlayer)) { @@ -250,18 +252,18 @@ unsigned o_bps; unsigned min_reserv; o_bps=sha->af_bps; - if(xp_core->video) asize = std::max(unsigned(3*sha->audio_out_minsize), + if(mpxp_context().engine().xp_core->video) asize = std::max(unsigned(3*sha->audio_out_minsize), unsigned(std::max( unsigned(3*MAX_OUTBURST), - unsigned(o_bps*xp_core->num_v_buffs/shv->fps))))+MIN_BUFFER_RESERV; - else asize = o_bps*xp_core->num_a_buffs; + unsigned(o_bps*mpxp_context().engine().xp_core->num_v_buffs/shv->fps))))+MIN_BUFFER_RESERV; + else asize = o_bps*mpxp_context().engine().xp_core->num_a_buffs; /* FIXME: get better indices from asize/real_audio_packet_size */ min_reserv = sha->audio_out_minsize; if (o_bps > sha->o_bps) min_reserv = (float)min_reserv * (float)o_bps / (float)sha->o_bps; init_audio_buffer(asize+min_reserv,min_reserv+MIN_BUFFER_RESERV,asize/(sha->audio_out_minsize<10000?sha->audio_out_minsize:4000)+100,sha); } - xp_core->audio=(dec_ahead_engine_t*)mp_mallocz(sizeof(dec_ahead_engine_t)); - dae_init(xp_core->audio,xp_core->num_a_buffs,sha); + mpxp_context().engine().xp_core->audio=(dec_ahead_engine_t*)mp_mallocz(sizeof(dec_ahead_engine_t)); + dae_init(mpxp_context().engine().xp_core->audio,mpxp_context().engine().xp_core->num_a_buffs,sha); } return 0; } @@ -270,20 +272,20 @@ { xmp_stop_threads(force); - if(xp_core->video) { - dae_uninit(xp_core->video); - xp_core->video=NULL; + if(mpxp_context().engine().xp_core->video) { + dae_uninit(mpxp_context().engine().xp_core->video); + mpxp_context().engine().xp_core->video=NULL; } - if(xp_core->audio) { /* audio state doesn't matter on segfault :( */ + if(mpxp_context().engine().xp_core->audio) { /* audio state doesn't matter on segfault :( */ uninit_audio_buffer(); - xp_core->audio=NULL; + mpxp_context().engine().xp_core->audio=NULL; } } unsigned xmp_register_thread(dec_ahead_engine_t* dae,sig_handler_t sigfunc,mpxp_routine_t routine,const char *name) { unsigned stacksize=10485760; // 10MB per thread - unsigned idx=xp_core->num_threads; + unsigned idx=mpxp_context().engine().xp_core->num_threads; int rc; if(idx>=MAX_MPXP_THREADS) return UINT_MAX; pthread_attr_t attr; @@ -300,32 +302,32 @@ /* requires root privelegies */ pthread_attr_setschedpolicy(&attr,SCHED_FIFO); #endif - xp_core->mpxp_threads[idx]=(mpxp_thread_t*)mp_mallocz(sizeof(mpxp_thread_t)); + mpxp_context().engine().xp_core->mpxp_threads[idx]=(mpxp_thread_t*)mp_mallocz(sizeof(mpxp_thread_t)); - xp_core->mpxp_threads[idx]->p_idx=idx; - xp_core->mpxp_threads[idx]->name=name; - xp_core->mpxp_threads[idx]->routine=routine; - xp_core->mpxp_threads[idx]->sigfunc=sigfunc; - xp_core->mpxp_threads[idx]->state=Pth_Stand; - xp_core->mpxp_threads[idx]->dae=dae; + mpxp_context().engine().xp_core->mpxp_threads[idx]->p_idx=idx; + mpxp_context().engine().xp_core->mpxp_threads[idx]->name=name; + mpxp_context().engine().xp_core->mpxp_threads[idx]->routine=routine; + mpxp_context().engine().xp_core->mpxp_threads[idx]->sigfunc=sigfunc; + mpxp_context().engine().xp_core->mpxp_threads[idx]->state=Pth_Stand; + mpxp_context().engine().xp_core->mpxp_threads[idx]->dae=dae; - rc=pthread_create(&xp_core->mpxp_threads[idx]->pth_id,&attr,routine,xp_core->mpxp_threads[idx]); + rc=pthread_create(&mpxp_context().engine().xp_core->mpxp_threads[idx]->pth_id,&attr,routine,mpxp_context().engine().xp_core->mpxp_threads[idx]); pthread_attr_destroy(&attr); - xp_core->num_threads++; + mpxp_context().engine().xp_core->num_threads++; return (rc?UINT_MAX:idx); } int xmp_run_decoders( void ) { unsigned rc; - if(xp_core->audio && xmp_test_model(XMP_Run_AudioDecoder)) { - if((rc=xmp_register_thread(xp_core->audio,sig_audio_decode,a_dec_ahead_routine,"audio decoder"))==UINT_MAX) return rc; - while(xp_core->mpxp_threads[rc]->state!=Pth_Run) yield_timeslice(); + if(mpxp_context().engine().xp_core->audio && xmp_test_model(XMP_Run_AudioDecoder)) { + if((rc=xmp_register_thread(mpxp_context().engine().xp_core->audio,sig_audio_decode,a_dec_ahead_routine,"audio decoder"))==UINT_MAX) return rc; + while(mpxp_context().engine().xp_core->mpxp_threads[rc]->state!=Pth_Run) yield_timeslice(); } - if(xp_core->video && xmp_test_model(XMP_Run_VideoDecoder|XMP_Run_VA_Decoder)) { - if((rc=xmp_register_thread(xp_core->video,sig_video_decode,xmp_video_decoder,"video+audio decoders"))==UINT_MAX) return rc; - while(xp_core->mpxp_threads[rc]->state!=Pth_Run) yield_timeslice(); + if(mpxp_context().engine().xp_core->video && xmp_test_model(XMP_Run_VideoDecoder|XMP_Run_VA_Decoder)) { + if((rc=xmp_register_thread(mpxp_context().engine().xp_core->video,sig_video_decode,xmp_video_decoder,"video+audio decoders"))==UINT_MAX) return rc; + while(mpxp_context().engine().xp_core->mpxp_threads[rc]->state!=Pth_Run) yield_timeslice(); } return 0; } @@ -333,13 +335,13 @@ int xmp_run_players(void) { unsigned rc; - if(xp_core->audio && xmp_test_model(XMP_Run_AudioPlayer|XMP_Run_AudioPlayback)) { - if((rc=xmp_register_thread(xp_core->audio,sig_audio_play,audio_play_routine,"audio player"))==UINT_MAX) return rc; - while(xp_core->mpxp_threads[rc]->state!=Pth_Run) yield_timeslice(); + if(mpxp_context().engine().xp_core->audio && xmp_test_model(XMP_Run_AudioPlayer|XMP_Run_AudioPlayback)) { + if((rc=xmp_register_thread(mpxp_context().engine().xp_core->audio,sig_audio_play,audio_play_routine,"audio player"))==UINT_MAX) return rc; + while(mpxp_context().engine().xp_core->mpxp_threads[rc]->state!=Pth_Run) yield_timeslice(); } - if(xp_core->video && xmp_test_model(XMP_Run_VideoPlayer)) { - if((rc=xmp_register_thread(xp_core->video,sig_video_play,xmp_video_player,"video player"))==UINT_MAX) return rc; - while(xp_core->mpxp_threads[rc]->state!=Pth_Run) yield_timeslice(); + if(mpxp_context().engine().xp_core->video && xmp_test_model(XMP_Run_VideoPlayer)) { + if((rc=xmp_register_thread(mpxp_context().engine().xp_core->video,sig_video_play,xmp_video_player,"video player"))==UINT_MAX) return rc; + while(mpxp_context().engine().xp_core->mpxp_threads[rc]->state!=Pth_Run) yield_timeslice(); } return 0; } @@ -348,15 +350,15 @@ void xmp_stop_threads(int force) { unsigned i; - for(i=1;i<xp_core->num_threads;i++) { - if(force) pthread_kill(xp_core->mpxp_threads[i]->pth_id,SIGKILL); + for(i=1;i<mpxp_context().engine().xp_core->num_threads;i++) { + if(force) pthread_kill(mpxp_context().engine().xp_core->mpxp_threads[i]->pth_id,SIGKILL); else { - xp_core->mpxp_threads[i]->state=Pth_Canceling; - while(xp_core->mpxp_threads[i]->state==Pth_Canceling) yield_timeslice(); + mpxp_context().engine().xp_core->mpxp_threads[i]->state=Pth_Canceling; + while(mpxp_context().engine().xp_core->mpxp_threads[i]->state==Pth_Canceling) yield_timeslice(); } print_stopped_thread(i); - delete xp_core->mpxp_threads[i]; - xp_core->mpxp_threads[i]=NULL; + delete mpxp_context().engine().xp_core->mpxp_threads[i]; + mpxp_context().engine().xp_core->mpxp_threads[i]=NULL; } } @@ -364,9 +366,9 @@ void xmp_halt_threads(int is_reset_vcache) { unsigned i; - for(i=1;i<xp_core->num_threads;i++) { - xp_core->mpxp_threads[i]->state=Pth_Sleep; - while(xp_core->mpxp_threads[i]->state==Pth_Sleep) yield_timeslice(); + for(i=1;i<mpxp_context().engine().xp_core->num_threads;i++) { + mpxp_context().engine().xp_core->mpxp_threads[i]->state=Pth_Sleep; + while(mpxp_context().engine().xp_core->mpxp_threads[i]->state==Pth_Sleep) yield_timeslice(); } } @@ -374,17 +376,17 @@ void xmp_restart_threads(int xp_id) { /* reset counters */ - dae_reset(xp_core->video); + dae_reset(mpxp_context().engine().xp_core->video); /* temporary solution */ reset_audio_buffer(); /* Ugly hack: but we should read audio packet before video after seeking. Else we'll get picture destortion on the screen */ - xp_core->initial_apts=HUGE; + mpxp_context().engine().xp_core->initial_apts=HUGE; unsigned i; - for(i=1;i<xp_core->num_threads;i++) { - xp_core->mpxp_threads[i]->state=Pth_Run; - while(xp_core->mpxp_threads[i]->state==Pth_ASleep) yield_timeslice(); + for(i=1;i<mpxp_context().engine().xp_core->num_threads;i++) { + mpxp_context().engine().xp_core->mpxp_threads[i]->state=Pth_Run; + while(mpxp_context().engine().xp_core->mpxp_threads[i]->state==Pth_ASleep) yield_timeslice(); } } Modified: mplayerxp/xmpcore/xmp_core.h =================================================================== --- mplayerxp/xmpcore/xmp_core.h 2012-12-04 11:26:21 UTC (rev 505) +++ mplayerxp/xmpcore/xmp_core.h 2012-12-04 12:35:59 UTC (rev 506) @@ -21,19 +21,19 @@ namespace mpxp { enum xp_modes { XP_NA=0, XP_UniCore, XP_DualCore, XP_TripleCore, XP_MultiCore }; - typedef struct xmp_frame_s { + struct xmp_frame_t { float v_pts; /* presentation time-stamp from input stream __huge_valf indicates EOF */ float duration; /* frame duration */ any_t* priv; - }xmp_frame_t; + }; - struct dec_ahead_engine_s; + struct dec_ahead_engine_t; - typedef any_t* (*func_new_frame_priv_t)(struct dec_ahead_engine_s*); - typedef void (*func_free_frame_priv_t)(struct dec_ahead_engine_s*,any_t*); + typedef any_t* (*func_new_frame_priv_t)(struct dec_ahead_engine_t*); + typedef void (*func_free_frame_priv_t)(struct dec_ahead_engine_t*,any_t*); - typedef struct dec_ahead_engine_s { + struct dec_ahead_engine_t { volatile unsigned player_idx; /* index of frame which is currently played */ volatile unsigned decoder_idx; /* index of frame which is currently decoded */ unsigned nframes; /* number of frames in buffer */ @@ -48,7 +48,7 @@ long long int num_played_frames; long long int num_decoded_frames; /* for frame dropping */ long long int num_dropped_frames; - }dec_ahead_engine_t; + }; enum { main_id=0 }; enum { MAX_MPXP_THREADS=16 }; @@ -57,14 +57,14 @@ typedef any_t*(*mpxp_routine_t)(any_t*); typedef void (*sig_handler_t)(void); - typedef enum xmp_model { + enum xmp_model_e { XMP_Run_AudioPlayer =0x00000001, XMP_Run_AudioPlayback =0x00000002, /* audio player+decoder together */ XMP_Run_VideoPlayer =0x00000004, XMP_Run_VA_Decoder =0x00000008, /* audio+video decoders together */ XMP_Run_AudioDecoder =0x00000010, XMP_Run_VideoDecoder =0x00000020 - }xmp_model_e; + }; inline xmp_model_e operator~(xmp_model_e a) { return static_cast<xmp_model_e>(~static_cast<unsigned>(a)); } inline xmp_model_e operator|(xmp_model_e a, xmp_model_e b) { return static_cast<xmp_model_e>(static_cast<unsigned>(a)|static_cast<unsigned>(b)); } @@ -74,7 +74,7 @@ inline xmp_model_e operator&=(xmp_model_e a, xmp_model_e b) { return (a=static_cast<xmp_model_e>(static_cast<unsigned>(a)&static_cast<unsigned>(b))); } inline xmp_model_e operator^=(xmp_model_e a, xmp_model_e b) { return (a=static_cast<xmp_model_e>(static_cast<unsigned>(a)^static_cast<unsigned>(b))); } - typedef struct mpxp_thread_s { + struct mpxp_thread_t { unsigned p_idx; const char* name; const char* unit; @@ -84,15 +84,15 @@ sig_handler_t sigfunc; dec_ahead_engine_t* dae; volatile enum mpxp_thread_state state; - }mpxp_thread_t; + }; - typedef struct initial_audio_pts_correction_s { + struct initial_audio_pts_correction_t { int need_correction; int pts_bytes; int nbytes; - }initial_audio_pts_correction_t; + }; - typedef struct xp_core_s { + struct xp_core_t { xmp_model_e flags; dec_ahead_engine_t* video; dec_ahead_engine_t* audio; @@ -108,10 +108,9 @@ int bad_pts; // for MPEGxx codecs float initial_apts; initial_audio_pts_correction_t initial_apts_corr; - }xp_core_t; - extern xp_core_t *xp_core; + }; - inline int xmp_test_model(xmp_model_e value) { return (xp_core->flags&value)!=0; } + int xmp_test_model(xmp_model_e value); void xmp_init(void); void xmp_uninit(void); Modified: mplayerxp/xmpcore/xmp_vdecoder.cpp =================================================================== --- mplayerxp/xmpcore/xmp_vdecoder.cpp 2012-12-04 11:26:21 UTC (rev 505) +++ mplayerxp/xmpcore/xmp_vdecoder.cpp 2012-12-04 12:35:59 UTC (rev 506) @@ -34,14 +34,14 @@ "*********************************************\n" "Try increase number of buffer for decoding ahead\n" "Exist: %u, need: %u\n" - ,xp_core->num_v_buffs,(unsigned)(max_frame_delay*3*sh_video->fps)+3); + ,mpxp_context().engine().xp_core->num_v_buffs,(unsigned)(max_frame_delay*3*sh_video->fps)+3); prev_warn_delay=max_frame_delay; } } static unsigned compute_frame_dropping(sh_video_t* sh_video,float v_pts,float drop_barrier) { unsigned rc=0; - float screen_pts=dae_played_frame(xp_core->video).v_pts-(mp_conf.av_sync_pts?0:xp_core->initial_apts); + float screen_pts=dae_played_frame(mpxp_context().engine().xp_core->video).v_pts-(mp_conf.av_sync_pts?0:mpxp_context().engine().xp_core->initial_apts); static float prev_delta=64; float delta,max_frame_delay;/* delay for decoding of top slow frame */ max_frame_delay = mpxp_context().bench->max_video+mpxp_context().bench->max_vout; @@ -49,7 +49,7 @@ /* TODO: Replace the constants with some values which are depended on - xp_core->num_v_buffs and max_frame_delay to find out the smoothest way + mpxp_context().engine().xp_core->num_v_buffs and max_frame_delay to find out the smoothest way to display frames on slow machines. MAYBE!!!: (won't work with some realmedia streams for example) Try to borrow avifile's logic (btw, GPL'ed ;) for very slow systems: @@ -59,7 +59,7 @@ */ delta=v_pts-screen_pts; if(max_frame_delay*3 > drop_barrier) { - if(drop_barrier < (float)(xp_core->num_v_buffs-2)/sh_video->fps) drop_barrier += 1/sh_video->fps; + if(drop_barrier < (float)(mpxp_context().engine().xp_core->num_v_buffs-2)/sh_video->fps) drop_barrier += 1/sh_video->fps; else if(mp_conf.verbose) show_warn_cant_sync(sh_video,max_frame_delay); } @@ -76,7 +76,7 @@ if(delta < drop_barrier*2/3) fr_skip_divisor=3; else fr_skip_divisor=4; /* delta < drop_barrier */ - rc = (dae_curr_vdecoded(xp_core)%fr_skip_divisor)?0:1; + rc = (dae_curr_vdecoded(mpxp_context().engine().xp_core)%fr_skip_divisor)?0:1; if(delta>prev_delta) rc=0; } MSG_D("DEC_AHEAD: max_frame_delay*3=%f drop_barrier=%f prev_delta=%f delta=%f(v_pts=%f screen_pts=%f) n_fr_to_drop=%u\n",max_frame_delay*3,drop_barrier,prev_delta,delta,v_pts,xp_screen_pts,xp_n_frame_to_drop); @@ -87,10 +87,10 @@ static void reorder_pts_in_mpeg(void) { unsigned idx0=0, idx1, idx2, idx3; - idx1 = dae_curr_vdecoded(xp_core); - idx2 = dae_prev_vdecoded(xp_core); - xmp_frame_t* fra=xp_core->video->frame; - while( dae_curr_vplayed(xp_core) != idx2 && + idx1 = dae_curr_vdecoded(mpxp_context().engine().xp_core); + idx2 = dae_prev_vdecoded(mpxp_context().engine().xp_core); + xmp_frame_t* fra=mpxp_context().engine().xp_core->video->frame; + while( dae_curr_vplayed(mpxp_context().engine().xp_core) != idx2 && fra[idx2].v_pts > fra[idx1].v_pts && fra[idx2].v_pts < fra[idx1].v_pts+1.0 ) { float tmp; @@ -100,16 +100,16 @@ fra[idx2].duration = fra[idx1].v_pts - fra[idx2].v_pts; - idx3=(idx2-1)%xp_core->num_v_buffs; + idx3=(idx2-1)%mpxp_context().engine().xp_core->num_v_buffs; if(fra[idx2].v_pts > fra[idx3].v_pts && fra[idx2].v_pts - fra[idx3].v_pts < 1.0) fra[idx3].duration = fra[idx2].v_pts - fra[idx3].v_pts; - if(idx1 != dae_curr_vdecoded(xp_core)) fra[idx1].duration = fra[idx0].v_pts - fra[idx1].v_pts; + if(idx1 != dae_curr_vdecoded(mpxp_context().engine().xp_core)) fra[idx1].duration = fra[idx0].v_pts - fra[idx1].v_pts; idx0 = idx1; idx1 = idx2; - idx2=(idx2-1)%xp_core->num_v_buffs; + idx2=(idx2-1)%mpxp_context().engine().xp_core->num_v_buffs; } } @@ -131,28 +131,28 @@ priv->state=Pth_Run; priv->dae->eof = 0; - if(xp_core->audio) xp_core->audio->eof=0; + if(mpxp_context().engine().xp_core->audio) mpxp_context().engine().xp_core->audio->eof=0; MSG_T("\nDEC_AHEAD: entering...\n"); __MP_UNIT(priv->p_idx,"dec_ahead"); priv->pid = getpid(); - if(!xmp_test_model(XMP_Run_VA_Decoder) && xp_core->audio) + if(!xmp_test_model(XMP_Run_VA_Decoder) && mpxp_context().engine().xp_core->audio) priv->name = "video decoder"; - drop_barrier=(float)(xp_core->num_v_buffs/2)*(1/sh_video->fps); + drop_barrier=(float)(mpxp_context().engine().xp_core->num_v_buffs/2)*(1/sh_video->fps); if(mp_conf.av_sync_pts == -1 && !mpxp_context().use_pts_fix2) - xp_core->bad_pts = d_video->demuxer->file_format == DEMUXER_TYPE_MPEG_ES || + mpxp_context().engine().xp_core->bad_pts = d_video->demuxer->file_format == DEMUXER_TYPE_MPEG_ES || d_video->demuxer->file_format == DEMUXER_TYPE_MPEG4_ES || d_video->demuxer->file_format == DEMUXER_TYPE_H264_ES || d_video->demuxer->file_format == DEMUXER_TYPE_MPEG_PS || d_video->demuxer->file_format == DEMUXER_TYPE_MPEG_TS; else - xp_core->bad_pts = mp_conf.av_sync_pts?0:1; + mpxp_context().engine().xp_core->bad_pts = mp_conf.av_sync_pts?0:1; while(!priv->dae->eof){ if(priv->state==Pth_Canceling) break; if(priv->state==Pth_Sleep) { pt_sleep: priv->state=Pth_ASleep; while(priv->state==Pth_ASleep) yield_timeslice(); - if(xp_core->bad_pts) mpeg_timer=HUGE; + if(mpxp_context().engine().xp_core->bad_pts) mpeg_timer=HUGE; continue; } __MP_UNIT(priv->p_idx,"dec_ahead 1"); @@ -160,7 +160,7 @@ #if 0 /* prevent reent access to non-reent demuxer */ //if(sh_video->num_frames>200) *((char*)0x100) = 1; // Testing crash - if(xp_core->audio && mp_conf.xp<XP_VAFull) { + if(mpxp_context().engine().xp_core->audio && mp_conf.xp<XP_VAFull) { __MP_UNIT(priv->p_idx,"decode audio"); while(2==xp_thread_decode_audio()) ; __MP_UNIT(priv->p_idx,"dec_ahead 2"); @@ -170,13 +170,13 @@ frame=video_read_frame_r(sh_video,sh_video->fps); if(!frame) { pt_exit_loop: - dae_decoded_mark_eof(xp_core->video); + dae_decoded_mark_eof(mpxp_context().engine().xp_core->video); priv->dae->eof=1; break; } - if(mp_conf.play_n_frames>0 && xp_core->video->num_decoded_frames >= mp_conf.play_n_frames) goto pt_exit_loop; + if(mp_conf.play_n_frames>0 && mpxp_context().engine().xp_core->video->num_decoded_frames >= mp_conf.play_n_frames) goto pt_exit_loop; /* frame was decoded into current decoder_idx */ - if(xp_core->bad_pts) { + if(mpxp_context().engine().xp_core->bad_pts) { if(mpeg_timer==HUGE) mpeg_timer=frame->pts; else if( mpeg_timer-duration<frame->pts ) { mpeg_timer=frame->pts; @@ -190,7 +190,7 @@ int cur_time; cur_time = GetTimerMS(); /* Ugly solution: disable frame dropping right after seeking! */ - if(cur_time - mpxp_context().seek_time > (xp_core->num_v_buffs/sh_video->fps)*100) xp_n_frame_to_drop=compute_frame_dropping(sh_video,frame->pts,drop_barrier); + if(cur_time - mpxp_context().seek_time > (mpxp_context().engine().xp_core->num_v_buffs/sh_video->fps)*100) xp_n_frame_to_drop=compute_frame_dropping(sh_video,frame->pts,drop_barrier); } /* if( mp_conf.frame_dropping ) */ if(!finite(frame->pts)) MSG_WARN("Bug of demuxer! Value of video pts=%f\n",frame->pts); if(frame->type!=VideoFrame) escape_player("VideoDecoder doesn't parse non video frames",mp_conf.max_trace); @@ -210,8 +210,8 @@ else drop_param=0; /* decode: */ if(mpxp_context().output_quality) { - unsigned total = xp_core->num_v_buffs/2; - unsigned distance = dae_get_decoder_outrun(xp_core->video); + unsigned total = mpxp_context().engine().xp_core->num_v_buffs/2; + unsigned distance = dae_get_decoder_outrun(mpxp_context().engine().xp_core->video); int our_quality; our_quality = mpxp_context().output_quality*distance/total; if(drop_param) mpcv_set_quality(mpxp_context().video().decoder,0); @@ -220,22 +220,22 @@ } frame->flags=drop_param; blit_frame=mpcv_decode(mpxp_context().video().decoder,frame); -MSG_DBG2("DECODER: %i[%i] %f\n",dae_curr_vdecoded(xp_core),frame->len,frame->pts); +MSG_DBG2("DECODER: %i[%i] %f\n",dae_curr_vdecoded(mpxp_context().engine().xp_core),frame->len,frame->pts); if(mpxp_context().output_quality) { if(drop_param) mpcv_set_quality(mpxp_context().video().decoder,mpxp_context().output_quality); } if(!blit_frame && drop_param) priv->dae->num_dropped_frames++; if(blit_frame) { - unsigned idx=dae_curr_vdecoded(xp_core); - if(xp_core->bad_pts) - xp_core->video->frame[idx].v_pts=mpeg_timer; + unsigned idx=dae_curr_vdecoded(mpxp_context().engine().xp_core); + if(mpxp_context().engine().xp_core->bad_pts) + mpxp_context().engine().xp_core->video->frame[idx].v_pts=mpeg_timer; else - xp_core->video->frame[idx].v_pts = frame->pts; - xp_core->video->frame[idx].duration=duration; - dae_decoded_clear_eof(xp_core->video); - if(!xp_core->bad_pts) { - int _idx = dae_prev_vdecoded(xp_core); - xp_core->video->frame[_idx].duration=frame->pts-xp_core->video->frame[_idx].v_pts; + mpxp_context().engine().xp_core->video->frame[idx].v_pts = frame->pts; + mpxp_context().engine().xp_core->video->frame[idx].duration=duration; + dae_decoded_clear_eof(mpxp_context().engine().xp_core->video); + if(!mpxp_context().engine().xp_core->bad_pts) { + int _idx = dae_prev_vdecoded(mpxp_context().engine().xp_core); + mpxp_context().engine().xp_core->video->frame[_idx].duration=frame->pts-mpxp_context().engine().xp_core->video->frame[_idx].v_pts; } if(mp_conf.frame_reorder) reorder_pts_in_mpeg(); } /* if (blit_frame) */ @@ -243,12 +243,12 @@ /* ------------ sleep --------------- */ /* sleep if thread is too fast ;) */ if(blit_frame) - while(!dae_inc_decoded(xp_core->video)) { + while(!dae_inc_decoded(mpxp_context().engine().xp_core->video)) { MSG_T("DEC_AHEAD: sleep: player=%i decoder=%i)\n" ,dae_curr_vplayed(),dae_curr_vdecoded()); if(priv->state==Pth_Canceling) goto pt_exit; if(priv->state==Pth_Sleep) goto pt_sleep; - if(xp_core->audio && xmp_test_model(XMP_Run_VA_Decoder)) { + if(mpxp_context().engine().xp_core->audio && xmp_test_model(XMP_Run_VA_Decoder)) { __MP_UNIT(priv->p_idx,"decode audio"); xp_thread_decode_audio(d_audio); __MP_UNIT(priv->p_idx,"dec_ahead 5"); @@ -259,8 +259,8 @@ /*------------------------ frame decoded. --------------------*/ } /* while(!priv->dae->eof)*/ -if(xp_core->audio && xmp_test_model(XMP_Run_VA_Decoder)) { - while(!xp_core->audio->eof && priv->state!=Pth_Canceling && priv->state!=Pth_Sleep) { +if(mpxp_context().engine().xp_core->audio && xmp_test_model(XMP_Run_VA_Decoder)) { + while(!mpxp_context().engine().xp_core->audio->eof && priv->state!=Pth_Canceling && priv->state!=Pth_Sleep) { __MP_UNIT(priv->p_idx,"decode audio"); if(!xp_thread_decode_audio(d_audio)) yield_timeslice(); __MP_UNIT(priv->p_idx,NULL); @@ -277,8 +277,8 @@ MSG_T("sig_video_decode\n"); mpxp_print_flush(); - xp_core->video->eof = 1; - dae_decoded_mark_eof(xp_core->video); + mpxp_context().engine().xp_core->video->eof = 1; + dae_decoded_mark_eof(mpxp_context().engine().xp_core->video); /* Unlock all mutex ( man page says it may deadlock, but what is worse deadlock here or later? ) Modified: mplayerxp/xmpcore/xmp_vplayer.cpp =================================================================== --- mplayerxp/xmpcore/xmp_vplayer.cpp 2012-12-04 11:26:21 UTC (rev 505) +++ mplayerxp/xmpcore/xmp_vplayer.cpp 2012-12-04 12:35:59 UTC (rev 506) @@ -30,25 +30,25 @@ static void __show_status_line(float a_pts,float v_pts,float delay,float AV_delay) { MSG_STATUS("A:%6.1f V:%6.1f A-V:%7.3f %3d/%3d %2d%% %2d%% %4.1f%% %d [frms: [%i]]\n", a_pts-delay,v_pts,AV_delay - ,xp_core->video->num_played_frames,xp_core->video->num_decoded_frames + ,mpxp_context().engine().xp_core->video->num_played_frames,mpxp_context().engine().xp_core->video->num_decoded_frames ,(v_pts>0.5)?(int)(100.0*mpxp_context().bench->video/(double)v_pts):0 ,(v_pts>0.5)?(int)(100.0*mpxp_context().bench->vout/(double)v_pts):0 ,(v_pts>0.5)?(100.0*(mpxp_context().bench->audio+mpxp_context().bench->audio_decode)/(double)v_pts):0 ,mpxp_context().output_quality - ,dae_curr_vplayed(xp_core) + ,dae_curr_vplayed(mpxp_context().engine().xp_core) ); fflush(stdout); } static void show_status_line_no_apts(sh_audio_t* sh_audio,float v_pts) { - if(mp_conf.av_sync_pts && sh_audio && (!xp_core->audio->eof || ao_get_delay(mpxp_context().audio().output))) { + if(mp_conf.av_sync_pts && sh_audio && (!mpxp_context().engine().xp_core->audio->eof || ao_get_delay(mpxp_context().audio().output))) { float a_pts = sh_audio->timer-ao_get_delay(mpxp_context().audio().output); MSG_STATUS("A:%6.1f V:%6.1f A-V:%7.3f ct:%7.3f %3d/%3d %2d%% %2d%% %4.1f%% %d\r" ,a_pts ,v_pts ,a_pts-v_pts ,0.0 - ,xp_core->video->num_played_frames,xp_core->video->num_decoded_frames + ,mpxp_context().engine().xp_core->video->num_played_frames,mpxp_context().engine().xp_core->video->num_decoded_frames ,(v_pts>0.5)?(int)(100.0*mpxp_context().bench->video/(double)v_pts):0 ,(v_pts>0.5)?(int)(100.0*mpxp_context().bench->vout/(double)v_pts):0 ,(v_pts>0.5)?(100.0*(mpxp_context().bench->audio+mpxp_context().bench->audio_decode)/(double)v_pts):0 @@ -57,7 +57,7 @@ } else MSG_STATUS("V:%6.1f %3d %2d%% %2d%% %4.1f%% %d\r" ,v_pts - ,xp_core->video->num_played_frames + ,mpxp_context().engine().xp_core->video->num_played_frames ,(v_pts>0.5)?(int)(100.0*mpxp_context().bench->video/(double)v_pts):0 ,(v_pts>0.5)?(int)(100.0*mpxp_context().bench->vout/(double)v_pts):0 ,(v_pts>0.5)?(100.0*(mpxp_context().bench->audio+mpxp_context().bench->audio_decode)/(double)v_pts):0 @@ -93,14 +93,14 @@ static float vplayer_compute_sleep_time(sh_audio_t* sh_audio,sh_video_t* sh_video,xmp_frame_t* shva_prev,float screen_pts) { float sleep_time=0; - if(sh_audio && xp_core->audio) { - /* FIXME!!! need the same technique to detect xp_core->audio->eof as for video_eof! + if(sh_audio && mpxp_context().engine().xp_core->audio) { + /* FIXME!!! need the same technique to detect mpxp_context().engine().xp_core->audio->eof as for video_eof! often ao_get_delay() never returns 0 :( */ - if(xp_core->audio->eof && !get_delay_audio_buffer()) goto nosound_model; - if((!xp_core->audio->eof || ao_get_delay(mpxp_context().audio().output)) && + if(mpxp_context().engine().xp_core->audio->eof && !get_delay_audio_buffer()) goto nosound_model; + if((!mpxp_context().engine().xp_core->audio->eof || ao_get_delay(mpxp_context().a... [truncated message content] |