From d1979c760f6d3e5a13644e72e999242495ea64a0 Mon Sep 17 00:00:00 2001
From: winlin <winlin@vip.126.com>
Date: Tue, 27 Oct 2015 17:44:10 +0800
Subject: [PATCH] for #512, partical hotfix the hls pure audio. 2.0.196

---
 README.md                          |  1 +
 trunk/src/app/srs_app_hls.cpp      | 10 +++++++++-
 trunk/src/core/srs_core.hpp        |  2 +-
 trunk/src/kernel/srs_kernel_ts.cpp | 14 ++++++++++----
 trunk/src/kernel/srs_kernel_ts.hpp |  4 ++++
 5 files changed, 25 insertions(+), 6 deletions(-)

diff --git a/README.md b/README.md
index 57a753539..e6e18c489 100755
--- a/README.md
+++ b/README.md
@@ -336,6 +336,7 @@ Remark:
 
 ## History
 
+* v2.0, 2015-10-27, for [#512][bug #512] partical hotfix the hls pure audio. 2.0.196
 * <strong>v2.0, 2015-10-08, [2.0 alpha2(2.0.195)][r2.0a2] released. 89358 lines.</strong>
 * v2.0, 2015-10-04, for [#448][bug #448] fix the bug of response of http hooks. 2.0.195
 * v2.0, 2015-10-01, for [#497][bug #497] response error when client not found to kickoff. 2.0.194
diff --git a/trunk/src/app/srs_app_hls.cpp b/trunk/src/app/srs_app_hls.cpp
index 64a8396c0..71360f6ef 100644
--- a/trunk/src/app/srs_app_hls.cpp
+++ b/trunk/src/app/srs_app_hls.cpp
@@ -578,6 +578,7 @@ int SrsHlsMuxer::segment_open(int64_t segment_start_dts)
         current->full_path.c_str(), tmp_file.c_str());
 
     // set the segment muxer audio codec.
+    // TODO: FIXME: refine code, use event instead.
     if (acodec != SrsCodecAudioReserved1) {
         current->muxer->update_acodec(acodec);
     }
@@ -1044,7 +1045,7 @@ int SrsHlsCache::on_sequence_header(SrsHlsMuxer* muxer)
     // when the sequence header changed, the stream is not republish.
     return muxer->on_sequence_header();
 }
-    
+
 int SrsHlsCache::write_audio(SrsAvcAacCodec* codec, SrsHlsMuxer* muxer, int64_t pts, SrsCodecSample* sample)
 {
     int ret = ERROR_SUCCESS;
@@ -1069,6 +1070,13 @@ int SrsHlsCache::write_audio(SrsAvcAacCodec* codec, SrsHlsMuxer* muxer, int64_t
         }
     }
     
+    // for pure audio, aggregate some frame to one.
+    if (muxer->pure_audio() && cache->audio) {
+        if (pts - cache->audio->start_pts < SRS_CONSTS_HLS_PURE_AUDIO_AGGREGATE) {
+            return ret;
+        }
+    }
+    
     // directly write the audio frame by frame to ts,
     // it's ok for the hls overload, or maybe cause the audio corrupt,
     // which introduced by aggregate the audios to a big one.
diff --git a/trunk/src/core/srs_core.hpp b/trunk/src/core/srs_core.hpp
index d4d96eb3e..d059c1afa 100644
--- a/trunk/src/core/srs_core.hpp
+++ b/trunk/src/core/srs_core.hpp
@@ -31,7 +31,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 // current release version
 #define VERSION_MAJOR       2
 #define VERSION_MINOR       0
-#define VERSION_REVISION    195
+#define VERSION_REVISION    196
 
 // server info.
 #define RTMP_SIG_SRS_KEY "SRS"
diff --git a/trunk/src/kernel/srs_kernel_ts.cpp b/trunk/src/kernel/srs_kernel_ts.cpp
index 864e05aa8..e0a9961a6 100644
--- a/trunk/src/kernel/srs_kernel_ts.cpp
+++ b/trunk/src/kernel/srs_kernel_ts.cpp
@@ -459,8 +459,11 @@ int SrsTsContext::encode_pes(SrsFileWriter* writer, SrsTsMessage* msg, int16_t p
     while (p < end) {
         SrsTsPacket* pkt = NULL;
         if (p == start) {
-            // for pure audio stream, always write pcr.
+            // write pcr according to message.
             bool write_pcr = msg->write_pcr;
+            
+            // for pure audio, always write pcr.
+            // TODO: FIXME: maybe only need to write at begin and end of ts.
             if (pure_audio && msg->is_audio()) {
                 write_pcr = true;
             }
@@ -2785,11 +2788,12 @@ int SrsTsCache::cache_audio(SrsAvcAacCodec* codec, int64_t dts, SrsCodecSample*
     if (!audio) {
         audio = new SrsTsMessage();
         audio->write_pcr = false;
-        audio->start_pts = dts;
+        audio->dts = audio->pts = audio->start_pts = dts;
     }
 
-    audio->dts = dts;
-    audio->pts = audio->dts;
+    // TODO: FIXME: refine code.
+    //audio->dts = dts;
+    //audio->pts = audio->dts;
     audio->sid = SrsTsPESStreamIdAudioCommon;
     
     // must be aac or mp3
@@ -3139,6 +3143,8 @@ int SrsTsEncoder::write_audio(int64_t timestamp, char* data, int size)
         return ret;
     }
     
+    // TODO: FIXME: for pure audio, aggregate some frame to one.
+    
     // always flush audio frame by frame.
     // @see https://github.com/simple-rtmp-server/srs/issues/512
     return flush_audio();
diff --git a/trunk/src/kernel/srs_kernel_ts.hpp b/trunk/src/kernel/srs_kernel_ts.hpp
index 3003f6cf3..42d40a8af 100644
--- a/trunk/src/kernel/srs_kernel_ts.hpp
+++ b/trunk/src/kernel/srs_kernel_ts.hpp
@@ -54,6 +54,9 @@ class SrsTsContext;
 // Transport Stream packets are 188 bytes in length.
 #define SRS_TS_PACKET_SIZE          188
 
+// the aggregate pure audio for hls, in ts tbn(ms * 90).
+#define SRS_CONSTS_HLS_PURE_AUDIO_AGGREGATE 720 * 90
+
 /**
 * the pid of ts packet,
 * Table 2-3 - PID table, hls-mpeg-ts-iso13818-1.pdf, page 37
@@ -359,6 +362,7 @@ public:
     /**
      * whether the hls stream is pure audio stream.
      */
+    // TODO: FIXME: merge with muxer codec detect.
     virtual bool is_pure_audio();
     /**
      * when PMT table parsed, we know some info about stream.