Changeset 4208
- Timestamp:
- 02/08/10 23:40:20 (5 weeks ago)
- Location:
- trunk/showtime
- Files:
-
- 9 modified
-
glwthemes/default/pages/video.view (modified) (1 diff)
-
glwthemes/default/universe.view (modified) (1 diff)
-
src/audio/audio_decoder.c (modified) (2 diffs)
-
src/event.c (modified) (2 diffs)
-
src/event.h (modified) (1 diff)
-
src/media.c (modified) (22 diffs)
-
src/media.h (modified) (5 diffs)
-
src/video/video_decoder.c (modified) (5 diffs)
-
src/video/video_decoder.h (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/showtime/glwthemes/default/pages/video.view
r4196 r4208 29 29 }); 30 30 }); 31 32 widget(label, { 33 .alpha = $self.media.stats; 34 .caption = "Video queue len: " + int2str($self.media.video.dqlen); 35 }); 36 37 widget(label, { 38 .alpha = $self.media.stats; 39 .caption = "Audio queue len: " + int2str($self.media.audio.dqlen); 40 }); 41 42 widget(label, { 43 .alpha = $self.media.stats; 44 .caption = "Video decode time: " + 45 int2str($self.media.video.decodetime_avg) + " ms"; 46 }); 31 47 }); 32 48 }); -
trunk/showtime/glwthemes/default/universe.view
r4121 r4208 295 295 }); 296 296 297 widget(container_x, { 298 299 widget(label, { 300 .align = right; 301 .caption = "Show stats"; 302 }); 303 304 widget(backdrop, { 305 306 BUTTON_PROPS(1.0); 307 308 onEvent(enter, event(MediaStats)) 309 310 widget(label, { 311 .align = left; 312 .caption = translate($global.media.current.stats, 313 "Unknown", 314 0, "Off", 315 1, "On"); 316 }); 317 }); 318 }); 319 297 320 HORIZONTAL_SEPARATOR($global.media.current.type != "video"); 298 321 }); -
trunk/showtime/src/audio/audio_decoder.c
r3822 r4208 149 149 TAILQ_REMOVE(&mq->mq_q, mb, mb_link); 150 150 mq->mq_len--; 151 if(mp->mp_stats) 152 prop_set_int(mq->mq_prop_qlen_cur, mq->mq_len); 151 153 hts_cond_signal(&mp->mp_backpressure); 152 154 hts_mutex_unlock(&mp->mp_mutex); … … 329 331 data_size = AVCODEC_MAX_AUDIO_FRAME_SIZE; 330 332 r = avcodec_decode_audio2(ctx, ad->ad_outbuf, &data_size, buf, size); 333 331 334 if(r == -1) 332 335 break; -
trunk/showtime/src/event.c
r4005 r4208 184 184 { "Increase", ACTION_INCR }, 185 185 { "Decrease", ACTION_DECR }, 186 { "MediaStats", ACTION_SHOW_MEDIA_STATS }, 186 187 }; 187 188 … … 365 366 event_is_action(e, ACTION_PREV_TRACK) || 366 367 event_is_action(e, ACTION_NEXT_TRACK) || 367 event_is_action(e, ACTION_RESTART_TRACK)) { 368 event_is_action(e, ACTION_RESTART_TRACK) || 369 event_is_action(e, ACTION_SHOW_MEDIA_STATS) 370 ) { 368 371 369 372 event_to_prop(prop_get_by_name(PNVEC("global", "media", "eventsink"), -
trunk/showtime/src/event.h
r4127 r4208 82 82 ACTION_RELOAD_UI, 83 83 84 ACTION_SHOW_MEDIA_STATS, 85 84 86 ACTION_last_mappable 85 87 } action_type_t; -
trunk/showtime/src/media.c
r4005 r4208 41 41 static void seek_by_propchange(void *opaque, prop_event_t event, ...); 42 42 43 static void update_avdelta(void *opaque, prop_event_t event, ...); 43 static void update_avdelta(void *opaque, int value); 44 45 static void update_stats(void *opaque, int value); 44 46 45 47 static void media_eventsink(void *opaque, prop_event_t event, ...); … … 96 98 mq->mq_stream = -1; 97 99 hts_cond_init(&mq->mq_avail); 98 mq->mq_prop_qlen_cur = prop_create(p, "qlen"); 99 mq->mq_prop_qlen_max = prop_create(p, "qmax"); 100 mq->mq_prop_qlen_cur = prop_create(p, "dqlen"); 101 mq->mq_prop_qlen_max = prop_create(p, "dqmax"); 102 103 mq->mq_prop_decode_avg = prop_create(p, "decodetime_avg"); 104 mq->mq_prop_decode_peak = prop_create(p, "decodetime_peak"); 105 106 mq->mq_prop_upload_avg = prop_create(p, "uploadtime_avg"); 107 mq->mq_prop_upload_peak = prop_create(p, "uploadtime_peak"); 100 108 } 101 109 … … 139 147 } 140 148 141 mq_init(&mp->mp_audio, prop_create(mp->mp_prop_root, "audio")); 142 mq_init(&mp->mp_video, prop_create(mp->mp_prop_root, "video")); 149 mp->mp_prop_audio = prop_create(mp->mp_prop_root, "audio"); 150 mq_init(&mp->mp_audio, mp->mp_prop_audio); 151 152 mp->mp_prop_video = prop_create(mp->mp_prop_root, "video"); 153 mq_init(&mp->mp_video, mp->mp_prop_video); 143 154 144 155 mp->mp_prop_metadata = prop_create(mp->mp_prop_root, "metadata"); … … 147 158 mp->mp_prop_avdelta = prop_create(mp->mp_prop_root, "avdelta"); 148 159 prop_set_float(mp->mp_prop_avdelta, 0); 160 161 mp->mp_prop_stats = prop_create(mp->mp_prop_root, "stats"); 162 prop_set_int(mp->mp_prop_stats, mp->mp_stats); 149 163 150 164 mp->mp_prop_url = prop_create(mp->mp_prop_root, "url"); … … 176 190 mp->mp_sub_avdelta = 177 191 prop_subscribe(PROP_SUB_NO_INITIAL_UPDATE, 178 PROP_TAG_CALLBACK , update_avdelta, mp,192 PROP_TAG_CALLBACK_INT, update_avdelta, mp, 179 193 PROP_TAG_COURIER, mp->mp_pc, 180 194 PROP_TAG_ROOT, mp->mp_prop_avdelta, 195 NULL); 196 197 mp->mp_sub_stats = 198 prop_subscribe(PROP_SUB_NO_INITIAL_UPDATE, 199 PROP_TAG_CALLBACK_INT, update_stats, mp, 200 PROP_TAG_COURIER, mp->mp_pc, 201 PROP_TAG_ROOT, mp->mp_prop_stats, 181 202 NULL); 182 203 return mp; … … 199 220 prop_unsubscribe(mp->mp_sub_currenttime); 200 221 prop_unsubscribe(mp->mp_sub_avdelta); 222 prop_unsubscribe(mp->mp_sub_stats); 201 223 202 224 prop_courier_destroy(mp->mp_pc); … … 319 341 */ 320 342 static void 321 mb_enq_tail(media_ queue_t *mq, media_buf_t *mb)343 mb_enq_tail(media_pipe_t *mp, media_queue_t *mq, media_buf_t *mb) 322 344 { 323 345 TAILQ_INSERT_TAIL(&mq->mq_q, mb, mb_link); 324 346 mq->mq_len++; 347 if(mp->mp_stats) 348 prop_set_int(mq->mq_prop_qlen_cur, mq->mq_len); 325 349 hts_cond_signal(&mq->mq_avail); 326 prop_set_int(mq->mq_prop_qlen_cur, mq->mq_len); 327 } 328 329 /** 330 * 331 */ 332 static void 333 mb_enq_head(media_queue_t *mq, media_buf_t *mb) 350 } 351 352 /** 353 * 354 */ 355 static void 356 mb_enq_head(media_pipe_t *mp, media_queue_t *mq, media_buf_t *mb) 334 357 { 335 358 TAILQ_INSERT_HEAD(&mq->mq_q, mb, mb_link); 336 359 mq->mq_len++; 360 if(mp->mp_stats) 361 prop_set_int(mq->mq_prop_qlen_cur, mq->mq_len); 337 362 hts_cond_signal(&mq->mq_avail); 338 prop_set_int(mq->mq_prop_qlen_cur, mq->mq_len);339 363 } 340 364 … … 368 392 } 369 393 370 mb_enq_tail(m q, mb);394 mb_enq_tail(mp, mq, mb); 371 395 hts_mutex_unlock(&mp->mp_mutex); 372 396 return NULL; … … 402 426 } 403 427 404 mb_enq_tail(m q, mb);428 mb_enq_tail(mp, mq, mb); 405 429 hts_mutex_unlock(&mp->mp_mutex); 406 430 return 0; … … 415 439 { 416 440 hts_mutex_lock(&mp->mp_mutex); 417 mb_enq_tail(m q, mb);418 hts_mutex_unlock(&mp->mp_mutex); 419 } 420 421 422 /* 441 mb_enq_tail(mp, mq, mb); 442 hts_mutex_unlock(&mp->mp_mutex); 443 } 444 445 446 /** 423 447 * Must be called with mp locked 424 448 */ 425 426 void 427 mq_flush(media_queue_t *mq) 449 static void 450 mq_flush(media_pipe_t *mp, media_queue_t *mq) 428 451 { 429 452 media_buf_t *mb; … … 434 457 } 435 458 mq->mq_len = 0; 459 if(mp->mp_stats) 460 prop_set_int(mq->mq_prop_qlen_cur, mq->mq_len); 436 461 } 437 462 … … 450 475 hts_mutex_lock(&mp->mp_mutex); 451 476 452 mq_flush( a);453 mq_flush( v);477 mq_flush(mp, a); 478 mq_flush(mp, v); 454 479 455 480 if(v->mq_stream >= 0) { 456 481 mb = media_buf_alloc(); 457 482 mb->mb_data_type = MB_FLUSH; 458 mb_enq_tail( v, mb);483 mb_enq_tail(mp, v, mb); 459 484 } 460 485 … … 462 487 mb = media_buf_alloc(); 463 488 mb->mb_data_type = MB_FLUSH; 464 mb_enq_tail( a, mb);489 mb_enq_tail(mp, a, mb); 465 490 } 466 491 hts_mutex_unlock(&mp->mp_mutex); … … 483 508 mb = media_buf_alloc(); 484 509 mb->mb_data_type = MB_END; 485 mb_enq_tail( v, mb);510 mb_enq_tail(mp, v, mb); 486 511 } 487 512 … … 489 514 mb = media_buf_alloc(); 490 515 mb->mb_data_type = MB_END; 491 mb_enq_tail( a, mb);516 mb_enq_tail(mp, a, mb); 492 517 } 493 518 hts_mutex_unlock(&mp->mp_mutex); … … 529 554 mb->mb_data = NULL; 530 555 mb->mb_data_type = cmd; 531 mb_enq_tail(m q, mb);556 mb_enq_tail(mp, mq, mb); 532 557 hts_mutex_unlock(&mp->mp_mutex); 533 558 } … … 547 572 mb->mb_data = NULL; 548 573 mb->mb_data_type = cmd; 549 mb_enq_head(m q, mb);574 mb_enq_head(mp, mq, mb); 550 575 hts_mutex_unlock(&mp->mp_mutex); 551 576 } … … 566 591 mb->mb_data_type = cmd; 567 592 mb->mb_data = d; 568 mb_enq_tail(m q, mb);593 mb_enq_tail(mp, mq, mb); 569 594 hts_mutex_unlock(&mp->mp_mutex); 570 595 } … … 586 611 mb->mb_data = NULL; 587 612 mb->mb_data32 = u; 588 mb_enq_head(m q, mb);613 mb_enq_head(mp, mq, mb); 589 614 hts_mutex_unlock(&mp->mp_mutex); 590 615 } … … 606 631 mb->mb_data = NULL; 607 632 mb->mb_data32 = u; 608 mb_enq_tail(m q, mb);633 mb_enq_tail(mp, mq, mb); 609 634 hts_mutex_unlock(&mp->mp_mutex); 610 635 } … … 968 993 */ 969 994 static void 970 update_avdelta(void *opaque, prop_event_t event, ...)995 update_avdelta(void *opaque, int v) 971 996 { 972 997 media_pipe_t *mp = opaque; 973 int t; 974 975 va_list ap; 976 va_start(ap, event); 977 978 switch(event) { 979 case PROP_SET_INT: 980 t = va_arg(ap, int); 981 break; 982 case PROP_SET_FLOAT: 983 t = va_arg(ap, double); 984 break; 985 default: 986 return; 987 } 988 989 mp->mp_avdelta = t * 1000; 990 TRACE(TRACE_DEBUG, "AVSYNC", "Set to %d ms", t); 998 mp->mp_avdelta = v * 1000; 999 TRACE(TRACE_DEBUG, "AVSYNC", "Set to %d ms", v); 1000 } 1001 1002 1003 /** 1004 * 1005 */ 1006 static void 1007 update_stats(void *opaque, int v) 1008 { 1009 media_pipe_t *mp = opaque; 1010 mp->mp_stats = v; 991 1011 } 992 1012 … … 1023 1043 1024 1044 if(media_primary != NULL) { 1025 mp_enqueue_event(media_primary, e); 1045 1046 1047 if(event_is_action(e, ACTION_SHOW_MEDIA_STATS)) { 1048 prop_toggle_int(media_primary->mp_prop_stats); 1049 } else { 1050 mp_enqueue_event(media_primary, e); 1051 } 1026 1052 } else { 1027 1053 playqueue_event_handler(e); -
trunk/showtime/src/media.h
r4005 r4208 133 133 prop_t *mq_prop_qlen_cur; 134 134 prop_t *mq_prop_qlen_max; 135 136 prop_t *mq_prop_decode_avg; 137 prop_t *mq_prop_decode_peak; 138 139 prop_t *mq_prop_upload_avg; 140 prop_t *mq_prop_upload_peak; 135 141 } media_queue_t; 136 142 … … 160 166 int mp_audio_clock_epoch; 161 167 int mp_avdelta; 168 int mp_stats; 162 169 163 170 struct audio_decoder *mp_audio_decoder; … … 172 179 prop_t *mp_prop_currenttime; 173 180 prop_t *mp_prop_avdelta; 181 prop_t *mp_prop_stats; 174 182 prop_t *mp_prop_url; 175 183 … … 180 188 prop_t *mp_prop_canEject; 181 189 190 prop_t *mp_prop_video; 191 prop_t *mp_prop_audio; 192 182 193 prop_courier_t *mp_pc; 183 194 prop_sub_t *mp_sub_currenttime; 184 195 prop_sub_t *mp_sub_avdelta; 196 prop_sub_t *mp_sub_stats; 185 197 186 198 } media_pipe_t; … … 222 234 void mp_ref_dec(media_pipe_t *mp); 223 235 224 void mq_flush(media_queue_t *mq);225 226 236 int mb_enqueue_no_block(media_pipe_t *mp, media_queue_t *mq, media_buf_t *mb); 227 237 event_t *mb_enqueue_with_events(media_pipe_t *mp, media_queue_t *mq, -
trunk/showtime/src/video/video_decoder.c
r3822 r4208 36 36 #include "yadif.h" 37 37 #include "event.h" 38 39 #include "misc/perftimer.h"40 38 41 39 static void … … 164 162 165 163 static void 166 vd_decode_video(video_decoder_t *vd, media_ buf_t *mb)164 vd_decode_video(video_decoder_t *vd, media_queue_t *mq, media_buf_t *mb) 167 165 { 168 166 int64_t pts, dts, t; … … 202 200 vd->vd_skip = 1; 203 201 204 // static perftimer_t pt; 205 // perftimer_start(&pt); 202 if(mp->mp_stats) 203 avgtime_start(&vd->vd_decode_time); 204 206 205 avcodec_decode_video(ctx, frame, &got_pic, mb->mb_data, mb->mb_size); 207 // perftimer_stop(&pt, "videodecode"); 206 207 if(mp->mp_stats) 208 avgtime_stop(&vd->vd_decode_time, mq->mq_prop_decode_avg, 209 mq->mq_prop_decode_peak); 208 210 209 211 if(got_pic == 0 || mb->mb_skip == 1) … … 373 375 TAILQ_REMOVE(&mq->mq_q, mb, mb_link); 374 376 mq->mq_len--; 377 if(mp->mp_stats) 378 prop_set_int(mq->mq_prop_qlen_cur, mq->mq_len); 379 375 380 hts_cond_signal(&mp->mp_backpressure); 376 381 hts_mutex_unlock(&mp->mp_mutex); … … 395 400 396 401 case MB_VIDEO: 397 vd_decode_video(vd, m b);402 vd_decode_video(vd, mq, mb); 398 403 break; 399 404 -
trunk/showtime/src/video/video_decoder.h
r3743 r4208 21 21 22 22 #include "media.h" 23 #include "misc/avgtime.h" 23 24 24 25 struct AVCodecContext; … … 202 203 #endif 203 204 205 /* stats */ 206 207 avgtime_t vd_decode_time; 208 avgtime_t vd_upload_time; 209 210 204 211 /* Kalman filter for AVdiff compensation */ 205 212