Changeset 4208

Show
Ignore:
Timestamp:
02/08/10 23:40:20 (4 weeks ago)
Author:
andoma
Message:

Add displaying of some stats when playing video

Location:
trunk/showtime
Files:
9 modified

Legend:

Unmodified
Added
Removed
  • trunk/showtime/glwthemes/default/pages/video.view

    r4196 r4208  
    2929      }); 
    3030    }); 
     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    }); 
    3147  }); 
    3248}); 
  • trunk/showtime/glwthemes/default/universe.view

    r4121 r4208  
    295295                }); 
    296296 
     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 
    297320                HORIZONTAL_SEPARATOR($global.media.current.type != "video"); 
    298321              }); 
  • trunk/showtime/src/audio/audio_decoder.c

    r3822 r4208  
    149149    TAILQ_REMOVE(&mq->mq_q, mb, mb_link); 
    150150    mq->mq_len--; 
     151    if(mp->mp_stats) 
     152      prop_set_int(mq->mq_prop_qlen_cur, mq->mq_len); 
    151153    hts_cond_signal(&mp->mp_backpressure); 
    152154    hts_mutex_unlock(&mp->mp_mutex); 
     
    329331    data_size = AVCODEC_MAX_AUDIO_FRAME_SIZE; 
    330332    r = avcodec_decode_audio2(ctx, ad->ad_outbuf, &data_size, buf, size); 
     333 
    331334    if(r == -1) 
    332335      break; 
  • trunk/showtime/src/event.c

    r4005 r4208  
    184184  { "Increase",              ACTION_INCR }, 
    185185  { "Decrease",              ACTION_DECR }, 
     186  { "MediaStats",            ACTION_SHOW_MEDIA_STATS }, 
    186187}; 
    187188 
     
    365366            event_is_action(e, ACTION_PREV_TRACK) || 
    366367            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            ) { 
    368371 
    369372    event_to_prop(prop_get_by_name(PNVEC("global", "media", "eventsink"), 
  • trunk/showtime/src/event.h

    r4127 r4208  
    8282  ACTION_RELOAD_UI, 
    8383 
     84  ACTION_SHOW_MEDIA_STATS, 
     85 
    8486  ACTION_last_mappable 
    8587} action_type_t; 
  • trunk/showtime/src/media.c

    r4005 r4208  
    4141static void seek_by_propchange(void *opaque, prop_event_t event, ...); 
    4242 
    43 static void update_avdelta(void *opaque, prop_event_t event, ...); 
     43static void update_avdelta(void *opaque, int value); 
     44 
     45static void update_stats(void *opaque, int value); 
    4446 
    4547static void media_eventsink(void *opaque, prop_event_t event, ...); 
     
    9698  mq->mq_stream = -1; 
    9799  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"); 
    100108} 
    101109 
     
    139147  } 
    140148 
    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); 
    143154 
    144155  mp->mp_prop_metadata    = prop_create(mp->mp_prop_root, "metadata"); 
     
    147158  mp->mp_prop_avdelta     = prop_create(mp->mp_prop_root, "avdelta"); 
    148159  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); 
    149163 
    150164  mp->mp_prop_url         = prop_create(mp->mp_prop_root, "url"); 
     
    176190  mp->mp_sub_avdelta =  
    177191    prop_subscribe(PROP_SUB_NO_INITIAL_UPDATE, 
    178                    PROP_TAG_CALLBACK, update_avdelta, mp, 
     192                   PROP_TAG_CALLBACK_INT, update_avdelta, mp, 
    179193                   PROP_TAG_COURIER, mp->mp_pc, 
    180194                   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, 
    181202                   NULL); 
    182203  return mp; 
     
    199220  prop_unsubscribe(mp->mp_sub_currenttime); 
    200221  prop_unsubscribe(mp->mp_sub_avdelta); 
     222  prop_unsubscribe(mp->mp_sub_stats); 
    201223 
    202224  prop_courier_destroy(mp->mp_pc); 
     
    319341 */ 
    320342static void 
    321 mb_enq_tail(media_queue_t *mq, media_buf_t *mb) 
     343mb_enq_tail(media_pipe_t *mp, media_queue_t *mq, media_buf_t *mb) 
    322344{ 
    323345  TAILQ_INSERT_TAIL(&mq->mq_q, mb, mb_link); 
    324346  mq->mq_len++; 
     347  if(mp->mp_stats) 
     348    prop_set_int(mq->mq_prop_qlen_cur, mq->mq_len); 
    325349  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 */ 
     355static void 
     356mb_enq_head(media_pipe_t *mp, media_queue_t *mq, media_buf_t *mb) 
    334357{ 
    335358  TAILQ_INSERT_HEAD(&mq->mq_q, mb, mb_link); 
    336359  mq->mq_len++; 
     360  if(mp->mp_stats) 
     361    prop_set_int(mq->mq_prop_qlen_cur, mq->mq_len); 
    337362  hts_cond_signal(&mq->mq_avail); 
    338   prop_set_int(mq->mq_prop_qlen_cur, mq->mq_len); 
    339363} 
    340364 
     
    368392  } 
    369393 
    370   mb_enq_tail(mq, mb); 
     394  mb_enq_tail(mp, mq, mb); 
    371395  hts_mutex_unlock(&mp->mp_mutex); 
    372396  return NULL; 
     
    402426  } 
    403427   
    404   mb_enq_tail(mq, mb); 
     428  mb_enq_tail(mp, mq, mb); 
    405429  hts_mutex_unlock(&mp->mp_mutex); 
    406430  return 0; 
     
    415439{ 
    416440  hts_mutex_lock(&mp->mp_mutex); 
    417   mb_enq_tail(mq, 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/** 
    423447 * Must be called with mp locked 
    424448 */ 
    425  
    426 void 
    427 mq_flush(media_queue_t *mq) 
     449static void 
     450mq_flush(media_pipe_t *mp, media_queue_t *mq) 
    428451{ 
    429452  media_buf_t *mb; 
     
    434457  } 
    435458  mq->mq_len = 0; 
     459  if(mp->mp_stats) 
     460    prop_set_int(mq->mq_prop_qlen_cur, mq->mq_len); 
    436461} 
    437462 
     
    450475  hts_mutex_lock(&mp->mp_mutex); 
    451476 
    452   mq_flush(a); 
    453   mq_flush(v); 
     477  mq_flush(mp, a); 
     478  mq_flush(mp, v); 
    454479 
    455480  if(v->mq_stream >= 0) { 
    456481    mb = media_buf_alloc(); 
    457482    mb->mb_data_type = MB_FLUSH; 
    458     mb_enq_tail(v, mb); 
     483    mb_enq_tail(mp, v, mb); 
    459484  } 
    460485 
     
    462487    mb = media_buf_alloc(); 
    463488    mb->mb_data_type = MB_FLUSH; 
    464     mb_enq_tail(a, mb); 
     489    mb_enq_tail(mp, a, mb); 
    465490  } 
    466491  hts_mutex_unlock(&mp->mp_mutex); 
     
    483508    mb = media_buf_alloc(); 
    484509    mb->mb_data_type = MB_END; 
    485     mb_enq_tail(v, mb); 
     510    mb_enq_tail(mp, v, mb); 
    486511  } 
    487512 
     
    489514    mb = media_buf_alloc(); 
    490515    mb->mb_data_type = MB_END; 
    491     mb_enq_tail(a, mb); 
     516    mb_enq_tail(mp, a, mb); 
    492517  } 
    493518  hts_mutex_unlock(&mp->mp_mutex); 
     
    529554  mb->mb_data = NULL; 
    530555  mb->mb_data_type = cmd; 
    531   mb_enq_tail(mq, mb); 
     556  mb_enq_tail(mp, mq, mb); 
    532557  hts_mutex_unlock(&mp->mp_mutex); 
    533558} 
     
    547572  mb->mb_data = NULL; 
    548573  mb->mb_data_type = cmd; 
    549   mb_enq_head(mq, mb); 
     574  mb_enq_head(mp, mq, mb); 
    550575  hts_mutex_unlock(&mp->mp_mutex); 
    551576} 
     
    566591  mb->mb_data_type = cmd; 
    567592  mb->mb_data = d; 
    568   mb_enq_tail(mq, mb); 
     593  mb_enq_tail(mp, mq, mb); 
    569594  hts_mutex_unlock(&mp->mp_mutex); 
    570595} 
     
    586611  mb->mb_data = NULL; 
    587612  mb->mb_data32 = u; 
    588   mb_enq_head(mq, mb); 
     613  mb_enq_head(mp, mq, mb); 
    589614  hts_mutex_unlock(&mp->mp_mutex); 
    590615} 
     
    606631  mb->mb_data = NULL; 
    607632  mb->mb_data32 = u; 
    608   mb_enq_tail(mq, mb); 
     633  mb_enq_tail(mp, mq, mb); 
    609634  hts_mutex_unlock(&mp->mp_mutex); 
    610635} 
     
    968993 */ 
    969994static void 
    970 update_avdelta(void *opaque, prop_event_t event, ...) 
     995update_avdelta(void *opaque, int v) 
    971996{ 
    972997  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 */ 
     1006static void 
     1007update_stats(void *opaque, int v) 
     1008{ 
     1009  media_pipe_t *mp = opaque; 
     1010  mp->mp_stats = v; 
    9911011} 
    9921012 
     
    10231043 
    10241044  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    } 
    10261052  } else { 
    10271053    playqueue_event_handler(e); 
  • trunk/showtime/src/media.h

    r4005 r4208  
    133133  prop_t *mq_prop_qlen_cur; 
    134134  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; 
    135141} media_queue_t; 
    136142 
     
    160166  int mp_audio_clock_epoch; 
    161167  int mp_avdelta; 
     168  int mp_stats; 
    162169 
    163170  struct audio_decoder *mp_audio_decoder; 
     
    172179  prop_t *mp_prop_currenttime; 
    173180  prop_t *mp_prop_avdelta; 
     181  prop_t *mp_prop_stats; 
    174182  prop_t *mp_prop_url; 
    175183 
     
    180188  prop_t *mp_prop_canEject; 
    181189 
     190  prop_t *mp_prop_video; 
     191  prop_t *mp_prop_audio; 
     192 
    182193  prop_courier_t *mp_pc; 
    183194  prop_sub_t *mp_sub_currenttime; 
    184195  prop_sub_t *mp_sub_avdelta; 
     196  prop_sub_t *mp_sub_stats; 
    185197 
    186198} media_pipe_t; 
     
    222234void mp_ref_dec(media_pipe_t *mp); 
    223235 
    224 void mq_flush(media_queue_t *mq); 
    225  
    226236int mb_enqueue_no_block(media_pipe_t *mp, media_queue_t *mq, media_buf_t *mb); 
    227237event_t *mb_enqueue_with_events(media_pipe_t *mp, media_queue_t *mq,  
  • trunk/showtime/src/video/video_decoder.c

    r3822 r4208  
    3636#include "yadif.h" 
    3737#include "event.h" 
    38  
    39 #include "misc/perftimer.h" 
    4038 
    4139static void 
     
    164162 
    165163static void  
    166 vd_decode_video(video_decoder_t *vd, media_buf_t *mb) 
     164vd_decode_video(video_decoder_t *vd, media_queue_t *mq, media_buf_t *mb) 
    167165{ 
    168166  int64_t pts, dts, t; 
     
    202200    vd->vd_skip = 1; 
    203201 
    204   //  static perftimer_t pt; 
    205   //  perftimer_start(&pt); 
     202  if(mp->mp_stats) 
     203    avgtime_start(&vd->vd_decode_time); 
     204 
    206205  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); 
    208210 
    209211  if(got_pic == 0 || mb->mb_skip == 1)  
     
    373375    TAILQ_REMOVE(&mq->mq_q, mb, mb_link); 
    374376    mq->mq_len--; 
     377    if(mp->mp_stats) 
     378      prop_set_int(mq->mq_prop_qlen_cur, mq->mq_len); 
     379 
    375380    hts_cond_signal(&mp->mp_backpressure); 
    376381    hts_mutex_unlock(&mp->mp_mutex); 
     
    395400 
    396401    case MB_VIDEO: 
    397       vd_decode_video(vd, mb); 
     402      vd_decode_video(vd, mq, mb); 
    398403      break; 
    399404 
  • trunk/showtime/src/video/video_decoder.h

    r3743 r4208  
    2121 
    2222#include "media.h" 
     23#include "misc/avgtime.h" 
    2324 
    2425struct AVCodecContext; 
     
    202203#endif 
    203204   
     205  /* stats */ 
     206 
     207  avgtime_t vd_decode_time; 
     208  avgtime_t vd_upload_time; 
     209 
     210 
    204211  /* Kalman filter for AVdiff compensation */ 
    205212