winlin

calc the delta for time jitter for video

@@ -68,11 +68,11 @@ int SrsConsumer::get_time() @@ -68,11 +68,11 @@ int SrsConsumer::get_time()
68 return (int)last_pkt_correct_time; 68 return (int)last_pkt_correct_time;
69 } 69 }
70 70
71 -int SrsConsumer::enqueue(SrsSharedPtrMessage* msg, int audio_sample_rate) 71 +int SrsConsumer::enqueue(SrsSharedPtrMessage* msg, int audio_sample_rate, int video_frame_rate)
72 { 72 {
73 int ret = ERROR_SUCCESS; 73 int ret = ERROR_SUCCESS;
74 74
75 - if ((ret = jitter_correct(msg, audio_sample_rate)) != ERROR_SUCCESS) { 75 + if ((ret = jitter_correct(msg, audio_sample_rate, video_frame_rate)) != ERROR_SUCCESS) {
76 return ret; 76 return ret;
77 } 77 }
78 78
@@ -179,7 +179,7 @@ void SrsConsumer::shrink() @@ -179,7 +179,7 @@ void SrsConsumer::shrink()
179 } 179 }
180 } 180 }
181 181
182 -int SrsConsumer::jitter_correct(SrsSharedPtrMessage* msg, int audio_sample_rate) 182 +int SrsConsumer::jitter_correct(SrsSharedPtrMessage* msg, int audio_sample_rate, int video_frame_rate)
183 { 183 {
184 int ret = ERROR_SUCCESS; 184 int ret = ERROR_SUCCESS;
185 185
@@ -201,6 +201,8 @@ int SrsConsumer::jitter_correct(SrsSharedPtrMessage* msg, int audio_sample_rate) @@ -201,6 +201,8 @@ int SrsConsumer::jitter_correct(SrsSharedPtrMessage* msg, int audio_sample_rate)
201 // calc the right diff by audio sample rate 201 // calc the right diff by audio sample rate
202 if (msg->header.is_audio() && audio_sample_rate > 0) { 202 if (msg->header.is_audio() && audio_sample_rate > 0) {
203 delta = (int32_t)(delta * 1000.0 / audio_sample_rate); 203 delta = (int32_t)(delta * 1000.0 / audio_sample_rate);
  204 + } else if (msg->header.is_video() && video_frame_rate > 0) {
  205 + delta = (int32_t)(delta * 1.0 / video_frame_rate);
204 } else { 206 } else {
205 delta = DEFAULT_FRAME_TIME_MS; 207 delta = DEFAULT_FRAME_TIME_MS;
206 } 208 }
@@ -244,7 +246,7 @@ SrsSource::SrsSource(std::string _stream_url) @@ -244,7 +246,7 @@ SrsSource::SrsSource(std::string _stream_url)
244 cached_video_count = 0; 246 cached_video_count = 0;
245 enable_gop_cache = true; 247 enable_gop_cache = true;
246 248
247 - audio_sample_rate = 0; 249 + video_frame_rate = audio_sample_rate = 0;
248 } 250 }
249 251
250 SrsSource::~SrsSource() 252 SrsSource::~SrsSource()
@@ -278,6 +280,11 @@ int SrsSource::on_meta_data(SrsCommonMessage* msg, SrsOnMetaDataPacket* metadata @@ -278,6 +280,11 @@ int SrsSource::on_meta_data(SrsCommonMessage* msg, SrsOnMetaDataPacket* metadata
278 audio_sample_rate = (int)(srs_amf0_convert<SrsAmf0Number>(prop)->value); 280 audio_sample_rate = (int)(srs_amf0_convert<SrsAmf0Number>(prop)->value);
279 } 281 }
280 } 282 }
  283 + if ((prop = metadata->metadata->get_property("framerate")) != NULL) {
  284 + if (prop->is_number()) {
  285 + video_frame_rate = (int)(srs_amf0_convert<SrsAmf0Number>(prop)->value);
  286 + }
  287 + }
