winlin

refine hls, support time jitter detect and correct

@@ -109,7 +109,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. @@ -109,7 +109,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
109 109
110 #define ERROR_HLS_METADATA 600 110 #define ERROR_HLS_METADATA 600
111 #define ERROR_HLS_DECODE_ERROR 601 111 #define ERROR_HLS_DECODE_ERROR 601
112 -#define ERROR_HLS_BUSY 602 112 +//#define ERROR_HLS_BUSY 602
113 #define ERROR_HLS_OPEN_FAILED 603 113 #define ERROR_HLS_OPEN_FAILED 603
114 #define ERROR_HLS_WRITE_FAILED 604 114 #define ERROR_HLS_WRITE_FAILED 604
115 #define ERROR_HLS_AAC_FRAME_LENGTH 605 115 #define ERROR_HLS_AAC_FRAME_LENGTH 605
@@ -34,6 +34,8 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. @@ -34,6 +34,8 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
34 #include <srs_core_amf0.hpp> 34 #include <srs_core_amf0.hpp>
35 #include <srs_core_protocol.hpp> 35 #include <srs_core_protocol.hpp>
36 #include <srs_core_config.hpp> 36 #include <srs_core_config.hpp>
  37 +#include <srs_core_source.hpp>
  38 +#include <srs_core_autofree.hpp>
