winlin

refine hls codec sample info. 0.9.161

@@ -30,26 +30,14 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. @@ -30,26 +30,14 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
30 #include <srs_kernel_codec.hpp> 30 #include <srs_kernel_codec.hpp>
31 #include <srs_kernel_stream.hpp> 31 #include <srs_kernel_stream.hpp>
32 32
33 -SrsCodecBuffer::SrsCodecBuffer() 33 +SrsCodecSampleUnit::SrsCodecSampleUnit()
34 { 34 {
35 size = 0; 35 size = 0;
36 bytes = NULL; 36 bytes = NULL;
37 } 37 }
38 38
39 -void SrsCodecBuffer::append(void* data, int len) 39 +SrsCodecSampleUnit::~SrsCodecSampleUnit()
40 { 40 {
41 - srs_assert(data);  
42 - srs_assert(len > 0);  
43 -  
44 - bytes = (char*)realloc(bytes, size + len);  
45 - memcpy(bytes + size, data, len);  
46 - size += len;  
47 -}  
48 -  
49 -void SrsCodecBuffer::free()  
50 -{  
51 - size = 0;  
52 - srs_freep(bytes);  
53 } 41 }
54 42
55 SrsCodecSample::SrsCodecSample() 43 SrsCodecSample::SrsCodecSample()
@@ -64,7 +52,7 @@ SrsCodecSample::~SrsCodecSample() @@ -64,7 +52,7 @@ SrsCodecSample::~SrsCodecSample()
64 void SrsCodecSample::clear() 52 void SrsCodecSample::clear()
65 { 53 {
66 is_video = false; 54 is_video = false;
67 - nb_buffers = 0; 55 + nb_sample_units = 0;
68 56
69 cts = 0; 57 cts = 0;
70 frame_type = SrsCodecVideoAVCFrameReserved; 58 frame_type = SrsCodecVideoAVCFrameReserved;
@@ -76,20 +64,20 @@ void SrsCodecSample::clear() @@ -76,20 +64,20 @@ void SrsCodecSample::clear()
76 aac_packet_type = SrsCodecAudioTypeReserved; 64 aac_packet_type = SrsCodecAudioTypeReserved;
77 } 65 }
78 66
79 -int SrsCodecSample::add_sample(char* bytes, int size) 67 +int SrsCodecSample::add_sample_unit(char* bytes, int size)
80 { 68 {
81 int ret = ERROR_SUCCESS; 69 int ret = ERROR_SUCCESS;
82 70
83 - if (nb_buffers >= SRS_MAX_CODEC_SAMPLE) { 71 + if (nb_sample_units >= SRS_MAX_CODEC_SAMPLE) {
84 ret = ERROR_HLS_DECODE_ERROR; 72 ret = ERROR_HLS_DECODE_ERROR;
85 srs_error("hls decode samples error, " 73 srs_error("hls decode samples error, "
86 "exceed the max count: %d, ret=%d", SRS_MAX_CODEC_SAMPLE, ret); 74 "exceed the max count: %d, ret=%d", SRS_MAX_CODEC_SAMPLE, ret);
87 return ret; 75 return ret;
88 } 76 }
89 77
90 - SrsCodecBuffer* buf = &buffers[nb_buffers++];  
91 - buf->bytes = bytes;  
92 - buf->size = size; 78 + SrsCodecSampleUnit* sample_unit = &sample_units[nb_sample_units++];
  79 + sample_unit->bytes = bytes;
  80 + sample_unit->size = size;
93 81
94 return ret; 82 return ret;
95 } 83 }
@@ -239,7 +227,7 @@ int SrsAvcAacCodec::audio_aac_demux(char* data, int size, SrsCodecSample* sample @@ -239,7 +227,7 @@ int SrsAvcAacCodec::audio_aac_demux(char* data, int size, SrsCodecSample* sample
239 227
240 // Raw AAC frame data in UI8 [] 228 // Raw AAC frame data in UI8 []
241 // 6.3 Raw Data, aac-iso-13818-7.pdf, page 28 229 // 6.3 Raw Data, aac-iso-13818-7.pdf, page 28
242 - if ((ret = sample->add_sample(stream->data() + stream->pos(), stream->size() - stream->pos())) != ERROR_SUCCESS) { 230 + if ((ret = sample->add_sample_unit(stream->data() + stream->pos(), stream->size() - stream->pos())) != ERROR_SUCCESS) {
243 srs_error("hls add audio sample failed. ret=%d", ret); 231 srs_error("hls add audio sample failed. ret=%d", ret);
244 return ret; 232 return ret;
245 } 233 }
@@ -445,7 +433,7 @@ int SrsAvcAacCodec::video_avc_demux(char* data, int size, SrsCodecSample* sample @@ -445,7 +433,7 @@ int SrsAvcAacCodec::video_avc_demux(char* data, int size, SrsCodecSample* sample
445 return ret; 433 return ret;
446 } 434 }
447 // 7.3.1 NAL unit syntax, H.264-AVC-ISO_IEC_14496-10.pdf, page 44. 435 // 7.3.1 NAL unit syntax, H.264-AVC-ISO_IEC_14496-10.pdf, page 44.
448 - if ((ret = sample->add_sample(stream->data() + stream->pos(), NALUnitLength)) != ERROR_SUCCESS) { 436 + if ((ret = sample->add_sample_unit(stream->data() + stream->pos(), NALUnitLength)) != ERROR_SUCCESS) {
449 srs_error("hls add video sample failed. ret=%d", ret); 437 srs_error("hls add video sample failed. ret=%d", ret);
450 return ret; 438 return ret;
451 } 439 }
@@ -89,30 +89,38 @@ enum SrsCodecAudioSoundType @@ -89,30 +89,38 @@ enum SrsCodecAudioSoundType
89 }; 89 };
90 90
91 /** 91 /**
92 -* buffer indicates the position and size. 92 +* the codec sample unit.
  93 +* for h.264 video packet, a NALU is a sample unit.
  94 +* for aac raw audio packet, a NALU is the entire aac raw data.
  95 +* for sequence header, it's not a sample unit.
93 */ 96 */
94 -class SrsCodecBuffer 97 +class SrsCodecSampleUnit
95 { 98 {
96 public: 99 public:
97 /** 100 /**
98 - * @remark user must manage the bytes. 101 + * the sample bytes is directly ptr to packet bytes,
  102 + * user should never use it when packet destroyed.
99 */ 103 */
100 int size; 104 int size;
101 char* bytes; 105 char* bytes;
102 public: 106 public:
103 - SrsCodecBuffer();  
104 - void append(void* data, int len);  
105 -public:  
106 - /**  
107 - * free the bytes,  
108 - * user can invoke it to free the bytes,  
109 - * the SrsCodecBuffer never free automatically.  
110 - */  
111 - void free(); 107 + SrsCodecSampleUnit();
  108 + virtual ~SrsCodecSampleUnit();
112 }; 109 };
113 110
114 /** 111 /**
115 * the samples in the flv audio/video packet. 112 * the samples in the flv audio/video packet.
  113 +* the sample used to analysis a video/audio packet,
  114 +* split the h.264 NALUs to buffers, or aac raw data to a buffer,
  115 +* and decode the video/audio specified infos.
  116 +*
  117 +* the sample unit:
  118 +* a video packet codec in h.264 contains many NALUs, each is a sample unit.
  119 +* a audio packet codec in aac is a sample unit.
  120 +* @remark, the video/audio sequence header is not sample unit,
  121 +* all sequence header stores as extra data,
  122 +* @see SrsAvcAacCodec.avc_extra_data and SrsAvcAacCodec.aac_extra_data
  123 +* @remark, user must clear all samples before decode a new video/audio packet.
116 */ 124 */
117 class SrsCodecSample 125 class SrsCodecSample
118 { 126 {
@@ -123,12 +131,14 @@ public: @@ -123,12 +131,14 @@ public:
123 * generally, aac audio packet corresponding to one buffer, 131 * generally, aac audio packet corresponding to one buffer,
124 * where avc/h264 video packet may contains multiple buffer. 132 * where avc/h264 video packet may contains multiple buffer.
125 */ 133 */
126 - int nb_buffers;  
127 - SrsCodecBuffer buffers[SRS_MAX_CODEC_SAMPLE]; 134 + int nb_sample_units;
  135 + SrsCodecSampleUnit sample_units[SRS_MAX_CODEC_SAMPLE];
128 public: 136 public:
129 bool is_video; 137 bool is_video;
130 - // CompositionTime, video_file_format_spec_v10_1.pdf, page 78.  
131 - // cts = pts - dts, where dts = flvheader->timestamp. 138 + /**
  139 + * CompositionTime, video_file_format_spec_v10_1.pdf, page 78.
  140 + * cts = pts - dts, where dts = flvheader->timestamp.
  141 + */
132 int32_t cts; 142 int32_t cts;
133 public: 143 public:
134 // video specified 144 // video specified
@@ -143,13 +153,37 @@ public: @@ -143,13 +153,37 @@ public:
143 public: 153 public:
144 SrsCodecSample(); 154 SrsCodecSample();
145 virtual ~SrsCodecSample(); 155 virtual ~SrsCodecSample();
  156 +public:
  157 + /**
  158 + * clear all samples.
  159 + * the sample units never copy the bytes, it directly use the ptr,
  160 + * so when video/audio packet is destroyed, the sample must be clear.
  161 + * in a word, user must clear sample before demux it.
  162 + * @remark demux sample use SrsAvcAacCodec.audio_aac_demux or video_avc_demux.
  163 + */
146 void clear(); 164 void clear();
147 - int add_sample(char* bytes, int size); 165 + /**
  166 + * add the a sample unit, it's a h.264 NALU or aac raw data.
  167 + * the sample unit directly use the ptr of packet bytes,
  168 + * so user must never use sample unit when packet is destroyed.
  169 + * in a word, user must clear sample before demux it.
  170 + */
  171 + int add_sample_unit(char* bytes, int size);
148 }; 172 };
149 173
150 /** 174 /**
151 * the h264/avc and aac codec, for media stream. 175 * the h264/avc and aac codec, for media stream.
152 -* to decode the stream of avc/aac for hls. 176 +*
  177 +* to demux the FLV/RTMP video/audio packet to sample,
  178 +* add each NALUs of h.264 as a sample unit to sample,
  179 +* while the entire aac raw data as a sample unit.
  180 +*
  181 +* for sequence header,
  182 +* demux it and save it in the avc_extra_data and aac_extra_data,
  183 +*
  184 +* for the codec info, such as audio sample rate,
  185 +* decode from FLV/RTMP header, then use codec info in sequence
  186 +* header to override it.
153 */ 187 */
154 class SrsAvcAacCodec 188 class SrsAvcAacCodec
155 { 189 {
@@ -68,6 +68,7 @@ using namespace std; @@ -68,6 +68,7 @@ using namespace std;
68 #include <srs_kernel_utility.hpp> 68 #include <srs_kernel_utility.hpp>
69 #include <srs_app_avc_aac.hpp> 69 #include <srs_app_avc_aac.hpp>
70 #include <srs_kernel_file.hpp> 70 #include <srs_kernel_file.hpp>
  71 +#include <srs_kernel_buffer.hpp>
71 72
72 // max PES packets size to flush the video. 73 // max PES packets size to flush the video.
73 #define SRS_AUTO_HLS_AUDIO_CACHE_SIZE 1024 * 1024 74 #define SRS_AUTO_HLS_AUDIO_CACHE_SIZE 1024 * 1024
@@ -195,16 +196,16 @@ public: @@ -195,16 +196,16 @@ public:
195 196
196 return ret; 197 return ret;
197 } 198 }
198 - static int write_frame(SrsFileWriter* writer, SrsMpegtsFrame* frame, SrsCodecBuffer* buffer) 199 + static int write_frame(SrsFileWriter* writer, SrsMpegtsFrame* frame, SrsBuffer* buffer)
199 { 200 {
200 int ret = ERROR_SUCCESS; 201 int ret = ERROR_SUCCESS;
201 202
202 - if (!buffer->bytes || buffer->size <= 0) { 203 + if (!buffer->bytes() || buffer->length() <= 0) {
203 return ret; 204 return ret;
204 } 205 }
205 206
206 - char* last = buffer->bytes + buffer->size;  
207 - char* pos = buffer->bytes; 207 + char* last = buffer->bytes() + buffer->length();
  208 + char* pos = buffer->bytes();
208 209
209 bool first = true; 210 bool first = true;
210 while (pos < last) { 211 while (pos < last) {
@@ -478,7 +479,7 @@ int SrsTSMuxer::open(string _path) @@ -478,7 +479,7 @@ int SrsTSMuxer::open(string _path)
478 return ret; 479 return ret;
479 } 480 }
480 481
481 -int SrsTSMuxer::write_audio(SrsMpegtsFrame* af, SrsCodecBuffer* ab) 482 +int SrsTSMuxer::write_audio(SrsMpegtsFrame* af, SrsBuffer* ab)
482 { 483 {
483 int ret = ERROR_SUCCESS; 484 int ret = ERROR_SUCCESS;
484 485
@@ -489,7 +490,7 @@ int SrsTSMuxer::write_audio(SrsMpegtsFrame* af, SrsCodecBuffer* ab) @@ -489,7 +490,7 @@ int SrsTSMuxer::write_audio(SrsMpegtsFrame* af, SrsCodecBuffer* ab)
489 return ret; 490 return ret;
490 } 491 }
491 492
492 -int SrsTSMuxer::write_video(SrsMpegtsFrame* vf, SrsCodecBuffer* vb) 493 +int SrsTSMuxer::write_video(SrsMpegtsFrame* vf, SrsBuffer* vb)
493 { 494 {
494 int ret = ERROR_SUCCESS; 495 int ret = ERROR_SUCCESS;
495 496
@@ -651,7 +652,7 @@ bool SrsHlsMuxer::is_segment_overflow() @@ -651,7 +652,7 @@ bool SrsHlsMuxer::is_segment_overflow()
651 return current->duration >= hls_fragment; 652 return current->duration >= hls_fragment;
652 } 653 }
653 654
654 -int SrsHlsMuxer::flush_audio(SrsMpegtsFrame* af, SrsCodecBuffer* ab) 655 +int SrsHlsMuxer::flush_audio(SrsMpegtsFrame* af, SrsBuffer* ab)
655 { 656 {
656 int ret = ERROR_SUCCESS; 657 int ret = ERROR_SUCCESS;
657 658
@@ -661,7 +662,7 @@ int SrsHlsMuxer::flush_audio(SrsMpegtsFrame* af, SrsCodecBuffer* ab) @@ -661,7 +662,7 @@ int SrsHlsMuxer::flush_audio(SrsMpegtsFrame* af, SrsCodecBuffer* ab)
661 return ret; 662 return ret;
662 } 663 }
663 664
664 - if (ab->size <= 0) { 665 + if (ab->length() <= 0) {
665 return ret; 666 return ret;
666 } 667 }
667 668
@@ -673,13 +674,12 @@ int SrsHlsMuxer::flush_audio(SrsMpegtsFrame* af, SrsCodecBuffer* ab) @@ -673,13 +674,12 @@ int SrsHlsMuxer::flush_audio(SrsMpegtsFrame* af, SrsCodecBuffer* ab)
673 } 674 }
674 675
675 // write success, clear and free the buffer 676 // write success, clear and free the buffer
676 - ab->free(); 677 + ab->erase(ab->length());
677 678
678 return ret; 679 return ret;
679 } 680 }
680 681
681 -int SrsHlsMuxer::flush_video(  
682 - SrsMpegtsFrame* af, SrsCodecBuffer* ab, SrsMpegtsFrame* vf, SrsCodecBuffer* vb) 682 +int SrsHlsMuxer::flush_video(SrsMpegtsFrame* af, SrsBuffer* ab, SrsMpegtsFrame* vf, SrsBuffer* vb)
683 { 683 {
684 int ret = ERROR_SUCCESS; 684 int ret = ERROR_SUCCESS;
685 685
@@ -699,7 +699,7 @@ int SrsHlsMuxer::flush_video( @@ -699,7 +699,7 @@ int SrsHlsMuxer::flush_video(
699 } 699 }
700 700
701 // write success, clear and free the buffer 701 // write success, clear and free the buffer
702 - vb->free(); 702 + vb->erase(vb->length());
703 703
704 return ret; 704 return ret;
705 } 705 }
@@ -962,8 +962,8 @@ SrsHlsCache::SrsHlsCache() @@ -962,8 +962,8 @@ SrsHlsCache::SrsHlsCache()
962 { 962 {
963 aac_jitter = new SrsHlsAacJitter(); 963 aac_jitter = new SrsHlsAacJitter();
964 964
965 - ab = new SrsCodecBuffer();  
966 - vb = new SrsCodecBuffer(); 965 + ab = new SrsBuffer();
  966 + vb = new SrsBuffer();
967 967
968 af = new SrsMpegtsFrame(); 968 af = new SrsMpegtsFrame();
969 vf = new SrsMpegtsFrame(); 969 vf = new SrsMpegtsFrame();
@@ -975,8 +975,8 @@ SrsHlsCache::~SrsHlsCache() @@ -975,8 +975,8 @@ SrsHlsCache::~SrsHlsCache()
975 { 975 {
976 srs_freep(aac_jitter); 976 srs_freep(aac_jitter);
977 977
978 - ab->free();  
979 - vb->free(); 978 + ab->erase(ab->length());
  979 + vb->erase(vb->length());
980 980
981 srs_freep(ab); 981 srs_freep(ab);
982 srs_freep(vb); 982 srs_freep(vb);
@@ -1051,7 +1051,7 @@ int SrsHlsCache::write_audio(SrsAvcAacCodec* codec, SrsHlsMuxer* muxer, int64_t @@ -1051,7 +1051,7 @@ int SrsHlsCache::write_audio(SrsAvcAacCodec* codec, SrsHlsMuxer* muxer, int64_t
1051 int ret = ERROR_SUCCESS; 1051 int ret = ERROR_SUCCESS;
1052 1052
1053 // start buffer, set the af 1053 // start buffer, set the af
1054 - if (ab->size == 0) { 1054 + if (ab->length() == 0) {
1055 pts = aac_jitter->on_buffer_start(pts, sample->sound_rate, codec->aac_sample_rate); 1055 pts = aac_jitter->on_buffer_start(pts, sample->sound_rate, codec->aac_sample_rate);
1056 1056
1057 af->dts = af->pts = audio_buffer_start_pts = pts; 1057 af->dts = af->pts = audio_buffer_start_pts = pts;
@@ -1067,7 +1067,7 @@ int SrsHlsCache::write_audio(SrsAvcAacCodec* codec, SrsHlsMuxer* muxer, int64_t @@ -1067,7 +1067,7 @@ int SrsHlsCache::write_audio(SrsAvcAacCodec* codec, SrsHlsMuxer* muxer, int64_t
1067 } 1067 }
1068 1068
1069 // flush if buffer exceed max size. 1069 // flush if buffer exceed max size.
1070 - if (ab->size > SRS_AUTO_HLS_AUDIO_CACHE_SIZE) { 1070 + if (ab->length() > SRS_AUTO_HLS_AUDIO_CACHE_SIZE) {
1071 if ((ret = muxer->flush_audio(af, ab)) != ERROR_SUCCESS) { 1071 if ((ret = muxer->flush_audio(af, ab)) != ERROR_SUCCESS) {
1072 return ret; 1072 return ret;
1073 } 1073 }
@@ -1159,11 +1159,11 @@ int SrsHlsCache::cache_audio(SrsAvcAacCodec* codec, SrsCodecSample* sample) @@ -1159,11 +1159,11 @@ int SrsHlsCache::cache_audio(SrsAvcAacCodec* codec, SrsCodecSample* sample)
1159 { 1159 {
1160 int ret = ERROR_SUCCESS; 1160 int ret = ERROR_SUCCESS;
1161 1161
1162 - for (int i = 0; i < sample->nb_buffers; i++) {  
1163 - SrsCodecBuffer* buf = &sample->buffers[i];  
1164 - int32_t size = buf->size; 1162 + for (int i = 0; i < sample->nb_sample_units; i++) {
  1163 + SrsCodecSampleUnit* sample_unit = &sample->sample_units[i];
  1164 + int32_t size = sample_unit->size;
1165 1165
1166 - if (!buf->bytes || size <= 0 || size > 0x1fff) { 1166 + if (!sample_unit->bytes || size <= 0 || size > 0x1fff) {
1167 ret = ERROR_HLS_AAC_FRAME_LENGTH; 1167 ret = ERROR_HLS_AAC_FRAME_LENGTH;
1168 srs_error("invalid aac frame length=%d, ret=%d", size, ret); 1168 srs_error("invalid aac frame length=%d, ret=%d", size, ret);
1169 return ret; 1169 return ret;
@@ -1215,8 +1215,8 @@ int SrsHlsCache::cache_audio(SrsAvcAacCodec* codec, SrsCodecSample* sample) @@ -1215,8 +1215,8 @@ int SrsHlsCache::cache_audio(SrsAvcAacCodec* codec, SrsCodecSample* sample)
1215 adts_header[5] |= 0x1f; 1215 adts_header[5] |= 0x1f;
1216 1216
1217 // copy to audio buffer 1217 // copy to audio buffer
1218 - ab->append(adts_header, sizeof(adts_header));  
1219 - ab->append(buf->bytes, buf->size); 1218 + ab->append((const char*)adts_header, sizeof(adts_header));
  1219 + ab->append(sample_unit->bytes, sample_unit->size);
1220 } 1220 }
1221 1221
1222 return ret; 1222 return ret;
@@ -1239,11 +1239,11 @@ int SrsHlsCache::cache_video(SrsAvcAacCodec* codec, SrsCodecSample* sample) @@ -1239,11 +1239,11 @@ int SrsHlsCache::cache_video(SrsAvcAacCodec* codec, SrsCodecSample* sample)
1239 * xxxxxxx // data bytes. 1239 * xxxxxxx // data bytes.
1240 * so, for each sample, we append header in aud_nal, then appends the bytes in sample. 1240 * so, for each sample, we append header in aud_nal, then appends the bytes in sample.
1241 */ 1241 */
1242 - for (int i = 0; i < sample->nb_buffers; i++) {  
1243 - SrsCodecBuffer* buf = &sample->buffers[i];  
1244 - int32_t size = buf->size; 1242 + for (int i = 0; i < sample->nb_sample_units; i++) {
  1243 + SrsCodecSampleUnit* sample_unit = &sample->sample_units[i];
  1244 + int32_t size = sample_unit->size;
1245 1245
1246 - if (!buf->bytes || size <= 0) { 1246 + if (!sample_unit->bytes || size <= 0) {
1247 ret = ERROR_HLS_AVC_SAMPLE_SIZE; 1247 ret = ERROR_HLS_AVC_SAMPLE_SIZE;
1248 srs_error("invalid avc sample length=%d, ret=%d", size, ret); 1248 srs_error("invalid avc sample length=%d, ret=%d", size, ret);
1249 return ret; 1249 return ret;
@@ -1259,7 +1259,7 @@ int SrsHlsCache::cache_video(SrsAvcAacCodec* codec, SrsCodecSample* sample) @@ -1259,7 +1259,7 @@ int SrsHlsCache::cache_video(SrsAvcAacCodec* codec, SrsCodecSample* sample)
1259 // 5bits, 7.3.1 NAL unit syntax, 1259 // 5bits, 7.3.1 NAL unit syntax,
1260 // H.264-AVC-ISO_IEC_14496-10.pdf, page 44. 1260 // H.264-AVC-ISO_IEC_14496-10.pdf, page 44.
1261 u_int8_t nal_unit_type; 1261 u_int8_t nal_unit_type;
1262 - nal_unit_type = *buf->bytes; 1262 + nal_unit_type = *sample_unit->bytes;
1263 nal_unit_type &= 0x1f; 1263 nal_unit_type &= 0x1f;
1264 1264
1265 // @see: ngx_rtmp_hls_video 1265 // @see: ngx_rtmp_hls_video
@@ -1277,7 +1277,7 @@ int SrsHlsCache::cache_video(SrsAvcAacCodec* codec, SrsCodecSample* sample) @@ -1277,7 +1277,7 @@ int SrsHlsCache::cache_video(SrsAvcAacCodec* codec, SrsCodecSample* sample)
1277 } 1277 }
1278 if (nal_unit_type == 1 || nal_unit_type == 5 || nal_unit_type == 6) { 1278 if (nal_unit_type == 1 || nal_unit_type == 5 || nal_unit_type == 6) {
1279 // for type 6, append a aud with type 9. 1279 // for type 6, append a aud with type 9.
1280 - vb->append(aud_nal, sizeof(aud_nal)); 1280 + vb->append((const char*)aud_nal, sizeof(aud_nal));
1281 aud_sent = true; 1281 aud_sent = true;
1282 } 1282 }
1283 } 1283 }
@@ -1290,13 +1290,13 @@ int SrsHlsCache::cache_video(SrsAvcAacCodec* codec, SrsCodecSample* sample) @@ -1290,13 +1290,13 @@ int SrsHlsCache::cache_video(SrsAvcAacCodec* codec, SrsCodecSample* sample)
1290 // @see: ngx_rtmp_hls_append_sps_pps 1290 // @see: ngx_rtmp_hls_append_sps_pps
1291 if (codec->sequenceParameterSetLength > 0) { 1291 if (codec->sequenceParameterSetLength > 0) {
1292 // AnnexB prefix, for sps always 4 bytes header 1292 // AnnexB prefix, for sps always 4 bytes header
1293 - vb->append(aud_nal, 4); 1293 + vb->append((const char*)aud_nal, 4);
1294 // sps 1294 // sps
1295 vb->append(codec->sequenceParameterSetNALUnit, codec->sequenceParameterSetLength); 1295 vb->append(codec->sequenceParameterSetNALUnit, codec->sequenceParameterSetLength);
1296 } 1296 }
1297 if (codec->pictureParameterSetLength > 0) { 1297 if (codec->pictureParameterSetLength > 0) {
1298 // AnnexB prefix, for pps always 4 bytes header 1298 // AnnexB prefix, for pps always 4 bytes header
1299 - vb->append(aud_nal, 4); 1299 + vb->append((const char*)aud_nal, 4);
1300 // pps 1300 // pps
1301 vb->append(codec->pictureParameterSetNALUnit, codec->pictureParameterSetLength); 1301 vb->append(codec->pictureParameterSetNALUnit, codec->pictureParameterSetLength);
1302 } 1302 }
@@ -1318,13 +1318,13 @@ int SrsHlsCache::cache_video(SrsAvcAacCodec* codec, SrsCodecSample* sample) @@ -1318,13 +1318,13 @@ int SrsHlsCache::cache_video(SrsAvcAacCodec* codec, SrsCodecSample* sample)
1318 u_int8_t* end = p + 3; 1318 u_int8_t* end = p + 3;
1319 1319
1320 // first AnnexB prefix is long (4 bytes) 1320 // first AnnexB prefix is long (4 bytes)
1321 - if (vb->size == 0) { 1321 + if (vb->length() == 0) {
1322 p = aud_nal; 1322 p = aud_nal;
1323 } 1323 }
1324 - vb->append(p, end - p); 1324 + vb->append((const char*)p, end - p);
1325 1325
1326 // sample data 1326 // sample data
1327 - vb->append(buf->bytes, buf->size); 1327 + vb->append(sample_unit->bytes, sample_unit->size);
1328 } 1328 }
1329 1329
1330 return ret; 1330 return ret;
@@ -50,9 +50,9 @@ extern int aac_sample_rates[]; @@ -50,9 +50,9 @@ extern int aac_sample_rates[];
50 #include <string> 50 #include <string>
51 #include <vector> 51 #include <vector>
52 52
  53 +class SrsBuffer;
53 class SrsSharedPtrMessage; 54 class SrsSharedPtrMessage;
54 class SrsCodecSample; 55 class SrsCodecSample;
55 -class SrsCodecBuffer;  
56 class SrsMpegtsFrame; 56 class SrsMpegtsFrame;
57 class SrsAmf0Object; 57 class SrsAmf0Object;
58 class SrsRtmpJitter; 58 class SrsRtmpJitter;
@@ -109,8 +109,8 @@ public: @@ -109,8 +109,8 @@ public:
109 virtual ~SrsTSMuxer(); 109 virtual ~SrsTSMuxer();
110 public: 110 public:
111 virtual int open(std::string _path); 111 virtual int open(std::string _path);
112 - virtual int write_audio(SrsMpegtsFrame* af, SrsCodecBuffer* ab);  
113 - virtual int write_video(SrsMpegtsFrame* vf, SrsCodecBuffer* vb); 112 + virtual int write_audio(SrsMpegtsFrame* af, SrsBuffer* ab);
  113 + virtual int write_video(SrsMpegtsFrame* vf, SrsBuffer* vb);
114 virtual void close(); 114 virtual void close();
115 }; 115 };
116 116
@@ -196,8 +196,8 @@ public: @@ -196,8 +196,8 @@ public:
196 * that is whether the current segment duration >= the segment in config 196 * that is whether the current segment duration >= the segment in config
197 */ 197 */
198 virtual bool is_segment_overflow(); 198 virtual bool is_segment_overflow();
199 - virtual int flush_audio(SrsMpegtsFrame* af, SrsCodecBuffer* ab);  
200 - virtual int flush_video(SrsMpegtsFrame* af, SrsCodecBuffer* ab, SrsMpegtsFrame* vf, SrsCodecBuffer* vb); 199 + virtual int flush_audio(SrsMpegtsFrame* af, SrsBuffer* ab);
  200 + virtual int flush_video(SrsMpegtsFrame* af, SrsBuffer* ab, SrsMpegtsFrame* vf, SrsBuffer* vb);
201 /** 201 /**
202 * close segment(ts). 202 * close segment(ts).
203 * @param log_desc the description for log. 203 * @param log_desc the description for log.
@@ -231,9 +231,9 @@ class SrsHlsCache @@ -231,9 +231,9 @@ class SrsHlsCache
231 private: 231 private:
232 // current frame and buffer 232 // current frame and buffer
233 SrsMpegtsFrame* af; 233 SrsMpegtsFrame* af;
234 - SrsCodecBuffer* ab; 234 + SrsBuffer* ab;
235 SrsMpegtsFrame* vf; 235 SrsMpegtsFrame* vf;
236 - SrsCodecBuffer* vb; 236 + SrsBuffer* vb;
237 private: 237 private:
238 // the audio cache buffer start pts, to flush audio if full. 238 // the audio cache buffer start pts, to flush audio if full.
239 int64_t audio_buffer_start_pts; 239 int64_t audio_buffer_start_pts;
@@ -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 "160" 34 +#define VERSION_REVISION "161"
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"