@@ -166,6 +166,16 @@ SrsMessageQueue::~SrsMessageQueue()
166166 clear ();
167167}
168168
169+ int SrsMessageQueue::count ()
170+ {
171+ return (int )msgs.size ();
172+ }
173+
174+ int SrsMessageQueue::duration ()
175+ {
176+ return (int )(av_end_time - av_start_time);
177+ }
178+
169179void SrsMessageQueue::set_queue_size (double queue_size)
170180{
171181 queue_size_ms = (int )(queue_size * 1000 );
@@ -290,13 +300,19 @@ SrsConsumer::SrsConsumer(SrsSource* _source)
290300 jitter = new SrsRtmpJitter ();
291301 queue = new SrsMessageQueue ();
292302 should_update_source_id = false ;
303+
304+ mw_wait = st_cond_new ();
305+ mw_min_msgs = 0 ;
306+ mw_duration = 0 ;
307+ mw_waiting = false ;
293308}
294309
295310SrsConsumer::~SrsConsumer ()
296311{
297312 source->on_consumer_destroy (this );
298313 srs_freep (jitter);
299314 srs_freep (queue);
315+ st_cond_destroy (mw_wait);
300316}
301317
302318void SrsConsumer::set_queue_size (double queue_size)
@@ -329,6 +345,12 @@ int SrsConsumer::enqueue(SrsSharedPtrMessage* msg, bool atc, int tba, int tbv, S
329345 return ret;
330346 }
331347
348+ // fire the mw when msgs is enough.
349+ if (mw_waiting && queue->count () > mw_min_msgs && queue->duration () > mw_duration) {
350+ st_cond_signal (mw_wait);
351+ mw_waiting = false ;
352+ }
353+
332354 return ret;
333355}
334356
@@ -349,6 +371,22 @@ int SrsConsumer::dump_packets(int max_count, SrsMessage** pmsgs, int& count)
349371 return queue->dump_packets (max_count, pmsgs, count);
350372}
351373
374+ void SrsConsumer::wait (int nb_msgs, int duration)
375+ {
376+ mw_min_msgs = nb_msgs;
377+ mw_duration = duration;
378+
379+ // already ok, donot wait.
380+ if (queue->count () > mw_min_msgs && queue->duration () > mw_duration) {
381+ return ;
382+ }
383+
384+ // the enqueue will notify this cond.
385+ mw_waiting = true ;
386+
387+ st_cond_wait (mw_wait);
388+ }
389+
352390int SrsConsumer::on_play_client_pause (bool is_pause)
353391{
354392 int ret = ERROR_SUCCESS;
0 commit comments