[MPlayer-cvslog] r20918 - in trunk: libmpcodecs/dec_video.c libmpcodecs/dec_video.h mencoder.c mplayer.c

uau subversion at mplayerhq.hu
Tue Nov 14 13:29:20 CET 2006


Author: uau
Date: Tue Nov 14 13:29:20 2006
New Revision: 20918

Modified:
   trunk/libmpcodecs/dec_video.c
   trunk/libmpcodecs/dec_video.h
   trunk/mencoder.c
   trunk/mplayer.c

Log:
Update OSD contents only after the correct values for the frame are known.
The most visible inaccuracy caused by the previous update location was
that the OSD always showed position 0 after seeking with demux_mkv.
Split frame decoding and filtering because with -correct-pts the pts
value that should be displayed for the frame is only known after
decoding but is needed before filtering (during which the OSD is drawn).


Modified: trunk/libmpcodecs/dec_video.c
==============================================================================
--- trunk/libmpcodecs/dec_video.c	(original)
+++ trunk/libmpcodecs/dec_video.c	Tue Nov 14 13:29:20 2006
@@ -315,13 +315,11 @@
 
 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 @@
 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 @@
 }
 
     t2=GetTimer()-t2;
-    tt=t2*0.000001f;
-    vout_time_usage+=tt;
+    vout_time_usage += t2*0.000001;
 
 return ret;
 }

Modified: trunk/libmpcodecs/dec_video.h
==============================================================================
--- trunk/libmpcodecs/dec_video.h	(original)
+++ trunk/libmpcodecs/dec_video.h	Tue Nov 14 13:29:20 2006
@@ -10,7 +10,8 @@
 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);

Modified: trunk/mencoder.c
==============================================================================
--- trunk/mencoder.c	(original)
+++ trunk/mencoder.c	Tue Nov 14 13:29:20 2006
@@ -1322,8 +1322,9 @@
     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 @@
 
         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,

Modified: trunk/mplayer.c
==============================================================================
--- trunk/mplayer.c	(original)
+++ trunk/mplayer.c	Tue Nov 14 13:29:20 2006
@@ -2762,7 +2762,7 @@
     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 @@
 	    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(end_at.type == END_AT_TIME && end_at.pos < a_pos)
     eof = PT_NEXT_ENTRY;
+  update_osd_msg();
 
 } else {
 
@@ -4370,7 +4376,10 @@
 	// 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 @@
 
 //================= Update OSD ====================
   
-  update_osd_msg();
-    
 #ifdef USE_SUB
   // find sub
   if(subdata &&  sh_video && sh_video->pts>0){



More information about the MPlayer-cvslog mailing list