winlin

ignore when sps/pps consumed all frame.

@@ -353,6 +353,7 @@ int SrsMpegtsOverUdp::on_ts_video(SrsTsMessage* msg, SrsStream* avs) @@ -353,6 +353,7 @@ int SrsMpegtsOverUdp::on_ts_video(SrsTsMessage* msg, SrsStream* avs)
353 int ibpframe_size = avs->size() - avs->pos(); 353 int ibpframe_size = avs->size() - avs->pos();
354 354
355 // send each frame. 355 // send each frame.
  356 + bool got_sps_pps = false;
356 while (!avs->empty()) { 357 while (!avs->empty()) {
357 char* frame = NULL; 358 char* frame = NULL;
358 int frame_size = 0; 359 int frame_size = 0;
@@ -369,6 +370,8 @@ int SrsMpegtsOverUdp::on_ts_video(SrsTsMessage* msg, SrsStream* avs) @@ -369,6 +370,8 @@ int SrsMpegtsOverUdp::on_ts_video(SrsTsMessage* msg, SrsStream* avs)
369 370
370 // for sps 371 // for sps
371 if (avc->is_sps(frame, frame_size)) { 372 if (avc->is_sps(frame, frame_size)) {
  373 + got_sps_pps = true;
  374 +
372 std::string sps; 375 std::string sps;
373 if ((ret = avc->sps_demux(frame, frame_size, sps)) != ERROR_SUCCESS) { 376 if ((ret = avc->sps_demux(frame, frame_size, sps)) != ERROR_SUCCESS) {
374 return ret; 377 return ret;
@@ -388,6 +391,8 @@ int SrsMpegtsOverUdp::on_ts_video(SrsTsMessage* msg, SrsStream* avs) @@ -388,6 +391,8 @@ int SrsMpegtsOverUdp::on_ts_video(SrsTsMessage* msg, SrsStream* avs)
388 391
389 // for pps 392 // for pps
390 if (avc->is_pps(frame, frame_size)) { 393 if (avc->is_pps(frame, frame_size)) {
  394 + got_sps_pps = true;
  395 +
391 std::string pps; 396 std::string pps;
392 if ((ret = avc->pps_demux(frame, frame_size, pps)) != ERROR_SUCCESS) { 397 if ((ret = avc->pps_demux(frame, frame_size, pps)) != ERROR_SUCCESS) {
393 return ret; 398 return ret;
@@ -405,16 +410,13 @@ int SrsMpegtsOverUdp::on_ts_video(SrsTsMessage* msg, SrsStream* avs) @@ -405,16 +410,13 @@ int SrsMpegtsOverUdp::on_ts_video(SrsTsMessage* msg, SrsStream* avs)
405 continue; 410 continue;
406 } 411 }
407 412
408 - // regenerat the ibp frame.  
409 - if (!avs->empty()) {  
410 - ibpframe = avs->data() + avs->pos();  
411 - ibpframe_size = avs->size() - avs->pos();  
412 - } else {  
413 - srs_info("mpegts: sps/pps frame consumed.");  
414 - return ret; 413 + break;
415 } 414 }
416 415
417 - break; 416 + // not ibp frame, ignore for already sent.
  417 + if (got_sps_pps) {
  418 + srs_info("mpegts: already send the sps/pps.");
  419 + return ret;
418 } 420 }
419 421
420 // ibp frame. 422 // ibp frame.
@@ -103,6 +103,7 @@ int SrsFlvEncoder::write_header(char flv_header[9]) @@ -103,6 +103,7 @@ int SrsFlvEncoder::write_header(char flv_header[9])
103 return ret; 103 return ret;
104 } 104 }
105 105
  106 + // previous tag size.
106 char pts[] = { (char)0x00, (char)0x00, (char)0x00, (char)0x00 }; 107 char pts[] = { (char)0x00, (char)0x00, (char)0x00, (char)0x00 };
107 if ((ret = _fs->write(pts, 4, NULL)) != ERROR_SUCCESS) { 108 if ((ret = _fs->write(pts, 4, NULL)) != ERROR_SUCCESS) {
108 return ret; 109 return ret;