From 2cb8b7dd5286792f293a488e9588561b6d30f98b Mon Sep 17 00:00:00 2001 From: winlin Date: Thu, 4 Dec 2014 11:27:07 +0800 Subject: [PATCH] for bug #248, use simple buffer for hls. --- trunk/src/app/srs_app_hls.cpp | 73 +++++++++++++++++++++++++++-------- trunk/src/app/srs_app_hls.hpp | 50 ++++++++++++++++++++---- 2 files changed, 100 insertions(+), 23 deletions(-) diff --git a/trunk/src/app/srs_app_hls.cpp b/trunk/src/app/srs_app_hls.cpp index 4915514e6..801e72579 100644 --- a/trunk/src/app/srs_app_hls.cpp +++ b/trunk/src/app/srs_app_hls.cpp @@ -198,7 +198,7 @@ public: return ret; } - static int write_frame(SrsFileWriter* writer, SrsMpegtsFrame* frame, SrsBuffer* buffer) + static int write_frame(SrsFileWriter* writer, SrsMpegtsFrame* frame, SrsSimpleBuffer* buffer) { int ret = ERROR_SUCCESS; @@ -396,6 +396,56 @@ private: } }; +SrsSimpleBuffer::SrsSimpleBuffer() +{ +} + +SrsSimpleBuffer::~SrsSimpleBuffer() +{ +} + +int SrsSimpleBuffer::length() +{ + int len = (int)data.size(); + srs_assert(len >= 0); + return len; +} + +char* SrsSimpleBuffer::bytes() +{ + return (length() == 0)? NULL : &data.at(0); +} + +void SrsSimpleBuffer::erase(int size) +{ + if (size <= 0) { + return; + } + + if (size >= length()) { + data.clear(); + return; + } + + data.erase(data.begin(), data.begin() + size); +} + +void SrsSimpleBuffer::append(const char* bytes, int size) +{ + srs_assert(size > 0); + + data.insert(data.end(), bytes, bytes + size); +} + +SrsHlsAacJitter::SrsHlsAacJitter() +{ + base_pts = 0; + nb_samples = 0; + + // TODO: config it, 0 means no adjust + sync_ms = SRS_CONF_DEFAULT_AAC_SYNC; +} + SrsHlsAacJitter::~SrsHlsAacJitter() { } @@ -481,7 +531,7 @@ int SrsTSMuxer::open(string _path) return ret; } -int SrsTSMuxer::write_audio(SrsMpegtsFrame* af, SrsBuffer* ab) +int SrsTSMuxer::write_audio(SrsMpegtsFrame* af, SrsSimpleBuffer* ab) { int ret = ERROR_SUCCESS; @@ -492,7 +542,7 @@ int SrsTSMuxer::write_audio(SrsMpegtsFrame* af, SrsBuffer* ab) return ret; } -int SrsTSMuxer::write_video(SrsMpegtsFrame* vf, SrsBuffer* vb) +int SrsTSMuxer::write_video(SrsMpegtsFrame* vf, SrsSimpleBuffer* vb) { int ret = ERROR_SUCCESS; @@ -538,15 +588,6 @@ void SrsHlsSegment::update_duration(int64_t current_frame_dts) return; } -SrsHlsAacJitter::SrsHlsAacJitter() -{ - base_pts = 0; - nb_samples = 0; - - // TODO: config it, 0 means no adjust - sync_ms = SRS_CONF_DEFAULT_AAC_SYNC; -} - SrsHlsMuxer::SrsHlsMuxer() { hls_fragment = hls_window = 0; @@ -654,7 +695,7 @@ bool SrsHlsMuxer::is_segment_overflow() return current->duration >= hls_fragment; } -int SrsHlsMuxer::flush_audio(SrsMpegtsFrame* af, SrsBuffer* ab) +int SrsHlsMuxer::flush_audio(SrsMpegtsFrame* af, SrsSimpleBuffer* ab) { int ret = ERROR_SUCCESS; @@ -681,7 +722,7 @@ int SrsHlsMuxer::flush_audio(SrsMpegtsFrame* af, SrsBuffer* ab) return ret; } -int SrsHlsMuxer::flush_video(SrsMpegtsFrame* /*af*/, SrsBuffer* /*ab*/, SrsMpegtsFrame* vf, SrsBuffer* vb) +int SrsHlsMuxer::flush_video(SrsMpegtsFrame* /*af*/, SrsSimpleBuffer* /*ab*/, SrsMpegtsFrame* vf, SrsSimpleBuffer* vb) { int ret = ERROR_SUCCESS; @@ -964,8 +1005,8 @@ SrsHlsCache::SrsHlsCache() { aac_jitter = new SrsHlsAacJitter(); - ab = new SrsBuffer(); - vb = new SrsBuffer(); + ab = new SrsSimpleBuffer(); + vb = new SrsSimpleBuffer(); af = new SrsMpegtsFrame(); vf = new SrsMpegtsFrame(); diff --git a/trunk/src/app/srs_app_hls.hpp b/trunk/src/app/srs_app_hls.hpp index d31820367..923b56859 100644 --- a/trunk/src/app/srs_app_hls.hpp +++ b/trunk/src/app/srs_app_hls.hpp @@ -50,7 +50,6 @@ extern int aac_sample_rates[]; #include #include -class SrsBuffer; class SrsSharedPtrMessage; class SrsCodecSample; class SrsMpegtsFrame; @@ -63,6 +62,43 @@ class SrsPithyPrint; class SrsSource; class SrsFileWriter; +/** +* the simple buffer use vector to append bytes, +* it's for hls, and need to be refined in future. +*/ +class SrsSimpleBuffer +{ +private: + std::vector data; +public: + SrsSimpleBuffer(); + virtual ~SrsSimpleBuffer(); +public: + /** + * get the length of buffer. empty if zero. + * @remark assert length() is not negative. + */ + virtual int length(); + /** + * get the buffer bytes. + * @return the bytes, NULL if empty. + */ + virtual char* bytes(); + /** + * erase size of bytes from begin. + * @param size to erase size of bytes. + * clear if size greater than or equals to length() + * @remark ignore size is not positive. + */ + virtual void erase(int size); + /** + * append specified bytes to buffer. + * @param size the size of bytes + * @remark assert size is positive. + */ + virtual void append(const char* bytes, int size); +}; + /** * jitter correct for audio, * the sample rate 44100/32000 will lost precise, @@ -109,8 +145,8 @@ public: virtual ~SrsTSMuxer(); public: virtual int open(std::string _path); - virtual int write_audio(SrsMpegtsFrame* af, SrsBuffer* ab); - virtual int write_video(SrsMpegtsFrame* vf, SrsBuffer* vb); + virtual int write_audio(SrsMpegtsFrame* af, SrsSimpleBuffer* ab); + virtual int write_video(SrsMpegtsFrame* vf, SrsSimpleBuffer* vb); virtual void close(); }; @@ -196,8 +232,8 @@ public: * that is whether the current segment duration >= the segment in config */ virtual bool is_segment_overflow(); - virtual int flush_audio(SrsMpegtsFrame* af, SrsBuffer* ab); - virtual int flush_video(SrsMpegtsFrame* af, SrsBuffer* ab, SrsMpegtsFrame* vf, SrsBuffer* vb); + virtual int flush_audio(SrsMpegtsFrame* af, SrsSimpleBuffer* ab); + virtual int flush_video(SrsMpegtsFrame* af, SrsSimpleBuffer* ab, SrsMpegtsFrame* vf, SrsSimpleBuffer* vb); /** * close segment(ts). * @param log_desc the description for log. @@ -231,9 +267,9 @@ class SrsHlsCache private: // current frame and buffer SrsMpegtsFrame* af; - SrsBuffer* ab; + SrsSimpleBuffer* ab; SrsMpegtsFrame* vf; - SrsBuffer* vb; + SrsSimpleBuffer* vb; private: // the audio cache buffer start pts, to flush audio if full. int64_t audio_buffer_start_pts;