正在显示
5 个修改的文件
包含
48 行增加
和
34 行删除
| @@ -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. |
-
请 注册 或 登录 后发表评论