From 1401f2e0ab3549be8fa6bb68c5bf15ea465b15b3 Mon Sep 17 00:00:00 2001 From: winlin Date: Thu, 26 Mar 2015 11:07:45 +0800 Subject: [PATCH 1/4] ignore when sps/pps consumed all frame. --- trunk/src/app/srs_app_mpegts_udp.cpp | 20 +++++++++++--------- trunk/src/kernel/srs_kernel_flv.cpp | 1 + 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/trunk/src/app/srs_app_mpegts_udp.cpp b/trunk/src/app/srs_app_mpegts_udp.cpp index 5efba53ef..dd6c605ad 100644 --- a/trunk/src/app/srs_app_mpegts_udp.cpp +++ b/trunk/src/app/srs_app_mpegts_udp.cpp @@ -353,6 +353,7 @@ int SrsMpegtsOverUdp::on_ts_video(SrsTsMessage* msg, SrsStream* avs) int ibpframe_size = avs->size() - avs->pos(); // send each frame. + bool got_sps_pps = false; while (!avs->empty()) { char* frame = NULL; int frame_size = 0; @@ -369,6 +370,8 @@ int SrsMpegtsOverUdp::on_ts_video(SrsTsMessage* msg, SrsStream* avs) // for sps if (avc->is_sps(frame, frame_size)) { + got_sps_pps = true; + std::string sps; if ((ret = avc->sps_demux(frame, frame_size, sps)) != ERROR_SUCCESS) { return ret; @@ -388,6 +391,8 @@ int SrsMpegtsOverUdp::on_ts_video(SrsTsMessage* msg, SrsStream* avs) // for pps if (avc->is_pps(frame, frame_size)) { + got_sps_pps = true; + std::string pps; if ((ret = avc->pps_demux(frame, frame_size, pps)) != ERROR_SUCCESS) { return ret; @@ -404,18 +409,15 @@ int SrsMpegtsOverUdp::on_ts_video(SrsTsMessage* msg, SrsStream* avs) } continue; } - - // regenerat the ibp frame. - if (!avs->empty()) { - ibpframe = avs->data() + avs->pos(); - ibpframe_size = avs->size() - avs->pos(); - } else { - srs_info("mpegts: sps/pps frame consumed."); - return ret; - } break; } + + // not ibp frame, ignore for already sent. + if (got_sps_pps) { + srs_info("mpegts: already send the sps/pps."); + return ret; + } // ibp frame. srs_info("mpegts: demux avc ibp frame size=%d, dts=%d", ibpframe_size, dts); diff --git a/trunk/src/kernel/srs_kernel_flv.cpp b/trunk/src/kernel/srs_kernel_flv.cpp index 7d1923266..d34cb30fb 100644 --- a/trunk/src/kernel/srs_kernel_flv.cpp +++ b/trunk/src/kernel/srs_kernel_flv.cpp @@ -103,6 +103,7 @@ int SrsFlvEncoder::write_header(char flv_header[9]) return ret; } + // previous tag size. char pts[] = { (char)0x00, (char)0x00, (char)0x00, (char)0x00 }; if ((ret = _fs->write(pts, 4, NULL)) != ERROR_SUCCESS) { return ret; From 896983c1dce21fcc99be28c7f0df248eccb1acd1 Mon Sep 17 00:00:00 2001 From: winlin Date: Thu, 26 Mar 2015 11:31:40 +0800 Subject: [PATCH 2/4] refine the aac codec enum name --- trunk/src/kernel/srs_kernel_codec.cpp | 8 ++++---- trunk/src/kernel/srs_kernel_codec.hpp | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/trunk/src/kernel/srs_kernel_codec.cpp b/trunk/src/kernel/srs_kernel_codec.cpp index 20f636276..f695b4f49 100644 --- a/trunk/src/kernel/srs_kernel_codec.cpp +++ b/trunk/src/kernel/srs_kernel_codec.cpp @@ -91,8 +91,8 @@ string srs_codec_aac_object2str(SrsAacObjectType aac_object) { switch (aac_object) { case SrsAacObjectTypeAacMain: return "Main"; - case SrsAacObjectTypeHE: return "HE"; - case SrsAacObjectTypeHEV2: return "HEv2"; + case SrsAacObjectTypeAacHE: return "HE"; + case SrsAacObjectTypeAacHEV2: return "HEv2"; case SrsAacObjectTypeAacLC: return "LC"; case SrsAacObjectTypeAacSSR: return "SSR"; default: return "Other"; @@ -113,8 +113,8 @@ SrsAacProfile srs_codec_aac_rtmp2ts(SrsAacObjectType object_type) { switch (object_type) { case SrsAacObjectTypeAacMain: return SrsAacProfileMain; - case SrsAacObjectTypeHE: - case SrsAacObjectTypeHEV2: + case SrsAacObjectTypeAacHE: + case SrsAacObjectTypeAacHEV2: case SrsAacObjectTypeAacLC: return SrsAacProfileLC; case SrsAacObjectTypeAacSSR: return SrsAacProfileSSR; default: return SrsAacProfileReserved; diff --git a/trunk/src/kernel/srs_kernel_codec.hpp b/trunk/src/kernel/srs_kernel_codec.hpp index 033484ef3..b619bb9e1 100644 --- a/trunk/src/kernel/srs_kernel_codec.hpp +++ b/trunk/src/kernel/srs_kernel_codec.hpp @@ -406,9 +406,9 @@ enum SrsAacObjectType SrsAacObjectTypeAacSSR = 3, // AAC HE = LC+SBR - SrsAacObjectTypeHE = 5, + SrsAacObjectTypeAacHE = 5, // AAC HEv2 = LC+SBR+PS - SrsAacObjectTypeHEV2 = 29, + SrsAacObjectTypeAacHEV2 = 29, }; std::string srs_codec_aac_object2str(SrsAacObjectType aac_object); // ts/hls/adts audio header profile to RTMP sequence header object type. From a5c5befad10e7b4c331d2eb095e315e83c69502c Mon Sep 17 00:00:00 2001 From: winlin Date: Thu, 26 Mar 2015 19:52:21 +0800 Subject: [PATCH 3/4] for parse video ts. --- trunk/src/app/srs_app_mpegts_udp.cpp | 21 +++++++-------------- 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/trunk/src/app/srs_app_mpegts_udp.cpp b/trunk/src/app/srs_app_mpegts_udp.cpp index dd6c605ad..8248bbbe6 100644 --- a/trunk/src/app/srs_app_mpegts_udp.cpp +++ b/trunk/src/app/srs_app_mpegts_udp.cpp @@ -353,7 +353,6 @@ int SrsMpegtsOverUdp::on_ts_video(SrsTsMessage* msg, SrsStream* avs) int ibpframe_size = avs->size() - avs->pos(); // send each frame. - bool got_sps_pps = false; while (!avs->empty()) { char* frame = NULL; int frame_size = 0; @@ -370,8 +369,6 @@ int SrsMpegtsOverUdp::on_ts_video(SrsTsMessage* msg, SrsStream* avs) // for sps if (avc->is_sps(frame, frame_size)) { - got_sps_pps = true; - std::string sps; if ((ret = avc->sps_demux(frame, frame_size, sps)) != ERROR_SUCCESS) { return ret; @@ -409,19 +406,15 @@ int SrsMpegtsOverUdp::on_ts_video(SrsTsMessage* msg, SrsStream* avs) } continue; } - - break; + + // ibp frame. + srs_info("mpegts: demux avc ibp frame size=%d, dts=%d", ibpframe_size, dts); + if ((ret = write_h264_ipb_frame(frame, frame_size, dts, pts)) != ERROR_SUCCESS) { + return ret; + } } - // not ibp frame, ignore for already sent. - if (got_sps_pps) { - srs_info("mpegts: already send the sps/pps."); - return ret; - } - - // ibp frame. - srs_info("mpegts: demux avc ibp frame size=%d, dts=%d", ibpframe_size, dts); - return write_h264_ipb_frame(ibpframe, ibpframe_size, dts, pts); + return ret; } int SrsMpegtsOverUdp::write_h264_sps_pps(u_int32_t dts, u_int32_t pts) From 0faaa61be731a17fd348324051f994dec8fa5dda Mon Sep 17 00:00:00 2001 From: tufang14 Date: Thu, 26 Mar 2015 11:28:57 +0800 Subject: [PATCH 4/4] seg fault seg fault --- trunk/src/app/srs_app_thread.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/trunk/src/app/srs_app_thread.cpp b/trunk/src/app/srs_app_thread.cpp index 0b38c4d44..f37e49d70 100644 --- a/trunk/src/app/srs_app_thread.cpp +++ b/trunk/src/app/srs_app_thread.cpp @@ -210,11 +210,11 @@ failed: } } - handler->on_thread_stop(); - srs_info("thread %s cycle finished", _name); - // readly terminated now. really_terminated = true; + + handler->on_thread_stop(); + srs_info("thread %s cycle finished", _name); } void* SrsThread::thread_fun(void* arg)