281 288
282 // encode the metadata to payload 289 // encode the metadata to payload
283 int size = metadata->get_payload_length(); 290 int size = metadata->get_payload_length();
@@ -311,7 +318,7 @@ int SrsSource::on_meta_data(SrsCommonMessage* msg, SrsOnMetaDataPacket* metadata @@ -311,7 +318,7 @@ int SrsSource::on_meta_data(SrsCommonMessage* msg, SrsOnMetaDataPacket* metadata
311 std::vector<SrsConsumer*>::iterator it; 318 std::vector<SrsConsumer*>::iterator it;
312 for (it = consumers.begin(); it != consumers.end(); ++it) { 319 for (it = consumers.begin(); it != consumers.end(); ++it) {
313 SrsConsumer* consumer = *it; 320 SrsConsumer* consumer = *it;
314 - if ((ret = consumer->enqueue(cache_metadata->copy(), audio_sample_rate)) != ERROR_SUCCESS) { 321 + if ((ret = consumer->enqueue(cache_metadata->copy(), audio_sample_rate, video_frame_rate)) != ERROR_SUCCESS) {
315 srs_error("dispatch the metadata failed. ret=%d", ret); 322 srs_error("dispatch the metadata failed. ret=%d", ret);
316 return ret; 323 return ret;
317 } 324 }
@@ -341,7 +348,7 @@ int SrsSource::on_audio(SrsCommonMessage* audio) @@ -341,7 +348,7 @@ int SrsSource::on_audio(SrsCommonMessage* audio)
341 std::vector<SrsConsumer*>::iterator it; 348 std::vector<SrsConsumer*>::iterator it;
342 for (it = consumers.begin(); it != consumers.end(); ++it) { 349 for (it = consumers.begin(); it != consumers.end(); ++it) {
343 SrsConsumer* consumer = *it; 350 SrsConsumer* consumer = *it;
344 - if ((ret = consumer->enqueue(msg->copy(), audio_sample_rate)) != ERROR_SUCCESS) { 351 + if ((ret = consumer->enqueue(msg->copy(), audio_sample_rate, video_frame_rate)) != ERROR_SUCCESS) {
345 srs_error("dispatch the audio failed. ret=%d", ret); 352 srs_error("dispatch the audio failed. ret=%d", ret);
346 return ret; 353 return ret;
347 } 354 }
@@ -385,7 +392,7 @@ int SrsSource::on_video(SrsCommonMessage* video) @@ -385,7 +392,7 @@ int SrsSource::on_video(SrsCommonMessage* video)
385 std::vector<SrsConsumer*>::iterator it; 392 std::vector<SrsConsumer*>::iterator it;
386 for (it = consumers.begin(); it != consumers.end(); ++it) { 393 for (it = consumers.begin(); it != consumers.end(); ++it) {
387 SrsConsumer* consumer = *it; 394 SrsConsumer* consumer = *it;
388 - if ((ret = consumer->enqueue(msg->copy(), audio_sample_rate)) != ERROR_SUCCESS) { 395 + if ((ret = consumer->enqueue(msg->copy(), audio_sample_rate, video_frame_rate)) != ERROR_SUCCESS) {
389 srs_error("dispatch the video failed. ret=%d", ret); 396 srs_error("dispatch the video failed. ret=%d", ret);
390 return ret; 397 return ret;
391 } 398 }
@@ -416,19 +423,19 @@ int SrsSource::on_video(SrsCommonMessage* video) @@ -416,19 +423,19 @@ int SrsSource::on_video(SrsCommonMessage* video)
416 consumer = new SrsConsumer(this); 423 consumer = new SrsConsumer(this);
417 consumers.push_back(consumer); 424 consumers.push_back(consumer);
418 425
419 - if (cache_metadata && (ret = consumer->enqueue(cache_metadata->copy(), audio_sample_rate)) != ERROR_SUCCESS) { 426 + if (cache_metadata && (ret = consumer->enqueue(cache_metadata->copy(), audio_sample_rate, video_frame_rate)) != ERROR_SUCCESS) {
420 srs_error("dispatch metadata failed. ret=%d", ret); 427 srs_error("dispatch metadata failed. ret=%d", ret);
421 return ret; 428 return ret;
422 } 429 }
423 srs_info("dispatch metadata success"); 430 srs_info("dispatch metadata success");
424 431
425 - if (cache_sh_video && (ret = consumer->enqueue(cache_sh_video->copy(), audio_sample_rate)) != ERROR_SUCCESS) { 432 + if (cache_sh_video && (ret = consumer->enqueue(cache_sh_video->copy(), audio_sample_rate, video_frame_rate)) != ERROR_SUCCESS) {
426 srs_error("dispatch video sequence header failed. ret=%d", ret); 433 srs_error("dispatch video sequence header failed. ret=%d", ret);
427 return ret; 434 return ret;
428 } 435 }
429 srs_info("dispatch video sequence header success"); 436 srs_info("dispatch video sequence header success");
430 437
431 - if (cache_sh_audio && (ret = consumer->enqueue(cache_sh_audio->copy(), audio_sample_rate)) != ERROR_SUCCESS) { 438 + if (cache_sh_audio && (ret = consumer->enqueue(cache_sh_audio->copy(), audio_sample_rate, video_frame_rate)) != ERROR_SUCCESS) {
432 srs_error("dispatch audio sequence header failed. ret=%d", ret); 439 srs_error("dispatch audio sequence header failed. ret=%d", ret);
433 return ret; 440 return ret;
434 } 441 }
@@ -437,7 +444,7 @@ int SrsSource::on_video(SrsCommonMessage* video) @@ -437,7 +444,7 @@ int SrsSource::on_video(SrsCommonMessage* video)
437 std::vector<SrsSharedPtrMessage*>::iterator it; 444 std::vector<SrsSharedPtrMessage*>::iterator it;
438 for (it = gop_cache.begin(); it != gop_cache.end(); ++it) { 445 for (it = gop_cache.begin(); it != gop_cache.end(); ++it) {
439 SrsSharedPtrMessage* msg = *it; 446 SrsSharedPtrMessage* msg = *it;
440 - if ((ret = consumer->enqueue(msg->copy(), audio_sample_rate)) != ERROR_SUCCESS) { 447 + if ((ret = consumer->enqueue(msg->copy(), audio_sample_rate, video_frame_rate)) != ERROR_SUCCESS) {
441 srs_error("dispatch cached gop failed. ret=%d", ret); 448 srs_error("dispatch cached gop failed. ret=%d", ret);
442 return ret; 449 return ret;
443 } 450 }
@@ -62,8 +62,10 @@ public: @@ -62,8 +62,10 @@ public:
62 virtual int get_time(); 62 virtual int get_time();
63 /** 63 /**
64 * enqueue an shared ptr message. 64 * enqueue an shared ptr message.
  65 + * @param audio_sample_rate used to calc the audio time delta if time-jitter detected.
  66 + * @param video_frame_rate used to calc the video time delta if time-jitter detected.
65 */ 67 */
66 - virtual int enqueue(SrsSharedPtrMessage* msg, int audio_sample_rate); 68 + virtual int enqueue(SrsSharedPtrMessage* msg, int audio_sample_rate, int video_frame_rate);
67 /** 69 /**
68 * get packets in consumer queue. 70 * get packets in consumer queue.
69 * @pmsgs SrsMessages*[], output the prt array. 71 * @pmsgs SrsMessages*[], output the prt array.
@@ -84,7 +86,7 @@ private: @@ -84,7 +86,7 @@ private:
84 /** 86 /**
85 * detect the time jitter and correct it. 87 * detect the time jitter and correct it.
86 */ 88 */
87 - virtual int jitter_correct(SrsSharedPtrMessage* msg, int audio_sample_rate); 89 + virtual int jitter_correct(SrsSharedPtrMessage* msg, int audio_sample_rate, int video_frame_rate);
88 virtual void clear(); 90 virtual void clear();
89 }; 91 };
90 92
@@ -128,6 +130,10 @@ private: @@ -128,6 +130,10 @@ private:
128 * the sample rate of audio in metadata. 130 * the sample rate of audio in metadata.
129 */ 131 */
130 int audio_sample_rate; 132 int audio_sample_rate;
  133 + /**
  134 + * the video frame rate in metadata.
  135 + */
  136 + int video_frame_rate;
131 private: 137 private:
132 SrsSharedPtrMessage* cache_metadata; 138 SrsSharedPtrMessage* cache_metadata;
133 // the cached video sequence header. 139 // the cached video sequence header.