winlin

for bug #248, use simple buffer for hls.

@@ -198,7 +198,7 @@ public: @@ -198,7 +198,7 @@ public:
198 198
199 return ret; 199 return ret;
200 } 200 }
201 - static int write_frame(SrsFileWriter* writer, SrsMpegtsFrame* frame, SrsBuffer* buffer) 201 + static int write_frame(SrsFileWriter* writer, SrsMpegtsFrame* frame, SrsSimpleBuffer* buffer)
202 { 202 {
203 int ret = ERROR_SUCCESS; 203 int ret = ERROR_SUCCESS;
204 204
@@ -396,6 +396,56 @@ private: @@ -396,6 +396,56 @@ private:
396 } 396 }
397 }; 397 };
398 398
  399 +SrsSimpleBuffer::SrsSimpleBuffer()
  400 +{
  401 +}
  402 +
  403 +SrsSimpleBuffer::~SrsSimpleBuffer()
  404 +{
  405 +}
  406 +
  407 +int SrsSimpleBuffer::length()
  408 +{
  409 + int len = (int)data.size();
  410 + srs_assert(len >= 0);
  411 + return len;
  412 +}
  413 +
  414 +char* SrsSimpleBuffer::bytes()
  415 +{
  416 + return (length() == 0)? NULL : &data.at(0);
  417 +}
  418 +
  419 +void SrsSimpleBuffer::erase(int size)
  420 +{
  421 + if (size <= 0) {
  422 + return;
  423 + }
  424 +
  425 + if (size >= length()) {
  426 + data.clear();
  427 + return;
  428 + }
  429 +
  430 + data.erase(data.begin(), data.begin() + size);
  431 +}
  432 +
  433 +void SrsSimpleBuffer::append(const char* bytes, int size)
  434 +{
  435 + srs_assert(size > 0);
  436 +
  437 + data.insert(data.end(), bytes, bytes + size);
  438 +}
  439 +
  440 +SrsHlsAacJitter::SrsHlsAacJitter()
  441 +{
  442 + base_pts = 0;
  443 + nb_samples = 0;
  444 +
  445 + // TODO: config it, 0 means no adjust
  446 + sync_ms = SRS_CONF_DEFAULT_AAC_SYNC;
  447 +}
  448 +
