diff options
-rw-r--r-- | libmpcodecs/dec_video.c | 22 | ||||
-rw-r--r-- | libmpcodecs/dec_video.h | 3 | ||||
-rw-r--r-- | mencoder.c | 7 | ||||
-rw-r--r-- | mplayer.c | 19 |
4 files changed, 32 insertions, 19 deletions
diff --git a/libmpcodecs/dec_video.c b/libmpcodecs/dec_video.c index be152f85fc..c5da036aef 100644 --- a/libmpcodecs/dec_video.c +++ b/libmpcodecs/dec_video.c @@ -315,13 +315,11 @@ return 1; // success extern int vo_directrendering; -int decode_video(sh_video_t *sh_video,unsigned char *start,int in_size,int drop_frame, double pts){ -vf_instance_t* vf; +void *decode_video(sh_video_t *sh_video,unsigned char *start,int in_size,int drop_frame, double pts){ mp_image_t *mpi=NULL; unsigned int t=GetTimer(); unsigned int t2; double tt; -int ret; if (correct_pts) { int delay = get_current_video_decoder_lag(sh_video); @@ -373,16 +371,21 @@ t2=GetTimer();t=t2-t; tt = t*0.000001f; video_time_usage+=tt; -if(!mpi || drop_frame) return 0; // error / skipped frame +if(!mpi || drop_frame) return NULL; // error / skipped frame if (correct_pts) { sh_video->num_buffered_pts--; - pts = sh_video->buffered_pts[sh_video->num_buffered_pts]; + sh_video->pts = sh_video->buffered_pts[sh_video->num_buffered_pts]; } + return mpi; +} -//vo_draw_image(video_out,mpi); -vf=sh_video->vfilter; -ret = vf->put_image(vf,mpi, pts); // apply video filters and call the leaf vo/ve +int filter_video(sh_video_t *sh_video, void *frame, double pts) { +mp_image_t *mpi = frame; +unsigned int t2 = GetTimer(); +vf_instance_t *vf = sh_video->vfilter; +// apply video filters and call the leaf vo/ve +int ret = vf->put_image(vf,mpi, pts); if(ret>0) { vf->control(vf,VFCTRL_DRAW_OSD,NULL); #ifdef USE_ASS @@ -391,8 +394,7 @@ if(ret>0) { } t2=GetTimer()-t2; - tt=t2*0.000001f; - vout_time_usage+=tt; + vout_time_usage += t2*0.000001; return ret; } diff --git a/libmpcodecs/dec_video.h b/libmpcodecs/dec_video.h index 08b861ccaa..c2eb34b8db 100644 --- a/libmpcodecs/dec_video.h +++ b/libmpcodecs/dec_video.h @@ -10,7 +10,8 @@ extern int init_best_video_codec(sh_video_t *sh_video,char** video_codec_list,ch extern int init_video(sh_video_t *sh_video,char* codecname,char* vfm,int status); extern void uninit_video(sh_video_t *sh_video); -extern int decode_video(sh_video_t *sh_video,unsigned char *start,int in_size,int drop_frame, double pts); +extern void *decode_video(sh_video_t *sh_video,unsigned char *start,int in_size,int drop_frame, double pts); +extern int filter_video(sh_video_t *sh_video, void *frame, double pts); extern int get_video_quality_max(sh_video_t *sh_video); extern void set_video_quality(sh_video_t *sh_video,int quality); diff --git a/mencoder.c b/mencoder.c index 350dc02110..472a1ef3bb 100644 --- a/mencoder.c +++ b/mencoder.c @@ -1322,8 +1322,9 @@ case VCODEC_FRAMENO: break; default: // decode_video will callback down to ve_*.c encoders, through the video filters - blit_frame=decode_video(sh_video,frame_data.start,frame_data.in_size, + {void *decoded_frame = decode_video(sh_video,frame_data.start,frame_data.in_size, skip_flag>0 && (!sh_video->vfilter || ((vf_instance_t *)sh_video->vfilter)->control(sh_video->vfilter, VFCTRL_SKIP_NEXT_FRAME, 0) != CONTROL_TRUE), MP_NOPTS_VALUE); + blit_frame = decoded_frame && filter_video(sh_video, decoded_frame, MP_NOPTS_VALUE);} if (sh_video->vf_inited < 0) mencoder_exit(1, NULL); @@ -1696,7 +1697,9 @@ static int slowseek(float end_pts, demux_stream_t *d_video, demux_stream_t *d_au if (vfilter) { int softskip = (vfilter->control(vfilter, VFCTRL_SKIP_NEXT_FRAME, 0) == CONTROL_TRUE); - decode_video(sh_video, frame_data->start, frame_data->in_size, !softskip, MP_NOPTS_VALUE); + void *decoded_frame = decode_video(sh_video, frame_data->start, frame_data->in_size, !softskip, MP_NOPTS_VALUE); + if (decoded_frame) + filter_video(sh_video, decoded_frame, MP_NOPTS_VALUE); } if (print_info) mp_msg(MSGT_MENCODER, MSGL_STATUS, @@ -2762,7 +2762,7 @@ static int generate_video_frame(sh_video_t *sh_video, demux_stream_t *d_video) while (1) { current_module = "decode video"; // XXX Time used in this call is not counted in any performance - // timer now + // timer now, OSD is not updated correctly for filter-added frames if (vf_output_queued_frame(sh_video->vfilter)) break; current_module = "video_read_frame"; @@ -2777,8 +2777,13 @@ static int generate_video_frame(sh_video_t *sh_video, demux_stream_t *d_video) max_framesize = in_size; if (pts == MP_NOPTS_VALUE) mp_msg(MSGT_CPLAYER, MSGL_ERR, "pts value from demuxer MISSING\n"); - if (decode_video(sh_video, start, in_size, 0, pts)) - break; + current_module = "decode video"; + void *decoded_frame = decode_video(sh_video, start, in_size, 0, pts); + if (decoded_frame) { + update_osd_msg(); + if (filter_video(sh_video, decoded_frame, sh_video->pts)) + break; + } if (hit_eof) return 0; } @@ -4324,6 +4329,7 @@ if(!sh_video) { if(end_at.type == END_AT_TIME && end_at.pos < a_pos) eof = PT_NEXT_ENTRY; + update_osd_msg(); } else { @@ -4370,7 +4376,10 @@ if(!sh_video) { // decode: current_module="decode_video"; // printf("Decode! %p %d \n",start,in_size); - blit_frame=decode_video(sh_video,start,in_size,drop_frame, sh_video->pts); + update_osd_msg(); + void *decoded_frame = decode_video(sh_video,start,in_size,drop_frame, sh_video->pts); + blit_frame = (decoded_frame && filter_video(sh_video, decoded_frame, + sh_video->pts)); break; } else while (1) { @@ -5409,8 +5418,6 @@ if ((user_muted | edl_muted) != mixer.muted) mixer_mute(&mixer); //================= Update OSD ==================== - update_osd_msg(); - #ifdef USE_SUB // find sub if(subdata && sh_video && sh_video->pts>0){ |