winlin

finish kernel utest. to 0.9.149

@@ -204,11 +204,11 @@ int SrsAvcAacCodec::audio_aac_demux(int8_t* data, int size, SrsCodecSample* samp @@ -204,11 +204,11 @@ int SrsAvcAacCodec::audio_aac_demux(int8_t* data, int size, SrsCodecSample* samp
204 if (aac_packet_type == SrsCodecAudioTypeSequenceHeader) { 204 if (aac_packet_type == SrsCodecAudioTypeSequenceHeader) {
205 // AudioSpecificConfig 205 // AudioSpecificConfig
206 // 1.6.2.1 AudioSpecificConfig, in aac-mp4a-format-ISO_IEC_14496-3+2001.pdf, page 33. 206 // 1.6.2.1 AudioSpecificConfig, in aac-mp4a-format-ISO_IEC_14496-3+2001.pdf, page 33.
207 - aac_extra_size = stream->left(); 207 + aac_extra_size = stream->size() - stream->pos();
208 if (aac_extra_size > 0) { 208 if (aac_extra_size > 0) {
209 srs_freep(aac_extra_data); 209 srs_freep(aac_extra_data);
210 aac_extra_data = new char[aac_extra_size]; 210 aac_extra_data = new char[aac_extra_size];
211 - memcpy(aac_extra_data, stream->current(), aac_extra_size); 211 + memcpy(aac_extra_data, stream->data() + stream->pos(), aac_extra_size);
212 } 212 }
213 213
214 // only need to decode the first 2bytes: 214 // only need to decode the first 2bytes:
@@ -253,7 +253,7 @@ int SrsAvcAacCodec::audio_aac_demux(int8_t* data, int size, SrsCodecSample* samp @@ -253,7 +253,7 @@ int SrsAvcAacCodec::audio_aac_demux(int8_t* data, int size, SrsCodecSample* samp
253 253
254 // Raw AAC frame data in UI8 [] 254 // Raw AAC frame data in UI8 []
255 // 6.3 Raw Data, aac-iso-13818-7.pdf, page 28 255 // 6.3 Raw Data, aac-iso-13818-7.pdf, page 28
256 - if ((ret = sample->add_sample(stream->current(), stream->left())) != ERROR_SUCCESS) { 256 + if ((ret = sample->add_sample(stream->data() + stream->pos(), stream->size() - stream->pos())) != ERROR_SUCCESS) {
257 srs_error("hls add audio sample failed. ret=%d", ret); 257 srs_error("hls add audio sample failed. ret=%d", ret);
258 return ret; 258 return ret;
259 } 259 }
@@ -318,11 +318,11 @@ int SrsAvcAacCodec::video_avc_demux(int8_t* data, int size, SrsCodecSample* samp @@ -318,11 +318,11 @@ int SrsAvcAacCodec::video_avc_demux(int8_t* data, int size, SrsCodecSample* samp
318 if (avc_packet_type == SrsCodecVideoAVCTypeSequenceHeader) { 318 if (avc_packet_type == SrsCodecVideoAVCTypeSequenceHeader) {
319 // AVCDecoderConfigurationRecord 319 // AVCDecoderConfigurationRecord
320 // 5.2.4.1.1 Syntax, H.264-AVC-ISO_IEC_14496-15.pdf, page 16 320 // 5.2.4.1.1 Syntax, H.264-AVC-ISO_IEC_14496-15.pdf, page 16
321 - avc_extra_size = stream->left(); 321 + avc_extra_size = stream->size() - stream->pos();
322 if (avc_extra_size > 0) { 322 if (avc_extra_size > 0) {
323 srs_freep(avc_extra_data); 323 srs_freep(avc_extra_data);
324 avc_extra_data = new char[avc_extra_size]; 324 avc_extra_data = new char[avc_extra_size];
325 - memcpy(avc_extra_data, stream->current(), avc_extra_size); 325 + memcpy(avc_extra_data, stream->data() + stream->pos(), avc_extra_size);
326 } 326 }
327 327
328 if (!stream->require(6)) { 328 if (!stream->require(6)) {
@@ -367,7 +367,7 @@ int SrsAvcAacCodec::video_avc_demux(int8_t* data, int size, SrsCodecSample* samp @@ -367,7 +367,7 @@ int SrsAvcAacCodec::video_avc_demux(int8_t* data, int size, SrsCodecSample* samp
367 if (sequenceParameterSetLength > 0) { 367 if (sequenceParameterSetLength > 0) {
368 srs_freep(sequenceParameterSetNALUnit); 368 srs_freep(sequenceParameterSetNALUnit);
369 sequenceParameterSetNALUnit = new char[sequenceParameterSetLength]; 369 sequenceParameterSetNALUnit = new char[sequenceParameterSetLength];
370 - memcpy(sequenceParameterSetNALUnit, stream->current(), sequenceParameterSetLength); 370 + memcpy(sequenceParameterSetNALUnit, stream->data() + stream->pos(), sequenceParameterSetLength);
371 stream->skip(sequenceParameterSetLength); 371 stream->skip(sequenceParameterSetLength);
372 } 372 }
373 // 1 pps 373 // 1 pps
@@ -397,7 +397,7 @@ int SrsAvcAacCodec::video_avc_demux(int8_t* data, int size, SrsCodecSample* samp @@ -397,7 +397,7 @@ int SrsAvcAacCodec::video_avc_demux(int8_t* data, int size, SrsCodecSample* samp
397 if (pictureParameterSetLength > 0) { 397 if (pictureParameterSetLength > 0) {
398 srs_freep(pictureParameterSetNALUnit); 398 srs_freep(pictureParameterSetNALUnit);
399 pictureParameterSetNALUnit = new char[pictureParameterSetLength]; 399 pictureParameterSetNALUnit = new char[pictureParameterSetLength];
400 - memcpy(pictureParameterSetNALUnit, stream->current(), pictureParameterSetLength); 400 + memcpy(pictureParameterSetNALUnit, stream->data() + stream->pos(), pictureParameterSetLength);
401 stream->skip(pictureParameterSetLength); 401 stream->skip(pictureParameterSetLength);
402 } 402 }
403 } else if (avc_packet_type == SrsCodecVideoAVCTypeNALU){ 403 } else if (avc_packet_type == SrsCodecVideoAVCTypeNALU){
@@ -410,7 +410,7 @@ int SrsAvcAacCodec::video_avc_demux(int8_t* data, int size, SrsCodecSample* samp @@ -410,7 +410,7 @@ int SrsAvcAacCodec::video_avc_demux(int8_t* data, int size, SrsCodecSample* samp
410 410
411 // One or more NALUs (Full frames are required) 411 // One or more NALUs (Full frames are required)
412 // 5.3.4.2.1 Syntax, H.264-AVC-ISO_IEC_14496-15.pdf, page 20 412 // 5.3.4.2.1 Syntax, H.264-AVC-ISO_IEC_14496-15.pdf, page 20
413 - int PictureLength = stream->left(); 413 + int PictureLength = stream->size() - stream->pos();
414 for (int i = 0; i < PictureLength;) { 414 for (int i = 0; i < PictureLength;) {
415 if (!stream->require(NAL_unit_length + 1)) { 415 if (!stream->require(NAL_unit_length + 1)) {
416 ret = ERROR_HLS_DECODE_ERROR; 416 ret = ERROR_HLS_DECODE_ERROR;
@@ -434,7 +434,7 @@ int SrsAvcAacCodec::video_avc_demux(int8_t* data, int size, SrsCodecSample* samp @@ -434,7 +434,7 @@ int SrsAvcAacCodec::video_avc_demux(int8_t* data, int size, SrsCodecSample* samp
434 return ret; 434 return ret;
435 } 435 }
436 // 7.3.1 NAL unit syntax, H.264-AVC-ISO_IEC_14496-10.pdf, page 44. 436 // 7.3.1 NAL unit syntax, H.264-AVC-ISO_IEC_14496-10.pdf, page 44.
437 - if ((ret = sample->add_sample(stream->current(), NALUnitLength)) != ERROR_SUCCESS) { 437 + if ((ret = sample->add_sample(stream->data() + stream->pos(), NALUnitLength)) != ERROR_SUCCESS) {
438 srs_error("hls add video sample failed. ret=%d", ret); 438 srs_error("hls add video sample failed. ret=%d", ret);
439 return ret; 439 return ret;
440 } 440 }
@@ -31,7 +31,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. @@ -31,7 +31,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
31 // current release version 31 // current release version
32 #define VERSION_MAJOR "0" 32 #define VERSION_MAJOR "0"
33 #define VERSION_MINOR "9" 33 #define VERSION_MINOR "9"
34 -#define VERSION_REVISION "148" 34 +#define VERSION_REVISION "149"
35 #define RTMP_SIG_SRS_VERSION VERSION_MAJOR"."VERSION_MINOR"."VERSION_REVISION 35 #define RTMP_SIG_SRS_VERSION VERSION_MAJOR"."VERSION_MINOR"."VERSION_REVISION
36 // server info. 36 // server info.
37 #define RTMP_SIG_SRS_KEY "SRS" 37 #define RTMP_SIG_SRS_KEY "SRS"
@@ -87,7 +87,6 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. @@ -87,7 +87,6 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
87 // aggregate message parse failed. 87 // aggregate message parse failed.
88 #define ERROR_RTMP_AGGREGATE 324 88 #define ERROR_RTMP_AGGREGATE 324
89 89
90 -#define ERROR_SYSTEM_STREAM_INIT 400  
91 #define ERROR_SYSTEM_PACKET_INVALID 401 90 #define ERROR_SYSTEM_PACKET_INVALID 401
92 #define ERROR_SYSTEM_CLIENT_INVALID 402 91 #define ERROR_SYSTEM_CLIENT_INVALID 402
93 #define ERROR_SYSTEM_ASSERT_FAILED 403 92 #define ERROR_SYSTEM_ASSERT_FAILED 403
@@ -190,6 +189,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. @@ -190,6 +189,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
190 189
191 #define ERROR_KERNEL_FLV_HEADER 900 190 #define ERROR_KERNEL_FLV_HEADER 900
192 #define ERROR_KERNEL_FLV_STREAM_CLOSED 901 191 #define ERROR_KERNEL_FLV_STREAM_CLOSED 901
  192 +#define ERROR_KERNEL_STREAM_INIT 902
193 193
194 // system control message, 194 // system control message,
195 // not an error, but special control logic. 195 // not an error, but special control logic.
@@ -31,8 +31,8 @@ using namespace std; @@ -31,8 +31,8 @@ using namespace std;
31 31
32 SrsStream::SrsStream() 32 SrsStream::SrsStream()
33 { 33 {
34 - p = bytes = NULL;  
35 - size = 0; 34 + p = _bytes = NULL;
  35 + _size = 0;
36 36
37 // TODO: support both little and big endian. 37 // TODO: support both little and big endian.
38 srs_assert(srs_is_little_endian()); 38 srs_assert(srs_is_little_endian());
@@ -42,61 +42,61 @@ SrsStream::~SrsStream() @@ -42,61 +42,61 @@ SrsStream::~SrsStream()
42 { 42 {
43 } 43 }
44 44
45 -int SrsStream::initialize(char* _bytes, int _size) 45 +int SrsStream::initialize(char* bytes, int size)
46 { 46 {
47 int ret = ERROR_SUCCESS; 47 int ret = ERROR_SUCCESS;
48 48
49 - if (!_bytes) {  
50 - ret = ERROR_SYSTEM_STREAM_INIT; 49 + if (!bytes) {
  50 + ret = ERROR_KERNEL_STREAM_INIT;
51 srs_error("stream param bytes must not be NULL. ret=%d", ret); 51 srs_error("stream param bytes must not be NULL. ret=%d", ret);
52 return ret; 52 return ret;
53 } 53 }
54 54
55 - if (_size <= 0) {  
56 - ret = ERROR_SYSTEM_STREAM_INIT; 55 + if (size <= 0) {
  56 + ret = ERROR_KERNEL_STREAM_INIT;
57 srs_error("stream param size must be positive. ret=%d", ret); 57 srs_error("stream param size must be positive. ret=%d", ret);
58 return ret; 58 return ret;
59 } 59 }
60 60
61 - size = _size;  
62 - p = bytes = _bytes; 61 + _size = size;
  62 + p = _bytes = bytes;
  63 + srs_info("init stream ok, size=%d", size);
63 64
64 return ret; 65 return ret;
65 } 66 }
66 67
67 -void SrsStream::reset() 68 +char* SrsStream::data()
68 { 69 {
69 - p = bytes; 70 + return _bytes;
70 } 71 }
71 72
72 -bool SrsStream::empty()  
73 -{  
74 - return !p || !bytes || (p >= bytes + size);  
75 -}  
76 -  
77 -bool SrsStream::require(int required_size) 73 +int SrsStream::size()
78 { 74 {
79 - return !empty() && (required_size <= bytes + size - p); 75 + return _size;
80 } 76 }
81 77
82 -void SrsStream::skip(int size) 78 +int SrsStream::pos()
83 { 79 {
84 - p += size; 80 + return p - _bytes;
85 } 81 }
86 82
87 -int SrsStream::pos() 83 +bool SrsStream::empty()
88 { 84 {
89 - return p - bytes; 85 + return !_bytes || (p >= _bytes + _size);
90 } 86 }
91 87
92 -int SrsStream::left() 88 +bool SrsStream::require(int required_size)
93 { 89 {
94 - return size - pos(); 90 + srs_assert(required_size > 0);
  91 +
  92 + return required_size <= _size - (p - _bytes);
95 } 93 }
96 94
97 -char* SrsStream::current() 95 +void SrsStream::skip(int size)
98 { 96 {
99 - return p; 97 + srs_assert(p);
  98 +
  99 + p += size;
100 } 100 }
101 101
102 int8_t SrsStream::read_1bytes() 102 int8_t SrsStream::read_1bytes()
@@ -33,52 +33,67 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. @@ -33,52 +33,67 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
33 #include <sys/types.h> 33 #include <sys/types.h>
34 #include <string> 34 #include <string>
35 35
  36 +/**
  37 +* bytes utility, used to:
  38 +* convert basic types to bytes,
  39 +* build basic types from bytes.
  40 +*/
36 class SrsStream 41 class SrsStream
37 { 42 {
38 private: 43 private:
39 char* p; 44 char* p;
40 char* pp; 45 char* pp;
41 - char* bytes;  
42 - int size; 46 + char* _bytes;
  47 + int _size;
43 public: 48 public:
44 SrsStream(); 49 SrsStream();
45 virtual ~SrsStream(); 50 virtual ~SrsStream();
46 public: 51 public:
47 /** 52 /**
48 * initialize the stream from bytes. 53 * initialize the stream from bytes.
49 - * @_bytes, must not be NULL, or return error.  
50 - * @_size, must be positive, or return error.  
51 - * @remark, stream never free the _bytes, user must free it. 54 + * @bytes, the bytes to convert from/to basic types.
  55 + * @size, the size of bytes.
  56 + * @remark, stream never free the bytes, user must free it.
  57 + * @remark, return error when bytes NULL.
  58 + * @remark, return error when size is not positive.
  59 + */
  60 + virtual int initialize(char* bytes, int size);
  61 +// get the status of stream
  62 +public:
  63 + /**
  64 + * get data of stream, set by initialize.
  65 + * current bytes = data() + pos()
52 */ 66 */
53 - virtual int initialize(char* _bytes, int _size); 67 + virtual char* data();
54 /** 68 /**
55 - * reset the position to beginning. 69 + * the total stream size, set by initialize.
  70 + * left bytes = size() - pos().
56 */ 71 */
57 - virtual void reset(); 72 + virtual int size();
  73 + /**
  74 + * tell the current pos.
  75 + */
  76 + virtual int pos();
58 /** 77 /**
59 * whether stream is empty. 78 * whether stream is empty.
60 - * if empty, never read or write. 79 + * if empty, user should never read or write.
61 */ 80 */
62 virtual bool empty(); 81 virtual bool empty();
63 /** 82 /**
64 * whether required size is ok. 83 * whether required size is ok.
65 * @return true if stream can read/write specified required_size bytes. 84 * @return true if stream can read/write specified required_size bytes.
  85 + * @remark assert required_size positive.
66 */ 86 */
67 virtual bool require(int required_size); 87 virtual bool require(int required_size);
  88 +// to change stream.
  89 +public:
68 /** 90 /**
69 * to skip some size. 91 * to skip some size.
70 - * @size can be any value. positive to forward; nagetive to backward. 92 + * @param size can be any value. positive to forward; nagetive to backward.
  93 + * @remark to skip(pos()) to reset stream.
  94 + * @remark assert initialized, the data() not NULL.
71 */ 95 */
72 virtual void skip(int size); 96 virtual void skip(int size);
73 - /**  
74 - * tell the current pos.  
75 - */  
76 - virtual int pos();  
77 - /**  
78 - * left size of bytes.  
79 - */  
80 - virtual int left();  
81 - virtual char* current();  
82 public: 97 public:
83 /** 98 /**
84 * get 1bytes char from stream. 99 * get 1bytes char from stream.
@@ -659,7 +659,7 @@ srs_amf0_t srs_amf0_parse(char* data, int size, int* nparsed) @@ -659,7 +659,7 @@ srs_amf0_t srs_amf0_parse(char* data, int size, int* nparsed)
659 return amf0; 659 return amf0;
660 } 660 }
661 661
662 - stream.reset(); 662 + stream.skip(-1 * stream.pos());
663 if ((ret = any->read(&stream)) != ERROR_SUCCESS) { 663 if ((ret = any->read(&stream)) != ERROR_SUCCESS) {
664 srs_freep(any); 664 srs_freep(any);
665 return amf0; 665 return amf0;
@@ -601,7 +601,7 @@ int SrsProtocol::do_decode_message(SrsMessageHeader& header, SrsStream* stream, @@ -601,7 +601,7 @@ int SrsProtocol::do_decode_message(SrsMessageHeader& header, SrsStream* stream,
601 srs_verbose("AMF0/AMF3 command id, transcationId=%.2f", transactionId); 601 srs_verbose("AMF0/AMF3 command id, transcationId=%.2f", transactionId);
602 602
603 // reset stream, for header read completed. 603 // reset stream, for header read completed.
604 - stream->reset(); 604 + stream->skip(-1 * stream->pos());
605 if (header.is_amf3_command()) { 605 if (header.is_amf3_command()) {
606 stream->skip(1); 606 stream->skip(1);
607 } 607 }
@@ -638,7 +638,7 @@ int SrsProtocol::do_decode_message(SrsMessageHeader& header, SrsStream* stream, @@ -638,7 +638,7 @@ int SrsProtocol::do_decode_message(SrsMessageHeader& header, SrsStream* stream,
638 } 638 }
639 639
640 // reset to zero(amf3 to 1) to restart decode. 640 // reset to zero(amf3 to 1) to restart decode.
641 - stream->reset(); 641 + stream->skip(-1 * stream->pos());
642 if (header.is_amf3_command()) { 642 if (header.is_amf3_command()) {
643 stream->skip(1); 643 stream->skip(1);
644 } 644 }
@@ -521,8 +521,8 @@ VOID TEST(AMF0Test, ApiAnyIO) @@ -521,8 +521,8 @@ VOID TEST(AMF0Test, ApiAnyIO)
521 521
522 // object eof 522 // object eof
523 if (true) { 523 if (true) {
524 - s.reset();  
525 - s.current()[2] = 0x09; 524 + s.skip(-1 * s.pos());
  525 + (s.data() + s.pos())[2] = 0x09;
526 526
527 o = SrsAmf0Any::object_eof(); 527 o = SrsAmf0Any::object_eof();
528 SrsAutoFree(SrsAmf0Any, o); 528 SrsAutoFree(SrsAmf0Any, o);
@@ -531,12 +531,12 @@ VOID TEST(AMF0Test, ApiAnyIO) @@ -531,12 +531,12 @@ VOID TEST(AMF0Test, ApiAnyIO)
531 EXPECT_EQ(o->total_size(), s.pos()); 531 EXPECT_EQ(o->total_size(), s.pos());
532 EXPECT_EQ(3, s.pos()); 532 EXPECT_EQ(3, s.pos());
533 533
534 - s.reset();  
535 - s.current()[0] = 0x01; 534 + s.skip(-1 * s.pos());
  535 + (s.data() + s.pos())[0] = 0x01;
536 EXPECT_NE(ERROR_SUCCESS, o->read(&s)); 536 EXPECT_NE(ERROR_SUCCESS, o->read(&s));
537 } 537 }
538 if (true) { 538 if (true) {
539 - s.reset(); 539 + s.skip(-1 * s.pos());
540 540
541 o = SrsAmf0Any::object_eof(); 541 o = SrsAmf0Any::object_eof();
542 SrsAutoFree(SrsAmf0Any, o); 542 SrsAutoFree(SrsAmf0Any, o);
@@ -551,7 +551,7 @@ VOID TEST(AMF0Test, ApiAnyIO) @@ -551,7 +551,7 @@ VOID TEST(AMF0Test, ApiAnyIO)
551 551
552 // string 552 // string
553 if (true) { 553 if (true) {
554 - s.reset(); 554 + s.skip(-1 * s.pos());
555 555
556 o = SrsAmf0Any::str("winlin"); 556 o = SrsAmf0Any::str("winlin");
557 SrsAutoFree(SrsAmf0Any, o); 557 SrsAutoFree(SrsAmf0Any, o);
@@ -559,14 +559,14 @@ VOID TEST(AMF0Test, ApiAnyIO) @@ -559,14 +559,14 @@ VOID TEST(AMF0Test, ApiAnyIO)
559 EXPECT_EQ(ERROR_SUCCESS, o->write(&s)); 559 EXPECT_EQ(ERROR_SUCCESS, o->write(&s));
560 EXPECT_EQ(o->total_size(), s.pos()); 560 EXPECT_EQ(o->total_size(), s.pos());
561 561
562 - s.reset(); 562 + s.skip(-1 * s.pos());
563 EXPECT_EQ(2, s.read_1bytes()); 563 EXPECT_EQ(2, s.read_1bytes());
564 EXPECT_EQ(6, s.read_2bytes()); 564 EXPECT_EQ(6, s.read_2bytes());
565 - EXPECT_EQ('w', s.current()[0]);  
566 - EXPECT_EQ('n', s.current()[5]); 565 + EXPECT_EQ('w', (s.data() + s.pos())[0]);
  566 + EXPECT_EQ('n', (s.data() + s.pos())[5]);
567 567
568 - s.reset();  
569 - s.current()[3] = 'x'; 568 + s.skip(-1 * s.pos());
  569 + (s.data() + s.pos())[3] = 'x';
570 EXPECT_EQ(ERROR_SUCCESS, o->read(&s)); 570 EXPECT_EQ(ERROR_SUCCESS, o->read(&s));
571 EXPECT_EQ(o->total_size(), s.pos()); 571 EXPECT_EQ(o->total_size(), s.pos());
572 EXPECT_STREQ("xinlin", o->to_str().c_str()); 572 EXPECT_STREQ("xinlin", o->to_str().c_str());
@@ -574,7 +574,7 @@ VOID TEST(AMF0Test, ApiAnyIO) @@ -574,7 +574,7 @@ VOID TEST(AMF0Test, ApiAnyIO)
574 574
575 // number 575 // number
576 if (true) { 576 if (true) {
577 - s.reset(); 577 + s.skip(-1 * s.pos());
578 578
579 o = SrsAmf0Any::number(10); 579 o = SrsAmf0Any::number(10);
580 SrsAutoFree(SrsAmf0Any, o); 580 SrsAutoFree(SrsAmf0Any, o);
@@ -582,10 +582,10 @@ VOID TEST(AMF0Test, ApiAnyIO) @@ -582,10 +582,10 @@ VOID TEST(AMF0Test, ApiAnyIO)
582 EXPECT_EQ(ERROR_SUCCESS, o->write(&s)); 582 EXPECT_EQ(ERROR_SUCCESS, o->write(&s));
583 EXPECT_EQ(o->total_size(), s.pos()); 583 EXPECT_EQ(o->total_size(), s.pos());
584 584
585 - s.reset(); 585 + s.skip(-1 * s.pos());
586 EXPECT_EQ(0, s.read_1bytes()); 586 EXPECT_EQ(0, s.read_1bytes());
587 587
588 - s.reset(); 588 + s.skip(-1 * s.pos());
589 EXPECT_EQ(ERROR_SUCCESS, o->read(&s)); 589 EXPECT_EQ(ERROR_SUCCESS, o->read(&s));
590 EXPECT_EQ(o->total_size(), s.pos()); 590 EXPECT_EQ(o->total_size(), s.pos());
591 EXPECT_DOUBLE_EQ(10, o->to_number()); 591 EXPECT_DOUBLE_EQ(10, o->to_number());
@@ -593,7 +593,7 @@ VOID TEST(AMF0Test, ApiAnyIO) @@ -593,7 +593,7 @@ VOID TEST(AMF0Test, ApiAnyIO)
593 593
594 // boolean 594 // boolean
595 if (true) { 595 if (true) {
596 - s.reset(); 596 + s.skip(-1 * s.pos());
597 597
598 o = SrsAmf0Any::boolean(true); 598 o = SrsAmf0Any::boolean(true);
599 SrsAutoFree(SrsAmf0Any, o); 599 SrsAutoFree(SrsAmf0Any, o);
@@ -601,16 +601,16 @@ VOID TEST(AMF0Test, ApiAnyIO) @@ -601,16 +601,16 @@ VOID TEST(AMF0Test, ApiAnyIO)
601 EXPECT_EQ(ERROR_SUCCESS, o->write(&s)); 601 EXPECT_EQ(ERROR_SUCCESS, o->write(&s));
602 EXPECT_EQ(o->total_size(), s.pos()); 602 EXPECT_EQ(o->total_size(), s.pos());
603 603
604 - s.reset(); 604 + s.skip(-1 * s.pos());
605 EXPECT_EQ(1, s.read_1bytes()); 605 EXPECT_EQ(1, s.read_1bytes());
606 606
607 - s.reset(); 607 + s.skip(-1 * s.pos());
608 EXPECT_EQ(ERROR_SUCCESS, o->read(&s)); 608 EXPECT_EQ(ERROR_SUCCESS, o->read(&s));
609 EXPECT_EQ(o->total_size(), s.pos()); 609 EXPECT_EQ(o->total_size(), s.pos());
610 EXPECT_TRUE(o->to_boolean()); 610 EXPECT_TRUE(o->to_boolean());
611 } 611 }
612 if (true) { 612 if (true) {
613 - s.reset(); 613 + s.skip(-1 * s.pos());
614 614
615 o = SrsAmf0Any::boolean(false); 615 o = SrsAmf0Any::boolean(false);
616 SrsAutoFree(SrsAmf0Any, o); 616 SrsAutoFree(SrsAmf0Any, o);
@@ -618,10 +618,10 @@ VOID TEST(AMF0Test, ApiAnyIO) @@ -618,10 +618,10 @@ VOID TEST(AMF0Test, ApiAnyIO)
618 EXPECT_EQ(ERROR_SUCCESS, o->write(&s)); 618 EXPECT_EQ(ERROR_SUCCESS, o->write(&s));
619 EXPECT_EQ(o->total_size(), s.pos()); 619 EXPECT_EQ(o->total_size(), s.pos());
620 620
621 - s.reset(); 621 + s.skip(-1 * s.pos());
622 EXPECT_EQ(1, s.read_1bytes()); 622 EXPECT_EQ(1, s.read_1bytes());
623 623
624 - s.reset(); 624 + s.skip(-1 * s.pos());
625 EXPECT_EQ(ERROR_SUCCESS, o->read(&s)); 625 EXPECT_EQ(ERROR_SUCCESS, o->read(&s));
626 EXPECT_EQ(o->total_size(), s.pos()); 626 EXPECT_EQ(o->total_size(), s.pos());
627 EXPECT_FALSE(o->to_boolean()); 627 EXPECT_FALSE(o->to_boolean());
@@ -629,7 +629,7 @@ VOID TEST(AMF0Test, ApiAnyIO) @@ -629,7 +629,7 @@ VOID TEST(AMF0Test, ApiAnyIO)
629 629
630 // null 630 // null
631 if (true) { 631 if (true) {
632 - s.reset(); 632 + s.skip(-1 * s.pos());
633 633
634 o = SrsAmf0Any::null(); 634 o = SrsAmf0Any::null();
635 SrsAutoFree(SrsAmf0Any, o); 635 SrsAutoFree(SrsAmf0Any, o);
@@ -637,10 +637,10 @@ VOID TEST(AMF0Test, ApiAnyIO) @@ -637,10 +637,10 @@ VOID TEST(AMF0Test, ApiAnyIO)
637 EXPECT_EQ(ERROR_SUCCESS, o->write(&s)); 637 EXPECT_EQ(ERROR_SUCCESS, o->write(&s));
638 EXPECT_EQ(o->total_size(), s.pos()); 638 EXPECT_EQ(o->total_size(), s.pos());
639 639
640 - s.reset(); 640 + s.skip(-1 * s.pos());
641 EXPECT_EQ(5, s.read_1bytes()); 641 EXPECT_EQ(5, s.read_1bytes());
642 642
643 - s.reset(); 643 + s.skip(-1 * s.pos());
644 EXPECT_EQ(ERROR_SUCCESS, o->read(&s)); 644 EXPECT_EQ(ERROR_SUCCESS, o->read(&s));
645 EXPECT_EQ(o->total_size(), s.pos()); 645 EXPECT_EQ(o->total_size(), s.pos());
646 EXPECT_TRUE(o->is_null()); 646 EXPECT_TRUE(o->is_null());
@@ -648,7 +648,7 @@ VOID TEST(AMF0Test, ApiAnyIO) @@ -648,7 +648,7 @@ VOID TEST(AMF0Test, ApiAnyIO)
648 648
649 // undefined 649 // undefined
650 if (true) { 650 if (true) {
651 - s.reset(); 651 + s.skip(-1 * s.pos());
652 652
653 o = SrsAmf0Any::undefined(); 653 o = SrsAmf0Any::undefined();
654 SrsAutoFree(SrsAmf0Any, o); 654 SrsAutoFree(SrsAmf0Any, o);
@@ -656,10 +656,10 @@ VOID TEST(AMF0Test, ApiAnyIO) @@ -656,10 +656,10 @@ VOID TEST(AMF0Test, ApiAnyIO)
656 EXPECT_EQ(ERROR_SUCCESS, o->write(&s)); 656 EXPECT_EQ(ERROR_SUCCESS, o->write(&s));
657 EXPECT_EQ(o->total_size(), s.pos()); 657 EXPECT_EQ(o->total_size(), s.pos());
658 658
659 - s.reset(); 659 + s.skip(-1 * s.pos());
660 EXPECT_EQ(6, s.read_1bytes()); 660 EXPECT_EQ(6, s.read_1bytes());
661 661
662 - s.reset(); 662 + s.skip(-1 * s.pos());
663 EXPECT_EQ(ERROR_SUCCESS, o->read(&s)); 663 EXPECT_EQ(ERROR_SUCCESS, o->read(&s));
664 EXPECT_EQ(o->total_size(), s.pos()); 664 EXPECT_EQ(o->total_size(), s.pos());
665 EXPECT_TRUE(o->is_undefined()); 665 EXPECT_TRUE(o->is_undefined());
@@ -667,7 +667,7 @@ VOID TEST(AMF0Test, ApiAnyIO) @@ -667,7 +667,7 @@ VOID TEST(AMF0Test, ApiAnyIO)
667 667
668 // any: string 668 // any: string
669 if (true) { 669 if (true) {
670 - s.reset(); 670 + s.skip(-1 * s.pos());
671 671
672 o = SrsAmf0Any::str("winlin"); 672 o = SrsAmf0Any::str("winlin");
673 SrsAutoFree(SrsAmf0Any, o); 673 SrsAutoFree(SrsAmf0Any, o);
@@ -675,7 +675,7 @@ VOID TEST(AMF0Test, ApiAnyIO) @@ -675,7 +675,7 @@ VOID TEST(AMF0Test, ApiAnyIO)
675 EXPECT_EQ(ERROR_SUCCESS, o->write(&s)); 675 EXPECT_EQ(ERROR_SUCCESS, o->write(&s));
676 EXPECT_EQ(o->total_size(), s.pos()); 676 EXPECT_EQ(o->total_size(), s.pos());
677 677
678 - s.reset(); 678 + s.skip(-1 * s.pos());
679 679
680 SrsAmf0Any* po = NULL; 680 SrsAmf0Any* po = NULL;
681 EXPECT_EQ(ERROR_SUCCESS, srs_amf0_read_any(&s, &po)); 681 EXPECT_EQ(ERROR_SUCCESS, srs_amf0_read_any(&s, &po));
@@ -687,7 +687,7 @@ VOID TEST(AMF0Test, ApiAnyIO) @@ -687,7 +687,7 @@ VOID TEST(AMF0Test, ApiAnyIO)
687 687
688 // any: number 688 // any: number
689 if (true) { 689 if (true) {
690 - s.reset(); 690 + s.skip(-1 * s.pos());
691 691
692 o = SrsAmf0Any::number(10); 692 o = SrsAmf0Any::number(10);
693 SrsAutoFree(SrsAmf0Any, o); 693 SrsAutoFree(SrsAmf0Any, o);
@@ -695,7 +695,7 @@ VOID TEST(AMF0Test, ApiAnyIO) @@ -695,7 +695,7 @@ VOID TEST(AMF0Test, ApiAnyIO)
695 EXPECT_EQ(ERROR_SUCCESS, o->write(&s)); 695 EXPECT_EQ(ERROR_SUCCESS, o->write(&s));
696 EXPECT_EQ(o->total_size(), s.pos()); 696 EXPECT_EQ(o->total_size(), s.pos());
697 697
698 - s.reset(); 698 + s.skip(-1 * s.pos());
699 699
700 SrsAmf0Any* po = NULL; 700 SrsAmf0Any* po = NULL;
701 EXPECT_EQ(ERROR_SUCCESS, srs_amf0_read_any(&s, &po)); 701 EXPECT_EQ(ERROR_SUCCESS, srs_amf0_read_any(&s, &po));
@@ -707,7 +707,7 @@ VOID TEST(AMF0Test, ApiAnyIO) @@ -707,7 +707,7 @@ VOID TEST(AMF0Test, ApiAnyIO)
707 707
708 // any: boolean 708 // any: boolean
709 if (true) { 709 if (true) {
710 - s.reset(); 710 + s.skip(-1 * s.pos());
711 711
712 o = SrsAmf0Any::boolean(true); 712 o = SrsAmf0Any::boolean(true);
713 SrsAutoFree(SrsAmf0Any, o); 713 SrsAutoFree(SrsAmf0Any, o);
@@ -715,7 +715,7 @@ VOID TEST(AMF0Test, ApiAnyIO) @@ -715,7 +715,7 @@ VOID TEST(AMF0Test, ApiAnyIO)
715 EXPECT_EQ(ERROR_SUCCESS, o->write(&s)); 715 EXPECT_EQ(ERROR_SUCCESS, o->write(&s));
716 EXPECT_EQ(o->total_size(), s.pos()); 716 EXPECT_EQ(o->total_size(), s.pos());
717 717
718 - s.reset(); 718 + s.skip(-1 * s.pos());
719 719
720 SrsAmf0Any* po = NULL; 720 SrsAmf0Any* po = NULL;
721 EXPECT_EQ(ERROR_SUCCESS, srs_amf0_read_any(&s, &po)); 721 EXPECT_EQ(ERROR_SUCCESS, srs_amf0_read_any(&s, &po));
@@ -727,7 +727,7 @@ VOID TEST(AMF0Test, ApiAnyIO) @@ -727,7 +727,7 @@ VOID TEST(AMF0Test, ApiAnyIO)
727 727
728 // any: null 728 // any: null
729 if (true) { 729 if (true) {
730 - s.reset(); 730 + s.skip(-1 * s.pos());
731 731
732 o = SrsAmf0Any::null(); 732 o = SrsAmf0Any::null();
733 SrsAutoFree(SrsAmf0Any, o); 733 SrsAutoFree(SrsAmf0Any, o);
@@ -735,7 +735,7 @@ VOID TEST(AMF0Test, ApiAnyIO) @@ -735,7 +735,7 @@ VOID TEST(AMF0Test, ApiAnyIO)
735 EXPECT_EQ(ERROR_SUCCESS, o->write(&s)); 735 EXPECT_EQ(ERROR_SUCCESS, o->write(&s));
736 EXPECT_EQ(o->total_size(), s.pos()); 736 EXPECT_EQ(o->total_size(), s.pos());
737 737
738 - s.reset(); 738 + s.skip(-1 * s.pos());
739 739
740 SrsAmf0Any* po = NULL; 740 SrsAmf0Any* po = NULL;
741 EXPECT_EQ(ERROR_SUCCESS, srs_amf0_read_any(&s, &po)); 741 EXPECT_EQ(ERROR_SUCCESS, srs_amf0_read_any(&s, &po));
@@ -746,7 +746,7 @@ VOID TEST(AMF0Test, ApiAnyIO) @@ -746,7 +746,7 @@ VOID TEST(AMF0Test, ApiAnyIO)
746 746
747 // any: undefined 747 // any: undefined
748 if (true) { 748 if (true) {
749 - s.reset(); 749 + s.skip(-1 * s.pos());
750 750
751 o = SrsAmf0Any::undefined(); 751 o = SrsAmf0Any::undefined();
752 SrsAutoFree(SrsAmf0Any, o); 752 SrsAutoFree(SrsAmf0Any, o);
@@ -754,7 +754,7 @@ VOID TEST(AMF0Test, ApiAnyIO) @@ -754,7 +754,7 @@ VOID TEST(AMF0Test, ApiAnyIO)
754 EXPECT_EQ(ERROR_SUCCESS, o->write(&s)); 754 EXPECT_EQ(ERROR_SUCCESS, o->write(&s));
755 EXPECT_EQ(o->total_size(), s.pos()); 755 EXPECT_EQ(o->total_size(), s.pos());
756 756
757 - s.reset(); 757 + s.skip(-1 * s.pos());
758 758
759 SrsAmf0Any* po = NULL; 759 SrsAmf0Any* po = NULL;
760 EXPECT_EQ(ERROR_SUCCESS, srs_amf0_read_any(&s, &po)); 760 EXPECT_EQ(ERROR_SUCCESS, srs_amf0_read_any(&s, &po));
@@ -765,7 +765,7 @@ VOID TEST(AMF0Test, ApiAnyIO) @@ -765,7 +765,7 @@ VOID TEST(AMF0Test, ApiAnyIO)
765 765
766 // mixed any 766 // mixed any
767 if (true) { 767 if (true) {
768 - s.reset(); 768 + s.skip(-1 * s.pos());
769 769
770 o = SrsAmf0Any::str("winlin"); 770 o = SrsAmf0Any::str("winlin");
771 EXPECT_EQ(ERROR_SUCCESS, o->write(&s)); 771 EXPECT_EQ(ERROR_SUCCESS, o->write(&s));
@@ -787,7 +787,7 @@ VOID TEST(AMF0Test, ApiAnyIO) @@ -787,7 +787,7 @@ VOID TEST(AMF0Test, ApiAnyIO)
787 EXPECT_EQ(ERROR_SUCCESS, o->write(&s)); 787 EXPECT_EQ(ERROR_SUCCESS, o->write(&s));
788 srs_freep(o); 788 srs_freep(o);
789 789
790 - s.reset(); 790 + s.skip(-1 * s.pos());
791 SrsAmf0Any* po = NULL; 791 SrsAmf0Any* po = NULL;
792 792
793 EXPECT_EQ(ERROR_SUCCESS, srs_amf0_read_any(&s, &po)); 793 EXPECT_EQ(ERROR_SUCCESS, srs_amf0_read_any(&s, &po));
@@ -831,8 +831,8 @@ VOID TEST(AMF0Test, ApiAnyAssert) @@ -831,8 +831,8 @@ VOID TEST(AMF0Test, ApiAnyAssert)
831 831
832 // read any 832 // read any
833 if (true) { 833 if (true) {
834 - s.reset();  
835 - s.current()[0] = 0x12; 834 + s.skip(-1 * s.pos());
  835 + (s.data() + s.pos())[0] = 0x12;
836 EXPECT_NE(ERROR_SUCCESS, srs_amf0_read_any(&s, &o)); 836 EXPECT_NE(ERROR_SUCCESS, srs_amf0_read_any(&s, &o));
837 EXPECT_TRUE(NULL == o); 837 EXPECT_TRUE(NULL == o);
838 srs_freep(o); 838 srs_freep(o);
@@ -884,7 +884,7 @@ VOID TEST(AMF0Test, ApiAnyAssert) @@ -884,7 +884,7 @@ VOID TEST(AMF0Test, ApiAnyAssert)
884 if (true) { 884 if (true) {
885 o = SrsAmf0Any::object(); 885 o = SrsAmf0Any::object();
886 SrsAutoFree(SrsAmf0Any, o); 886 SrsAutoFree(SrsAmf0Any, o);
887 - s.reset(); 887 + s.skip(-1 * s.pos());
888 EXPECT_EQ(ERROR_SUCCESS, o->write(&s)); 888 EXPECT_EQ(ERROR_SUCCESS, o->write(&s));
889 EXPECT_EQ(1+3, s.pos()); 889 EXPECT_EQ(1+3, s.pos());
890 } 890 }
@@ -893,7 +893,7 @@ VOID TEST(AMF0Test, ApiAnyAssert) @@ -893,7 +893,7 @@ VOID TEST(AMF0Test, ApiAnyAssert)
893 if (true) { 893 if (true) {
894 o = SrsAmf0Any::ecma_array(); 894 o = SrsAmf0Any::ecma_array();
895 SrsAutoFree(SrsAmf0Any, o); 895 SrsAutoFree(SrsAmf0Any, o);
896 - s.reset(); 896 + s.skip(-1 * s.pos());
897 EXPECT_EQ(ERROR_SUCCESS, o->write(&s)); 897 EXPECT_EQ(ERROR_SUCCESS, o->write(&s));
898 EXPECT_EQ(1+4+3, s.pos()); 898 EXPECT_EQ(1+4+3, s.pos());
899 } 899 }
@@ -902,7 +902,7 @@ VOID TEST(AMF0Test, ApiAnyAssert) @@ -902,7 +902,7 @@ VOID TEST(AMF0Test, ApiAnyAssert)
902 if (true) { 902 if (true) {
903 o = SrsAmf0Any::strict_array(); 903 o = SrsAmf0Any::strict_array();
904 SrsAutoFree(SrsAmf0Any, o); 904 SrsAutoFree(SrsAmf0Any, o);
905 - s.reset(); 905 + s.skip(-1 * s.pos());
906 EXPECT_EQ(ERROR_SUCCESS, o->write(&s)); 906 EXPECT_EQ(ERROR_SUCCESS, o->write(&s));
907 EXPECT_EQ(1+4, s.pos()); 907 EXPECT_EQ(1+4, s.pos());
908 } 908 }
@@ -1111,11 +1111,11 @@ VOID TEST(AMF0Test, ApiStrictArray) @@ -1111,11 +1111,11 @@ VOID TEST(AMF0Test, ApiStrictArray)
1111 o = SrsAmf0Any::strict_array(); 1111 o = SrsAmf0Any::strict_array();
1112 SrsAutoFree(SrsAmf0StrictArray, o); 1112 SrsAutoFree(SrsAmf0StrictArray, o);
1113 1113
1114 - s.reset(); 1114 + s.skip(-1 * s.pos());
1115 EXPECT_EQ(ERROR_SUCCESS, o->write(&s)); 1115 EXPECT_EQ(ERROR_SUCCESS, o->write(&s));
1116 EXPECT_EQ(5, s.pos()); 1116 EXPECT_EQ(5, s.pos());
1117 1117
1118 - s.reset(); 1118 + s.skip(-1 * s.pos());
1119 EXPECT_EQ(0x0a, s.read_1bytes()); 1119 EXPECT_EQ(0x0a, s.read_1bytes());
1120 EXPECT_EQ(0x00, s.read_4bytes()); 1120 EXPECT_EQ(0x00, s.read_4bytes());
1121 } 1121 }
@@ -1126,7 +1126,7 @@ VOID TEST(AMF0Test, ApiStrictArray) @@ -1126,7 +1126,7 @@ VOID TEST(AMF0Test, ApiStrictArray)
1126 1126
1127 o->append(SrsAmf0Any::number(0)); 1127 o->append(SrsAmf0Any::number(0));
1128 1128
1129 - s.reset(); 1129 + s.skip(-1 * s.pos());
1130 EXPECT_EQ(ERROR_SUCCESS, o->write(&s)); 1130 EXPECT_EQ(ERROR_SUCCESS, o->write(&s));
1131 EXPECT_EQ(5 + SrsAmf0Size::number(), s.pos()); 1131 EXPECT_EQ(5 + SrsAmf0Size::number(), s.pos());
1132 } 1132 }
@@ -29,6 +29,7 @@ using namespace std; @@ -29,6 +29,7 @@ using namespace std;
29 #include <srs_kernel_flv.hpp> 29 #include <srs_kernel_flv.hpp>
30 #include <srs_kernel_utility.hpp> 30 #include <srs_kernel_utility.hpp>
31 #include <srs_protocol_utility.hpp> 31 #include <srs_protocol_utility.hpp>
  32 +#include <srs_kernel_stream.hpp>
32 33
33 #define MAX_MOCK_DATA_SIZE 1024 * 1024 34 #define MAX_MOCK_DATA_SIZE 1024 * 1024
34 35
@@ -198,7 +199,7 @@ int MockBufferReader::read(void* buf, size_t size, ssize_t* nread) @@ -198,7 +199,7 @@ int MockBufferReader::read(void* buf, size_t size, ssize_t* nread)
198 return ERROR_SUCCESS; 199 return ERROR_SUCCESS;
199 } 200 }
200 201
201 -VOID TEST(BufferTest, DefaultObject) 202 +VOID TEST(KernelBufferTest, DefaultObject)
202 { 203 {
203 SrsBuffer b; 204 SrsBuffer b;
204 205
@@ -206,7 +207,7 @@ VOID TEST(BufferTest, DefaultObject) @@ -206,7 +207,7 @@ VOID TEST(BufferTest, DefaultObject)
206 EXPECT_EQ(NULL, b.bytes()); 207 EXPECT_EQ(NULL, b.bytes());
207 } 208 }
208 209
209 -VOID TEST(BufferTest, AppendBytes) 210 +VOID TEST(KernelBufferTest, AppendBytes)
210 { 211 {
211 SrsBuffer b; 212 SrsBuffer b;
212 213
@@ -226,7 +227,7 @@ VOID TEST(BufferTest, AppendBytes) @@ -226,7 +227,7 @@ VOID TEST(BufferTest, AppendBytes)
226 EXPECT_EQ('n', b.bytes()[11]); 227 EXPECT_EQ('n', b.bytes()[11]);
227 } 228 }
228 229
229 -VOID TEST(BufferTest, EraseBytes) 230 +VOID TEST(KernelBufferTest, EraseBytes)
230 { 231 {
231 SrsBuffer b; 232 SrsBuffer b;
232 233
@@ -262,7 +263,7 @@ VOID TEST(BufferTest, EraseBytes) @@ -262,7 +263,7 @@ VOID TEST(BufferTest, EraseBytes)
262 EXPECT_EQ(0, b.length()); 263 EXPECT_EQ(0, b.length());
263 } 264 }
264 265
265 -VOID TEST(BufferTest, Grow) 266 +VOID TEST(KernelBufferTest, Grow)
266 { 267 {
267 SrsBuffer b; 268 SrsBuffer b;
268 MockBufferReader r("winlin"); 269 MockBufferReader r("winlin");
@@ -954,3 +955,557 @@ VOID TEST(KernelFlvTest, FlvVSDecoderSeek) @@ -954,3 +955,557 @@ VOID TEST(KernelFlvTest, FlvVSDecoderSeek)
954 EXPECT_TRUE(ERROR_SUCCESS == dec.lseek(5)); 955 EXPECT_TRUE(ERROR_SUCCESS == dec.lseek(5));
955 EXPECT_TRUE(5 == fs.offset); 956 EXPECT_TRUE(5 == fs.offset);
956 } 957 }
  958 +
  959 +/**
  960 +* test the stream utility, bytes from/to basic types.
  961 +*/
  962 +VOID TEST(KernelStreamTest, StreamInitialize)
  963 +{
  964 + SrsStream s;
  965 + char data[1024];
  966 +
  967 + EXPECT_TRUE(ERROR_SUCCESS == s.initialize(data, 1024));
  968 + EXPECT_TRUE(ERROR_SUCCESS != s.initialize(NULL, 1024));
  969 + EXPECT_TRUE(ERROR_SUCCESS != s.initialize(data, 0));
  970 + EXPECT_TRUE(ERROR_SUCCESS != s.initialize(data, -1));
  971 +}
  972 +
  973 +/**
  974 +* test the stream utility, access data
  975 +*/
  976 +VOID TEST(KernelStreamTest, StreamData)
  977 +{
  978 + SrsStream s;
  979 + char data[1024];
  980 +
  981 + EXPECT_TRUE(s.data() == NULL);
  982 + EXPECT_TRUE(ERROR_SUCCESS == s.initialize(data, 1024));
  983 + EXPECT_TRUE(s.data() == data);
  984 +}
  985 +
  986 +/**
  987 +* test the stream utility, access size
  988 +*/
  989 +VOID TEST(KernelStreamTest, StreamSize)
  990 +{
  991 + SrsStream s;
  992 + char data[1024];
  993 +
  994 + EXPECT_TRUE(s.size() == 0);
  995 + EXPECT_TRUE(ERROR_SUCCESS == s.initialize(data, 1024));
  996 + EXPECT_TRUE(s.size() == 1024);
  997 +}
  998 +
  999 +/**
  1000 +* test the stream utility, access pos
  1001 +*/
  1002 +VOID TEST(KernelStreamTest, StreamPos)
  1003 +{
  1004 + SrsStream s;
  1005 + char data[1024];
  1006 +
  1007 + EXPECT_TRUE(s.pos() == 0);
  1008 + EXPECT_TRUE(ERROR_SUCCESS == s.initialize(data, 1024));
  1009 + EXPECT_TRUE(s.pos() == 0);
  1010 +
  1011 + s.read_bytes(data, 1024);
  1012 + EXPECT_TRUE(s.pos() == 1024);
  1013 +}
  1014 +
  1015 +/**
  1016 +* test the stream utility, access empty
  1017 +*/
  1018 +VOID TEST(KernelStreamTest, StreamEmpty)
  1019 +{
  1020 + SrsStream s;
  1021 + char data[1024];
  1022 +
  1023 + EXPECT_TRUE(s.empty());
  1024 + EXPECT_TRUE(ERROR_SUCCESS == s.initialize(data, 1024));
  1025 + EXPECT_FALSE(s.empty());
  1026 +
  1027 + s.read_bytes(data, 1024);
  1028 + EXPECT_TRUE(s.empty());
  1029 +}
  1030 +
  1031 +/**
  1032 +* test the stream utility, access require
  1033 +*/
  1034 +VOID TEST(KernelStreamTest, StreamRequire)
  1035 +{
  1036 + SrsStream s;
  1037 + char data[1024];
  1038 +
  1039 + EXPECT_FALSE(s.require(1));
  1040 + EXPECT_TRUE(ERROR_SUCCESS == s.initialize(data, 1024));
  1041 + EXPECT_TRUE(s.require(1));
  1042 + EXPECT_TRUE(s.require(1024));
  1043 +
  1044 + s.read_bytes(data, 1000);
  1045 + EXPECT_TRUE(s.require(1));
  1046 +
  1047 + s.read_bytes(data, 24);
  1048 + EXPECT_FALSE(s.require(1));
  1049 +}
  1050 +
  1051 +/**
  1052 +* test the stream utility, skip bytes
  1053 +*/
  1054 +VOID TEST(KernelStreamTest, StreamSkip)
  1055 +{
  1056 + SrsStream s;
  1057 + char data[1024];
  1058 +
  1059 + EXPECT_TRUE(ERROR_SUCCESS == s.initialize(data, 1024));
  1060 + EXPECT_EQ(0, s.pos());
  1061 +
  1062 + s.skip(1);
  1063 + EXPECT_EQ(1, s.pos());
  1064 +
  1065 + s.skip(-1);
  1066 + EXPECT_EQ(0 , s.pos());
  1067 +}
  1068 +
  1069 +/**
  1070 +* test the stream utility, read 1bytes
  1071 +*/
  1072 +VOID TEST(KernelStreamTest, StreamRead1Bytes)
  1073 +{
  1074 + SrsStream s;
  1075 + char data[1024];
  1076 +
  1077 + EXPECT_TRUE(ERROR_SUCCESS == s.initialize(data, 1024));
  1078 +
  1079 + data[0] = 0x12;
  1080 + data[99] = 0x13;
  1081 + data[100] = 0x14;
  1082 + data[101] = 0x15;
  1083 + EXPECT_EQ(0x12, s.read_1bytes());
  1084 +
  1085 + s.skip(-1 * s.pos());
  1086 + s.skip(100);
  1087 + EXPECT_EQ(0x14, s.read_1bytes());
  1088 +}
  1089 +
  1090 +/**
  1091 +* test the stream utility, read 2bytes
  1092 +*/
  1093 +VOID TEST(KernelStreamTest, StreamRead2Bytes)
  1094 +{
  1095 + SrsStream s;
  1096 + char data[1024];
  1097 +
  1098 + EXPECT_TRUE(ERROR_SUCCESS == s.initialize(data, 1024));
  1099 +
  1100 + data[0] = 0x01;
  1101 + data[1] = 0x02;
  1102 + data[2] = 0x03;
  1103 + data[3] = 0x04;
  1104 + data[4] = 0x05;
  1105 + data[5] = 0x06;
  1106 + data[6] = 0x07;
  1107 + data[7] = 0x08;
  1108 + data[8] = 0x09;
  1109 + data[9] = 0x0a;
  1110 +
  1111 + EXPECT_EQ(0x0102, s.read_2bytes());
  1112 + EXPECT_EQ(0x0304, s.read_2bytes());
  1113 +
  1114 + s.skip(-1 * s.pos());
  1115 + s.skip(3);
  1116 + EXPECT_EQ(0x0405, s.read_2bytes());
  1117 +}
  1118 +
  1119 +/**
  1120 +* test the stream utility, read 3bytes
  1121 +*/
  1122 +VOID TEST(KernelStreamTest, StreamRead3Bytes)
  1123 +{
  1124 + SrsStream s;
  1125 + char data[1024];
  1126 +
  1127 + EXPECT_TRUE(ERROR_SUCCESS == s.initialize(data, 1024));
  1128 +
  1129 + data[0] = 0x01;
  1130 + data[1] = 0x02;
  1131 + data[2] = 0x03;
  1132 + data[3] = 0x04;
  1133 + data[4] = 0x05;
  1134 + data[5] = 0x06;
  1135 + data[6] = 0x07;
  1136 + data[7] = 0x08;
  1137 + data[8] = 0x09;
  1138 + data[9] = 0x0a;
  1139 +
  1140 + EXPECT_EQ(0x010203, s.read_3bytes());
  1141 + EXPECT_EQ(0x040506, s.read_3bytes());
  1142 +
  1143 + s.skip(-1 * s.pos());
  1144 + s.skip(5);
  1145 + EXPECT_EQ(0x060708, s.read_3bytes());
  1146 +}
  1147 +
  1148 +/**
  1149 +* test the stream utility, read 4bytes
  1150 +*/
  1151 +VOID TEST(KernelStreamTest, StreamRead4Bytes)
  1152 +{
  1153 + SrsStream s;
  1154 + char data[1024];
  1155 +
  1156 + EXPECT_TRUE(ERROR_SUCCESS == s.initialize(data, 1024));
  1157 +
  1158 + data[0] = 0x01;
  1159 + data[1] = 0x02;
  1160 + data[2] = 0x03;
  1161 + data[3] = 0x04;
  1162 + data[4] = 0x05;
  1163 + data[5] = 0x06;
  1164 + data[6] = 0x07;
  1165 + data[7] = 0x08;
  1166 + data[8] = 0x09;
  1167 + data[9] = 0x0a;
  1168 +
  1169 + EXPECT_EQ(0x01020304, s.read_4bytes());
  1170 + EXPECT_EQ(0x05060708, s.read_4bytes());
  1171 +
  1172 + s.skip(-1 * s.pos());
  1173 + s.skip(5);
  1174 + EXPECT_EQ(0x06070809, s.read_4bytes());
  1175 +}
  1176 +
  1177 +/**
  1178 +* test the stream utility, read 8bytes
  1179 +*/
  1180 +VOID TEST(KernelStreamTest, StreamRead8Bytes)
  1181 +{
  1182 + SrsStream s;
  1183 + char data[1024];
  1184 +
  1185 + EXPECT_TRUE(ERROR_SUCCESS == s.initialize(data, 1024));
  1186 +
  1187 + data[0] = 0x01;
  1188 + data[1] = 0x02;
  1189 + data[2] = 0x03;
  1190 + data[3] = 0x04;
  1191 + data[4] = 0x05;
  1192 + data[5] = 0x06;
  1193 + data[6] = 0x07;
  1194 + data[7] = 0x08;
  1195 + data[8] = 0x09;
  1196 + data[9] = 0x0a;
  1197 + data[10] = 0x0b;
  1198 + data[11] = 0x0c;
  1199 + data[12] = 0x0d;
  1200 + data[13] = 0x0e;
  1201 + data[14] = 0x0f;
  1202 + data[15] = 0x10;
  1203 + data[16] = 0x11;
  1204 + data[17] = 0x12;
  1205 + data[18] = 0x13;
  1206 + data[19] = 0x14;
  1207 +
  1208 + EXPECT_EQ(0x0102030405060708, s.read_8bytes());
  1209 + EXPECT_EQ(0x090a0b0c0d0e0f10, s.read_8bytes());
  1210 +
  1211 + s.skip(-1 * s.pos());
  1212 + s.skip(5);
  1213 + EXPECT_EQ(0x060708090a0b0c0d, s.read_8bytes());
  1214 +}
  1215 +
  1216 +/**
  1217 +* test the stream utility, read string
  1218 +*/
  1219 +VOID TEST(KernelStreamTest, StreamReadString)
  1220 +{
  1221 + SrsStream s;
  1222 + char data[] = "Hello, world!";
  1223 +
  1224 + EXPECT_TRUE(ERROR_SUCCESS == s.initialize(data, sizeof(data) - 1));
  1225 +
  1226 + string str = s.read_string(2);
  1227 + EXPECT_STREQ("He", str.c_str());
  1228 +
  1229 + str = s.read_string(2);
  1230 + EXPECT_STREQ("ll", str.c_str());
  1231 +
  1232 + s.skip(3);
  1233 + str = s.read_string(6);
  1234 + EXPECT_STREQ("world!", str.c_str());
  1235 +
  1236 + EXPECT_TRUE(s.empty());
  1237 +}
  1238 +
  1239 +/**
  1240 +* test the stream utility, read bytes
  1241 +*/
  1242 +VOID TEST(KernelStreamTest, StreamReadBytes)
  1243 +{
  1244 + SrsStream s;
  1245 + char data[] = "Hello, world!";
  1246 +
  1247 + EXPECT_TRUE(ERROR_SUCCESS == s.initialize(data, sizeof(data) - 1));
  1248 +
  1249 + char bytes[64];
  1250 + s.read_bytes(bytes, 2);
  1251 + bytes[2] = 0;
  1252 + EXPECT_STREQ("He", bytes);
  1253 +
  1254 + s.read_bytes(bytes, 2);
  1255 + bytes[2] = 0;
  1256 + EXPECT_STREQ("ll", bytes);
  1257 +
  1258 + s.skip(3);
  1259 + s.read_bytes(bytes, 6);
  1260 + bytes[6] = 0;
  1261 + EXPECT_STREQ("world!", bytes);
  1262 +
  1263 + EXPECT_TRUE(s.empty());
  1264 +}
  1265 +
  1266 +/**
  1267 +* test the stream utility, write 1bytes
  1268 +*/
  1269 +VOID TEST(KernelStreamTest, StreamWrite1Bytes)
  1270 +{
  1271 + SrsStream s;
  1272 + char data[1024];
  1273 +
  1274 + EXPECT_TRUE(ERROR_SUCCESS == s.initialize(data, 1024));
  1275 +
  1276 + s.write_1bytes(0x10);
  1277 + s.write_1bytes(0x11);
  1278 + s.write_1bytes(0x12);
  1279 + s.write_1bytes(0x13);
  1280 +
  1281 + s.skip(-1 * s.pos());
  1282 + EXPECT_EQ(0x10, s.read_1bytes());
  1283 + s.skip(2);
  1284 + EXPECT_EQ(0x13, s.read_1bytes());
  1285 +}
  1286 +
  1287 +/**
  1288 +* test the stream utility, write 2bytes
  1289 +*/
  1290 +VOID TEST(KernelStreamTest, StreamWrite2Bytes)
  1291 +{
  1292 + SrsStream s;
  1293 + char data[1024];
  1294 +
  1295 + EXPECT_TRUE(ERROR_SUCCESS == s.initialize(data, 1024));
  1296 +
  1297 + s.write_2bytes(0x1011);
  1298 + s.write_2bytes(0x1213);
  1299 + s.write_2bytes(0x1415);
  1300 + s.write_2bytes(0x1617);
  1301 + s.write_2bytes(0x1819);
  1302 +
  1303 + s.skip(-1 * s.pos());
  1304 + EXPECT_EQ(0x10, s.read_1bytes());
  1305 + s.skip(2);
  1306 + EXPECT_EQ(0x13, s.read_1bytes());
  1307 + s.skip(5);
  1308 + EXPECT_EQ(0x19, s.read_1bytes());
  1309 +}
  1310 +
  1311 +/**
  1312 +* test the stream utility, write 3bytes
  1313 +*/
  1314 +VOID TEST(KernelStreamTest, StreamWrite3Bytes)
  1315 +{
  1316 + SrsStream s;
  1317 + char data[1024];
  1318 +
  1319 + EXPECT_TRUE(ERROR_SUCCESS == s.initialize(data, 1024));
  1320 +
  1321 + s.write_3bytes(0x101112);
  1322 + s.write_3bytes(0x131415);
  1323 + s.write_3bytes(0x161718);
  1324 + s.write_3bytes(0x192021);
  1325 +
  1326 + s.skip(-1 * s.pos());
  1327 + EXPECT_EQ(0x10, s.read_1bytes());
  1328 + s.skip(2);
  1329 + EXPECT_EQ(0x13, s.read_1bytes());
  1330 + s.skip(5);
  1331 + EXPECT_EQ(0x19, s.read_1bytes());
  1332 +}
  1333 +
  1334 +/**
  1335 +* test the stream utility, write 34bytes
  1336 +*/
  1337 +VOID TEST(KernelStreamTest, StreamWrite4Bytes)
  1338 +{
  1339 + SrsStream s;
  1340 + char data[1024];
  1341 +
  1342 + EXPECT_TRUE(ERROR_SUCCESS == s.initialize(data, 1024));
  1343 +
  1344 + s.write_4bytes(0x10111213);
  1345 + s.write_4bytes(0x14151617);
  1346 + s.write_4bytes(0x18192021);
  1347 +
  1348 + s.skip(-1 * s.pos());
  1349 + EXPECT_EQ(0x10, s.read_1bytes());
  1350 + s.skip(2);
  1351 + EXPECT_EQ(0x13, s.read_1bytes());
  1352 + s.skip(5);
  1353 + EXPECT_EQ(0x19, s.read_1bytes());
  1354 +}
  1355 +
  1356 +/**
  1357 +* test the stream utility, write 8bytes
  1358 +*/
  1359 +VOID TEST(KernelStreamTest, StreamWrite8Bytes)
  1360 +{
  1361 + SrsStream s;
  1362 + char data[1024];
  1363 +
  1364 + EXPECT_TRUE(ERROR_SUCCESS == s.initialize(data, 1024));
  1365 +
  1366 + s.write_8bytes(0x1011121314151617);
  1367 + s.write_8bytes(0x1819202122232425);
  1368 +
  1369 + s.skip(-1 * s.pos());
  1370 + EXPECT_EQ(0x10, s.read_1bytes());
  1371 + s.skip(2);
  1372 + EXPECT_EQ(0x13, s.read_1bytes());
  1373 + s.skip(5);
  1374 + EXPECT_EQ(0x19, s.read_1bytes());
  1375 +}
  1376 +
  1377 +/**
  1378 +* test the stream utility, write string
  1379 +*/
  1380 +VOID TEST(KernelStreamTest, StreamWriteString)
  1381 +{
  1382 + SrsStream s;
  1383 + char data[1024];
  1384 +
  1385 + EXPECT_TRUE(ERROR_SUCCESS == s.initialize(data, 1024));
  1386 +
  1387 + char str[] = {
  1388 + (char)0x10, (char)0x11, (char)0x12, (char)0x13,
  1389 + (char)0x14, (char)0x15, (char)0x16, (char)0x17,
  1390 + (char)0x18, (char)0x19, (char)0x20, (char)0x21
  1391 + };
  1392 + string str1;
  1393 + str1.append(str, 12);
  1394 +
  1395 + s.write_string(str1);
  1396 +
  1397 + s.skip(-1 * s.pos());
  1398 + EXPECT_EQ(0x10, s.read_1bytes());
  1399 + s.skip(2);
  1400 + EXPECT_EQ(0x13, s.read_1bytes());
  1401 + s.skip(5);
  1402 + EXPECT_EQ(0x19, s.read_1bytes());
  1403 +}
  1404 +
  1405 +/**
  1406 +* test the stream utility, write bytes
  1407 +*/
  1408 +VOID TEST(KernelStreamTest, StreamWriteBytes)
  1409 +{
  1410 + SrsStream s;
  1411 + char data[1024];
  1412 +
  1413 + EXPECT_TRUE(ERROR_SUCCESS == s.initialize(data, 1024));
  1414 +
  1415 + char str[] = {
  1416 + (char)0x10, (char)0x11, (char)0x12, (char)0x13,
  1417 + (char)0x14, (char)0x15, (char)0x16, (char)0x17,
  1418 + (char)0x18, (char)0x19, (char)0x20, (char)0x21
  1419 + };
  1420 +
  1421 + s.write_bytes(str, 12);
  1422 +
  1423 + s.skip(-1 * s.pos());
  1424 + EXPECT_EQ(0x10, s.read_1bytes());
  1425 + s.skip(2);
  1426 + EXPECT_EQ(0x13, s.read_1bytes());
  1427 + s.skip(5);
  1428 + EXPECT_EQ(0x19, s.read_1bytes());
  1429 +}
  1430 +
  1431 +/**
  1432 +* test the kernel utility, time
  1433 +*/
  1434 +VOID TEST(KernelUtilityTest, UtilityTime)
  1435 +{
  1436 + int64_t time = srs_get_system_time_ms();
  1437 + EXPECT_TRUE(time > 0);
  1438 +
  1439 + int64_t time1 = srs_get_system_time_ms();
  1440 + EXPECT_EQ(time, time1);
  1441 +
  1442 + usleep(1000);
  1443 + srs_update_system_time_ms();
  1444 + time1 = srs_get_system_time_ms();
  1445 + EXPECT_TRUE(time1 > time);
  1446 +}
  1447 +
  1448 +/**
  1449 +* test the kernel utility, startup time
  1450 +*/
  1451 +VOID TEST(KernelUtilityTest, UtilityStartupTime)
  1452 +{
  1453 + int64_t time = srs_get_system_startup_time_ms();
  1454 + EXPECT_TRUE(time > 0);
  1455 +
  1456 + int64_t time1 = srs_get_system_startup_time_ms();
  1457 + EXPECT_EQ(time, time1);
  1458 +
  1459 + usleep(1000);
  1460 + srs_update_system_time_ms();
  1461 + time1 = srs_get_system_startup_time_ms();
  1462 + EXPECT_EQ(time, time1);
  1463 +}
  1464 +
  1465 +/**
  1466 +* test the kernel utility, little endian
  1467 +*/
  1468 +VOID TEST(KernelUtilityTest, UtilityLittleEndian)
  1469 +{
  1470 + EXPECT_TRUE(srs_is_little_endian());
  1471 +}
  1472 +
  1473 +/**
  1474 +* test the kernel utility, string
  1475 +*/
  1476 +VOID TEST(KernelUtilityTest, UtilityString)
  1477 +{
  1478 + string str = "Hello, World! Hello, SRS!";
  1479 + string str1;
  1480 +
  1481 + str1 = srs_string_replace(str, "xxx", "");
  1482 + EXPECT_STREQ("Hello, World! Hello, SRS!", str1.c_str());
  1483 +
  1484 + str1 = srs_string_replace(str, "He", "XX");
  1485 + EXPECT_STREQ("XXllo, World! XXllo, SRS!", str1.c_str());
  1486 +
  1487 + str1 = srs_string_replace(str, "o", "XX");
  1488 + EXPECT_STREQ("HellXX, WXXrld! HellXX, SRS!", str1.c_str());
  1489 +
  1490 + str1 = srs_string_trim_end(str, "x");
  1491 + EXPECT_STREQ("Hello, World! Hello, SRS!", str1.c_str());
  1492 +
  1493 + str1 = srs_string_trim_end(str, "He");
  1494 + EXPECT_STREQ("Hello, World! Hello, SRS!", str1.c_str());
  1495 +
  1496 + str1 = srs_string_trim_end(str, "HeS!R");
  1497 + EXPECT_STREQ("Hello, World! Hello, ", str1.c_str());
  1498 +
  1499 + str1 = srs_string_remove(str, "x");
  1500 + EXPECT_STREQ("Hello, World! Hello, SRS!", str1.c_str());
  1501 +
  1502 + str1 = srs_string_remove(str, "o");
  1503 + EXPECT_STREQ("Hell, Wrld! Hell, SRS!", str1.c_str());
  1504 +
  1505 + str1 = srs_string_remove(str, "ol");
  1506 + EXPECT_STREQ("He, Wrd! He, SRS!", str1.c_str());
  1507 +
  1508 + EXPECT_FALSE(srs_string_ends_with("Hello", "x"));
  1509 + EXPECT_TRUE(srs_string_ends_with("Hello", "o"));
  1510 + EXPECT_TRUE(srs_string_ends_with("Hello", "lo"));
  1511 +}