From 3b0b2e0b852d5392608b3bc365ee1e539fe56ef9 Mon Sep 17 00:00:00 2001
From: winlin <winlin@vip.126.com>
Date: Fri, 14 Aug 2015 15:47:29 +0800
Subject: [PATCH] fix the bug to support dump packets with count.

---
 trunk/src/app/srs_app_source.cpp | 15 +++++++++++----
 trunk/src/app/srs_app_source.hpp |  3 +--
 2 files changed, 12 insertions(+), 6 deletions(-)

diff --git a/trunk/src/app/srs_app_source.cpp b/trunk/src/app/srs_app_source.cpp
index dbe47f689..126b2b1a3 100755
--- a/trunk/src/app/srs_app_source.cpp
+++ b/trunk/src/app/srs_app_source.cpp
@@ -301,8 +301,7 @@ int SrsMessageQueue::dump_packets(int max_count, SrsSharedPtrMessage** pmsgs, in
     }
     
     srs_assert(max_count > 0);
-    // when count is 0, dumps all; otherwise, dumps no more than count.
-    count = srs_min(max_count, count? count : nb_msgs);
+    count = srs_min(max_count, nb_msgs);
 
     SrsSharedPtrMessage** omsgs = msgs.data();
     for (int i = 0; i < count; i++) {
@@ -312,7 +311,7 @@ int SrsMessageQueue::dump_packets(int max_count, SrsSharedPtrMessage** pmsgs, in
     SrsSharedPtrMessage* last = omsgs[count - 1];
     av_start_time = last->timestamp;
     
-    if (count >= nb_msgs) {
+    if (count >= (int)msgs.size()) {
         // the pmsgs is big enough and clear msgs at most time.
         msgs.clear();
     } else {
@@ -502,8 +501,16 @@ int SrsConsumer::dump_packets(SrsMessageArray* msgs, int& count)
 {
     int ret =ERROR_SUCCESS;
     
+    srs_assert(count >= 0);
     srs_assert(msgs->max > 0);
     
+    // the count used as input to reset the max if positive.
+    int max = count? srs_min(count, msgs->max) : msgs->max;
+    
+    // the count specifies the max acceptable count,
+    // here maybe 1+, and we must set to 0 when got nothing.
+    count = 0;
+    
     if (should_update_source_id) {
         srs_trace("update source_id=%d[%d]", source->source_id(), source->source_id());
         should_update_source_id = false;
@@ -515,7 +522,7 @@ int SrsConsumer::dump_packets(SrsMessageArray* msgs, int& count)
     }
 
     // pump msgs from queue.
-    if ((ret = queue->dump_packets(msgs->max, msgs->msgs, count)) != ERROR_SUCCESS) {
+    if ((ret = queue->dump_packets(max, msgs->msgs, count)) != ERROR_SUCCESS) {
         return ret;
     }
     
diff --git a/trunk/src/app/srs_app_source.hpp b/trunk/src/app/srs_app_source.hpp
index 74d7f343f..18cdab86c 100755
--- a/trunk/src/app/srs_app_source.hpp
+++ b/trunk/src/app/srs_app_source.hpp
@@ -175,9 +175,8 @@ public:
     /**
      * get packets in consumer queue.
      * @pmsgs SrsSharedPtrMessage*[], used to store the msgs, user must alloc it.
-     * @count the count in array, input and output param.
+     * @count the count in array, output param.
      * @max_count the max count to dequeue, must be positive.
-     * @remark user can specifies the count to get specified msgs; 0 to get all if possible.
      */
     virtual int dump_packets(int max_count, SrsSharedPtrMessage** pmsgs, int& count);
     /**