37 39
38 SrsHLS::SrsHLS() 40 SrsHLS::SrsHLS()
39 { 41 {
@@ -56,10 +58,10 @@ int SrsHLS::on_publish(std::string _vhost) @@ -56,10 +58,10 @@ int SrsHLS::on_publish(std::string _vhost)
56 { 58 {
57 int ret = ERROR_SUCCESS; 59 int ret = ERROR_SUCCESS;
58 60
  61 + // TODO: check config.
59 if (muxer) { 62 if (muxer) {
60 - ret = ERROR_HLS_BUSY;  
61 - srs_error("hls is busy, something error, "  
62 - "vhost=%s, ret=%d", _vhost.c_str(), ret); 63 + hls_enabled = true;
  64 + srs_trace("hls is reopen, continue streaming HLS, vhost=%s", _vhost.c_str());
63 return ret; 65 return ret;
64 } 66 }
65 67
@@ -96,8 +98,8 @@ int SrsHLS::on_publish(std::string _vhost) @@ -96,8 +98,8 @@ int SrsHLS::on_publish(std::string _vhost)
96 void SrsHLS::on_unpublish() 98 void SrsHLS::on_unpublish()
97 { 99 {
98 hls_enabled = false; 100 hls_enabled = false;
99 - muxer->close();  
100 - srs_freep(muxer); 101 + //muxer->close();
  102 + //srs_freep(muxer);
101 } 103 }
102 104
103 int SrsHLS::on_meta_data(SrsOnMetaDataPacket* metadata) 105 int SrsHLS::on_meta_data(SrsOnMetaDataPacket* metadata)
@@ -152,10 +154,12 @@ int SrsHLS::on_meta_data(SrsOnMetaDataPacket* metadata) @@ -152,10 +154,12 @@ int SrsHLS::on_meta_data(SrsOnMetaDataPacket* metadata)
152 return ret; 154 return ret;
153 } 155 }
154 156
155 -int SrsHLS::on_audio(SrsCommonMessage* audio) 157 +int SrsHLS::on_audio(SrsSharedPtrMessage* audio)
156 { 158 {
157 int ret = ERROR_SUCCESS; 159 int ret = ERROR_SUCCESS;
158 160
  161 + SrsAutoFree(SrsSharedPtrMessage, audio, false);
  162 +
159 sample->clear(); 163 sample->clear();
160 if ((ret = codec->audio_aac_demux(audio->payload, audio->size, sample)) != ERROR_SUCCESS) { 164 if ((ret = codec->audio_aac_demux(audio->payload, audio->size, sample)) != ERROR_SUCCESS) {
161 return ret; 165 return ret;
@@ -175,20 +179,23 @@ int SrsHLS::on_audio(SrsCommonMessage* audio) @@ -175,20 +179,23 @@ int SrsHLS::on_audio(SrsCommonMessage* audio)
175 return ret; 179 return ret;
176 } 180 }
177 181
178 - u_int32_t timestamp = audio->header.timestamp;  
179 - // TODO: correct the timestamp. 182 + if ((ret = jitter->correct(audio, 0, 0)) != ERROR_SUCCESS) {
  183 + return ret;
  184 + }
180 185
181 - if ((ret = muxer->write_audio(timestamp, codec, sample)) != ERROR_SUCCESS) { 186 + if ((ret = muxer->write_audio(audio->header.timestamp, codec, sample)) != ERROR_SUCCESS) {
182 return ret; 187 return ret;
183 } 188 }
184 189
185 return ret; 190 return ret;
186 } 191 }
187 192
188 -int SrsHLS::on_video(SrsCommonMessage* video) 193 +int SrsHLS::on_video(SrsSharedPtrMessage* video)
189 { 194 {
190 int ret = ERROR_SUCCESS; 195 int ret = ERROR_SUCCESS;
191 196
  197 + SrsAutoFree(SrsSharedPtrMessage, video, false);
  198 +
192 sample->clear(); 199 sample->clear();
193 if ((ret = codec->video_avc_demux(video->payload, video->size, sample)) != ERROR_SUCCESS) { 200 if ((ret = codec->video_avc_demux(video->payload, video->size, sample)) != ERROR_SUCCESS) {
194 return ret; 201 return ret;
@@ -208,10 +215,11 @@ int SrsHLS::on_video(SrsCommonMessage* video) @@ -208,10 +215,11 @@ int SrsHLS::on_video(SrsCommonMessage* video)
208 return ret; 215 return ret;
209 } 216 }
210 217
211 - u_int32_t timestamp = video->header.timestamp;  
212 - // TODO: correct the timestamp. 218 + if ((ret = jitter->correct(video, 0, 0)) != ERROR_SUCCESS) {
  219 + return ret;
  220 + }
213 221
214 - if ((ret = muxer->write_video(timestamp, codec, sample)) != ERROR_SUCCESS) { 222 + if ((ret = muxer->write_video(video->header.timestamp, codec, sample)) != ERROR_SUCCESS) {
215 return ret; 223 return ret;
216 } 224 }
217 225
@@ -32,7 +32,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. @@ -32,7 +32,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
32 #include <string> 32 #include <string>
33 33
34 class SrsOnMetaDataPacket; 34 class SrsOnMetaDataPacket;
35 -class SrsCommonMessage; 35 +class SrsSharedPtrMessage;
36 class SrsCodecSample; 36 class SrsCodecSample;
37 class SrsCodecBuffer; 37 class SrsCodecBuffer;
38 class SrsMpegtsFrame; 38 class SrsMpegtsFrame;
@@ -56,8 +56,8 @@ public: @@ -56,8 +56,8 @@ public:
56 virtual int on_publish(std::string _vhost); 56 virtual int on_publish(std::string _vhost);
57 virtual void on_unpublish(); 57 virtual void on_unpublish();
58 virtual int on_meta_data(SrsOnMetaDataPacket* metadata); 58 virtual int on_meta_data(SrsOnMetaDataPacket* metadata);
59 - virtual int on_audio(SrsCommonMessage* audio);  
60 - virtual int on_video(SrsCommonMessage* video); 59 + virtual int on_audio(SrsSharedPtrMessage* audio);
  60 + virtual int on_video(SrsSharedPtrMessage* video);
61 }; 61 };
62 62
63 class SrsTSMuxer 63 class SrsTSMuxer
@@ -45,10 +45,13 @@ SrsRtmpJitter::~SrsRtmpJitter() @@ -45,10 +45,13 @@ SrsRtmpJitter::~SrsRtmpJitter()
45 { 45 {
46 } 46 }
47 47
48 -int SrsRtmpJitter::correct(SrsSharedPtrMessage* msg, int audio_sample_rate, int video_frame_rate) 48 +int SrsRtmpJitter::correct(SrsSharedPtrMessage* msg, int tba, int tbv)
49 { 49 {
50 int ret = ERROR_SUCCESS; 50 int ret = ERROR_SUCCESS;
51 51
  52 + int audio_sample_rate = tba;
  53 + int video_frame_rate = tbv;
  54 +
52 /** 55 /**
53 * we use a very simple time jitter detect/correct algorithm: 56 * we use a very simple time jitter detect/correct algorithm:
54 * 1. delta: ensure the delta is positive and valid, 57 * 1. delta: ensure the delta is positive and valid,
@@ -117,11 +120,12 @@ int SrsConsumer::get_time() @@ -117,11 +120,12 @@ int SrsConsumer::get_time()
117 return jitter->get_time(); 120 return jitter->get_time();
118 } 121 }
119 122
120 -int SrsConsumer::enqueue(SrsSharedPtrMessage* msg, int audio_sample_rate, int video_frame_rate) 123 +int SrsConsumer::enqueue(SrsSharedPtrMessage* msg, int tba, int tbv)
121 { 124 {
122 int ret = ERROR_SUCCESS; 125 int ret = ERROR_SUCCESS;
123 126
124 - if ((ret = jitter->correct(msg, audio_sample_rate, video_frame_rate)) != ERROR_SUCCESS) { 127 + if ((ret = jitter->correct(msg, tba, tbv)) != ERROR_SUCCESS) {
  128 + srs_freep(msg);
125 return ret; 129 return ret;
126 } 130 }
127 131
@@ -351,11 +355,6 @@ int SrsSource::on_audio(SrsCommonMessage* audio) @@ -351,11 +355,6 @@ int SrsSource::on_audio(SrsCommonMessage* audio)
351 { 355 {
352 int ret = ERROR_SUCCESS; 356 int ret = ERROR_SUCCESS;
353 357
354 - if ((ret = hls->on_audio(audio)) != ERROR_SUCCESS) {  
355 - srs_error("hls process audio message failed. ret=%d", ret);  
356 - return ret;  
357 - }  
358 -  
359 SrsSharedPtrMessage* msg = new SrsSharedPtrMessage(); 358 SrsSharedPtrMessage* msg = new SrsSharedPtrMessage();
360 SrsAutoFree(SrsSharedPtrMessage, msg, false); 359 SrsAutoFree(SrsSharedPtrMessage, msg, false);
361 if ((ret = msg->initialize(audio, (char*)audio->payload, audio->size)) != ERROR_SUCCESS) { 360 if ((ret = msg->initialize(audio, (char*)audio->payload, audio->size)) != ERROR_SUCCESS) {
@@ -364,6 +363,11 @@ int SrsSource::on_audio(SrsCommonMessage* audio) @@ -364,6 +363,11 @@ int SrsSource::on_audio(SrsCommonMessage* audio)
364 } 363 }
365 srs_verbose("initialize shared ptr audio success."); 364 srs_verbose("initialize shared ptr audio success.");
366 365
  366 + if ((ret = hls->on_audio(msg->copy())) != ERROR_SUCCESS) {
  367 + srs_error("hls process audio message failed. ret=%d", ret);
  368 + return ret;
  369 + }
  370 +
367 // detach the original audio 371 // detach the original audio
368 audio->payload = NULL; 372 audio->payload = NULL;
369 audio->size = 0; 373 audio->size = 0;
@@ -401,11 +405,6 @@ int SrsSource::on_video(SrsCommonMessage* video) @@ -401,11 +405,6 @@ int SrsSource::on_video(SrsCommonMessage* video)
401 { 405 {
402 int ret = ERROR_SUCCESS; 406 int ret = ERROR_SUCCESS;
403 407
404 - if ((ret = hls->on_video(video)) != ERROR_SUCCESS) {  
405 - srs_error("hls process video message failed. ret=%d", ret);  
406 - return ret;  
407 - }  
408 -  
409 SrsSharedPtrMessage* msg = new SrsSharedPtrMessage(); 408 SrsSharedPtrMessage* msg = new SrsSharedPtrMessage();
410 SrsAutoFree(SrsSharedPtrMessage, msg, false); 409 SrsAutoFree(SrsSharedPtrMessage, msg, false);
411 if ((ret = msg->initialize(video, (char*)video->payload, video->size)) != ERROR_SUCCESS) { 410 if ((ret = msg->initialize(video, (char*)video->payload, video->size)) != ERROR_SUCCESS) {
@@ -414,6 +413,11 @@ int SrsSource::on_video(SrsCommonMessage* video) @@ -414,6 +413,11 @@ int SrsSource::on_video(SrsCommonMessage* video)
414 } 413 }
415 srs_verbose("initialize shared ptr video success."); 414 srs_verbose("initialize shared ptr video success.");
416 415
  416 + if ((ret = hls->on_video(msg->copy())) != ERROR_SUCCESS) {
  417 + srs_error("hls process video message failed. ret=%d", ret);
  418 + return ret;
  419 + }
  420 +
417 // detach the original audio 421 // detach the original audio
418 video->payload = NULL; 422 video->payload = NULL;
419 video->size = 0; 423 video->size = 0;
@@ -56,7 +56,7 @@ public: @@ -56,7 +56,7 @@ public:
56 /** 56 /**
57 * detect the time jitter and correct it. 57 * detect the time jitter and correct it.
58 */ 58 */
59 - virtual int correct(SrsSharedPtrMessage* msg, int audio_sample_rate, int video_frame_rate); 59 + virtual int correct(SrsSharedPtrMessage* msg, int tba, int tbv);
60 /** 60 /**
61 * get current client time, the last packet time. 61 * get current client time, the last packet time.
62 */ 62 */
@@ -83,10 +83,12 @@ public: @@ -83,10 +83,12 @@ public:
83 virtual int get_time(); 83 virtual int get_time();
84 /** 84 /**
85 * enqueue an shared ptr message. 85 * enqueue an shared ptr message.
86 - * @param audio_sample_rate used to calc the audio time delta if time-jitter detected.  
87 - * @param video_frame_rate used to calc the video time delta if time-jitter detected. 86 + * @param tba timebase of audio.
  87 + * used to calc the audio time delta if time-jitter detected.
  88 + * @param tbv timebase of video.
  89 + * used to calc the video time delta if time-jitter detected.
88 */ 90 */
89 - virtual int enqueue(SrsSharedPtrMessage* msg, int audio_sample_rate, int video_frame_rate); 91 + virtual int enqueue(SrsSharedPtrMessage* msg, int tba, int tbv);
90 /** 92 /**
91 * get packets in consumer queue. 93 * get packets in consumer queue.
92 * @pmsgs SrsMessages*[], output the prt array. 94 * @pmsgs SrsMessages*[], output the prt array.