From: Miguel F. <mig...@us...> - 2003-07-12 20:31:52
|
Update of /cvsroot/xine/xine-lib/src/xine-engine In directory sc8-pr-cvs1:/tmp/cvs-serv1191/src/xine-engine Modified Files: video_out.c Log Message: reports the number of skipped/discarded frames http://sourceforge.net/mailarchive/forum.php?thread_id=2753813&forum_id=7131 Index: video_out.c =================================================================== RCS file: /cvsroot/xine/xine-lib/src/xine-engine/video_out.c,v retrieving revision 1.164 retrieving revision 1.165 diff -u -r1.164 -r1.165 --- video_out.c 22 Jun 2003 17:10:41 -0000 1.164 +++ video_out.c 12 Jul 2003 20:31:49 -0000 1.165 @@ -76,6 +76,12 @@ int num_frames_skipped; int num_frames_discarded; + /* threshold for sending XINE_EVENT_DROPPED_FRAMES */ + int warn_skipped_threshold; + int warn_discarded_threshold; + int warn_threshold_exceeded; + int warn_threshold_event_sent; + /* pts value when decoder delivered last video frame */ int64_t last_delivery_pts; @@ -432,12 +438,59 @@ * performance measurement */ - if ((this->num_frames_delivered % 200) == 0 - && (this->num_frames_skipped || this->num_frames_discarded)) { - xine_log(this->xine, XINE_LOG_MSG, - _("%d frames delivered, %d frames skipped, %d frames discarded\n"), - this->num_frames_delivered, - this->num_frames_skipped, this->num_frames_discarded); + if ((this->num_frames_delivered % 200) == 0) { + int send_event; + + if( (100 * this->num_frames_skipped / this->num_frames_delivered) > + this->warn_skipped_threshold || + (100 * this->num_frames_discarded / this->num_frames_delivered) > + this->warn_discarded_threshold ) + this->warn_threshold_exceeded++; + else + this->warn_threshold_exceeded = 0; + + /* make sure threshold has being consistently exceeded - 5 times in a row + * (that is, this is not just a small burst of dropped frames). + */ + send_event = (this->warn_threshold_exceeded == 5 && + !this->warn_threshold_event_sent); + this->warn_threshold_event_sent += send_event; + + pthread_mutex_lock(&this->streams_lock); + for (stream = xine_list_first_content(this->streams); stream; + stream = xine_list_next_content(this->streams)) { + stream->stream_info[XINE_STREAM_INFO_SKIPPED_FRAMES] = + 1000 * this->num_frames_skipped / this->num_frames_delivered; + stream->stream_info[XINE_STREAM_INFO_DISCARDED_FRAMES] = + 1000 * this->num_frames_discarded / this->num_frames_delivered; + + /* we send XINE_EVENT_DROPPED_FRAMES to frontend to warn that + * number of skipped or discarded frames is too high. + */ + if( send_event ) { + xine_event_t event; + xine_dropped_frames_t data; + + event.type = XINE_EVENT_DROPPED_FRAMES; + event.stream = stream; + event.data = &data; + event.data_length = sizeof(data); + data.skipped_frames = stream->stream_info[XINE_STREAM_INFO_SKIPPED_FRAMES]; + data.skipped_threshold = this->warn_skipped_threshold * 10; + data.discarded_frames = stream->stream_info[XINE_STREAM_INFO_DISCARDED_FRAMES]; + data.discarded_threshold = this->warn_discarded_threshold * 10; + xine_event_send(stream, &event); + } + } + pthread_mutex_unlock(&this->streams_lock); + + + if( this->num_frames_skipped || this->num_frames_discarded ) { + xine_log(this->xine, XINE_LOG_MSG, + _("%d frames delivered, %d frames skipped, %d frames discarded\n"), + this->num_frames_delivered, + this->num_frames_skipped, this->num_frames_discarded); + } this->num_frames_delivered = 0; this->num_frames_discarded = 0; @@ -1117,6 +1170,7 @@ this->video_opened = 1; this->discard_frames = 0; this->last_delivery_pts = 0; + this->warn_threshold_event_sent = this->warn_threshold_exceeded = 0; if (!this->overlay_enabled && stream->spu_channel_user > -2) /* enable overlays if our new stream might want to show some */ this->overlay_enabled = 1; @@ -1488,6 +1542,16 @@ vo_append_to_img_buf_queue (this->free_img_buf_queue, img); } + + this->warn_skipped_threshold = + xine->config->register_num (xine->config, "video.warn_skipped_threshold", 10, + "send event to front end if percentage of skipped frames exceed this value", + NULL, 20, NULL, NULL); + this->warn_discarded_threshold = + xine->config->register_num (xine->config, "video.warn_discarded_threshold", 10, + "send event to front end if percentage of discarded frames exceed this value", + NULL, 20, NULL, NULL); + if (grabonly) { |