399 SrsHlsAacJitter::~SrsHlsAacJitter() 449 SrsHlsAacJitter::~SrsHlsAacJitter()
400 { 450 {
401 } 451 }
@@ -481,7 +531,7 @@ int SrsTSMuxer::open(string _path) @@ -481,7 +531,7 @@ int SrsTSMuxer::open(string _path)
481 return ret; 531 return ret;
482 } 532 }
483 533
484 -int SrsTSMuxer::write_audio(SrsMpegtsFrame* af, SrsBuffer* ab) 534 +int SrsTSMuxer::write_audio(SrsMpegtsFrame* af, SrsSimpleBuffer* ab)
485 { 535 {
486 int ret = ERROR_SUCCESS; 536 int ret = ERROR_SUCCESS;
487 537
@@ -492,7 +542,7 @@ int SrsTSMuxer::write_audio(SrsMpegtsFrame* af, SrsBuffer* ab) @@ -492,7 +542,7 @@ int SrsTSMuxer::write_audio(SrsMpegtsFrame* af, SrsBuffer* ab)
492 return ret; 542 return ret;
493 } 543 }
494 544
495 -int SrsTSMuxer::write_video(SrsMpegtsFrame* vf, SrsBuffer* vb) 545 +int SrsTSMuxer::write_video(SrsMpegtsFrame* vf, SrsSimpleBuffer* vb)
496 { 546 {
497 int ret = ERROR_SUCCESS; 547 int ret = ERROR_SUCCESS;
498 548
@@ -538,15 +588,6 @@ void SrsHlsSegment::update_duration(int64_t current_frame_dts) @@ -538,15 +588,6 @@ void SrsHlsSegment::update_duration(int64_t current_frame_dts)
538 return; 588 return;
539 } 589 }
540 590
541 -SrsHlsAacJitter::SrsHlsAacJitter()  
542 -{  
543 - base_pts = 0;  
544 - nb_samples = 0;  
545 -  
546 - // TODO: config it, 0 means no adjust  
547 - sync_ms = SRS_CONF_DEFAULT_AAC_SYNC;  
548 -}  
549 -  
550 SrsHlsMuxer::SrsHlsMuxer() 591 SrsHlsMuxer::SrsHlsMuxer()
551 { 592 {
552 hls_fragment = hls_window = 0; 593 hls_fragment = hls_window = 0;
@@ -654,7 +695,7 @@ bool SrsHlsMuxer::is_segment_overflow() @@ -654,7 +695,7 @@ bool SrsHlsMuxer::is_segment_overflow()
654 return current->duration >= hls_fragment; 695 return current->duration >= hls_fragment;
655 } 696 }
656 697
657 -int SrsHlsMuxer::flush_audio(SrsMpegtsFrame* af, SrsBuffer* ab) 698 +int SrsHlsMuxer::flush_audio(SrsMpegtsFrame* af, SrsSimpleBuffer* ab)
658 { 699 {
659 int ret = ERROR_SUCCESS; 700 int ret = ERROR_SUCCESS;
660 701
@@ -681,7 +722,7 @@ int SrsHlsMuxer::flush_audio(SrsMpegtsFrame* af, SrsBuffer* ab) @@ -681,7 +722,7 @@ int SrsHlsMuxer::flush_audio(SrsMpegtsFrame* af, SrsBuffer* ab)
681 return ret; 722 return ret;
682 } 723 }
683 724
684 -int SrsHlsMuxer::flush_video(SrsMpegtsFrame* /*af*/, SrsBuffer* /*ab*/, SrsMpegtsFrame* vf, SrsBuffer* vb) 725 +int SrsHlsMuxer::flush_video(SrsMpegtsFrame* /*af*/, SrsSimpleBuffer* /*ab*/, SrsMpegtsFrame* vf, SrsSimpleBuffer* vb)
685 { 726 {
686 int ret = ERROR_SUCCESS; 727 int ret = ERROR_SUCCESS;
687 728
@@ -964,8 +1005,8 @@ SrsHlsCache::SrsHlsCache() @@ -964,8 +1005,8 @@ SrsHlsCache::SrsHlsCache()
964 { 1005 {
965 aac_jitter = new SrsHlsAacJitter(); 1006 aac_jitter = new SrsHlsAacJitter();
966 1007
967 - ab = new SrsBuffer();  
968 - vb = new SrsBuffer(); 1008 + ab = new SrsSimpleBuffer();
  1009 + vb = new SrsSimpleBuffer();
969 1010
970 af = new SrsMpegtsFrame(); 1011 af = new SrsMpegtsFrame();
971 vf = new SrsMpegtsFrame(); 1012 vf = new SrsMpegtsFrame();
@@ -50,7 +50,6 @@ extern int aac_sample_rates[]; @@ -50,7 +50,6 @@ extern int aac_sample_rates[];
50 #include <string> 50 #include <string>
51 #include <vector> 51 #include <vector>
52 52
53 -class SrsBuffer;  
54 class SrsSharedPtrMessage; 53 class SrsSharedPtrMessage;
55 class SrsCodecSample; 54 class SrsCodecSample;
56 class SrsMpegtsFrame; 55 class SrsMpegtsFrame;
@@ -64,6 +63,43 @@ class SrsSource; @@ -64,6 +63,43 @@ class SrsSource;
64 class SrsFileWriter; 63 class SrsFileWriter;
65 64
66 /** 65 /**
  66 +* the simple buffer use vector to append bytes,
  67 +* it's for hls, and need to be refined in future.
  68 +*/
  69 +class SrsSimpleBuffer
  70 +{
  71 +private:
  72 + std::vector<char> data;
  73 +public:
  74 + SrsSimpleBuffer();
  75 + virtual ~SrsSimpleBuffer();
  76 +public:
  77 + /**
  78 + * get the length of buffer. empty if zero.
  79 + * @remark assert length() is not negative.
  80 + */
  81 + virtual int length();
  82 + /**
  83 + * get the buffer bytes.
  84 + * @return the bytes, NULL if empty.
  85 + */
  86 + virtual char* bytes();
  87 + /**
  88 + * erase size of bytes from begin.
  89 + * @param size to erase size of bytes.
  90 + * clear if size greater than or equals to length()
  91 + * @remark ignore size is not positive.
  92 + */
  93 + virtual void erase(int size);
  94 + /**
  95 + * append specified bytes to buffer.
  96 + * @param size the size of bytes
  97 + * @remark assert size is positive.
  98 + */
  99 + virtual void append(const char* bytes, int size);
  100 +};
  101 +
  102 +/**
67 * jitter correct for audio, 103 * jitter correct for audio,
68 * the sample rate 44100/32000 will lost precise, 104 * the sample rate 44100/32000 will lost precise,
69 * when mp4/ts(tbn=90000) covert to flv/rtmp(1000), 105 * when mp4/ts(tbn=90000) covert to flv/rtmp(1000),
@@ -109,8 +145,8 @@ public: @@ -109,8 +145,8 @@ public:
109 virtual ~SrsTSMuxer(); 145 virtual ~SrsTSMuxer();
110 public: 146 public:
111 virtual int open(std::string _path); 147 virtual int open(std::string _path);
112 - virtual int write_audio(SrsMpegtsFrame* af, SrsBuffer* ab);  
113 - virtual int write_video(SrsMpegtsFrame* vf, SrsBuffer* vb); 148 + virtual int write_audio(SrsMpegtsFrame* af, SrsSimpleBuffer* ab);
  149 + virtual int write_video(SrsMpegtsFrame* vf, SrsSimpleBuffer* vb);
114 virtual void close(); 150 virtual void close();
115 }; 151 };
116 152
@@ -196,8 +232,8 @@ public: @@ -196,8 +232,8 @@ public:
196 * that is whether the current segment duration >= the segment in config 232 * that is whether the current segment duration >= the segment in config
197 */ 233 */
198 virtual bool is_segment_overflow(); 234 virtual bool is_segment_overflow();
199 - virtual int flush_audio(SrsMpegtsFrame* af, SrsBuffer* ab);  
200 - virtual int flush_video(SrsMpegtsFrame* af, SrsBuffer* ab, SrsMpegtsFrame* vf, SrsBuffer* vb); 235 + virtual int flush_audio(SrsMpegtsFrame* af, SrsSimpleBuffer* ab);
  236 + virtual int flush_video(SrsMpegtsFrame* af, SrsSimpleBuffer* ab, SrsMpegtsFrame* vf, SrsSimpleBuffer* vb);
201 /** 237 /**
202 * close segment(ts). 238 * close segment(ts).
203 * @param log_desc the description for log. 239 * @param log_desc the description for log.
@@ -231,9 +267,9 @@ class SrsHlsCache @@ -231,9 +267,9 @@ class SrsHlsCache
231 private: 267 private:
232 // current frame and buffer 268 // current frame and buffer
233 SrsMpegtsFrame* af; 269 SrsMpegtsFrame* af;
234 - SrsBuffer* ab; 270 + SrsSimpleBuffer* ab;
235 SrsMpegtsFrame* vf; 271 SrsMpegtsFrame* vf;
236 - SrsBuffer* vb; 272 + SrsSimpleBuffer* vb;
237 private: 273 private:
238 // the audio cache buffer start pts, to flush audio if full. 274 // the audio cache buffer start pts, to flush audio if full.
239 int64_t audio_buffer_start_pts; 275 int64_t audio_buffer_start_pts;