@@ -175,37 +175,52 @@ int SrsHttpResponseWriter::writev(iovec* iov, int iovcnt, ssize_t* pnwrite)
175175 }
176176
177177 // send in chunked encoding.
178- int nb_iovss = iovcnt * 4 ;
178+ int nb_iovss = 3 + iovcnt ;
179179 iovec* iovss = iovss_cache;
180180 if (nb_iovss_cache < nb_iovss) {
181181 srs_freep (iovss_cache);
182182 nb_iovss_cache = nb_iovss;
183183 iovss = iovss_cache = new iovec[nb_iovss];
184184 }
185185
186- char * pheader_cache = header_cache;
186+ // send in chunked encoding.
187+
188+ // chunk size.
189+ int size = 0 ;
187190 for (int i = 0 ; i < iovcnt; i++) {
188- int left = SRS_HTTP_HEADER_CACHE_SIZE - (int )(pheader_cache - header_cache);
189- srs_assert (left > 0 );
190-
191191 iovec* data_iov = iov + i;
192- int nb_size = snprintf (pheader_cache, left, " %x" , (int )data_iov->iov_len );
193-
194- iovec* iovs = iovss + (i * 4 );
195- iovs[0 ].iov_base = (char *)pheader_cache;
196- iovs[0 ].iov_len = (int )nb_size;
197- iovs[1 ].iov_base = (char *)SRS_HTTP_CRLF;
198- iovs[1 ].iov_len = 2 ;
199- iovs[2 ].iov_base = (char *)data_iov->iov_base ;
200- iovs[2 ].iov_len = (int )data_iov->iov_len ;
201- iovs[3 ].iov_base = (char *)SRS_HTTP_CRLF;
202- iovs[3 ].iov_len = 2 ;
203-
204- pheader_cache += nb_size;
192+ size += data_iov->iov_len ;
193+ }
194+ written += size;
195+
196+ // chunk header
197+ int nb_size = snprintf (header_cache, SRS_HTTP_HEADER_CACHE_SIZE, " %x" , size);
198+ iovec* iovs = iovss;
199+ iovs[0 ].iov_base = (char *)header_cache;
200+ iovs[0 ].iov_len = (int )nb_size;
201+ iovs++;
202+
203+ // chunk header eof.
204+ iovs[0 ].iov_base = (char *)SRS_HTTP_CRLF;
205+ iovs[0 ].iov_len = 2 ;
206+ iovs++;
207+
208+ // chunk body.
209+ for (int i = 0 ; i < iovcnt; i++) {
210+ iovec* data_iov = iov + i;
211+ iovs[0 ].iov_base = (char *)data_iov->iov_base ;
212+ iovs[0 ].iov_len = (int )data_iov->iov_len ;
213+ iovs++;
205214 }
206215
216+ // chunk body eof.
217+ iovs[0 ].iov_base = (char *)SRS_HTTP_CRLF;
218+ iovs[0 ].iov_len = 2 ;
219+ iovs++;
220+
221+ // sendout all ioves.
207222 ssize_t nwrite;
208- if ((ret = skt-> writev ( iovss, nb_iovss, &nwrite)) != ERROR_SUCCESS) {
223+ if ((ret = srs_write_large_iovs (skt, iovss, nb_iovss, &nwrite)) != ERROR_SUCCESS) {
209224 return ret;
210225 }
211226
@@ -1442,6 +1457,21 @@ int SrsFlvStreamEncoder::dump_cache(SrsConsumer* /*consumer*/)
14421457 return ERROR_SUCCESS;
14431458}
14441459
1460+ #ifdef SRS_PERF_FAST_FLV_ENCODER
1461+ SrsFastFlvStreamEncoder::SrsFastFlvStreamEncoder ()
1462+ {
1463+ }
1464+
1465+ SrsFastFlvStreamEncoder::~SrsFastFlvStreamEncoder ()
1466+ {
1467+ }
1468+
1469+ int SrsFastFlvStreamEncoder::write_tags (SrsSharedPtrMessage** msgs, int count)
1470+ {
1471+ return enc->write_tags (msgs, count);
1472+ }
1473+ #endif
1474+
14451475SrsAacStreamEncoder::SrsAacStreamEncoder ()
14461476{
14471477 enc = new SrsAacEncoder ();
@@ -1612,7 +1642,11 @@ int SrsLiveStream::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r)
16121642 srs_assert (entry);
16131643 if (srs_string_ends_with (entry->pattern , " .flv" )) {
16141644 w->header ()->set_content_type (" video/x-flv" );
1645+ #ifdef SRS_PERF_FAST_FLV_ENCODER
1646+ enc = new SrsFastFlvStreamEncoder ();
1647+ #else
16151648 enc = new SrsFlvStreamEncoder ();
1649+ #endif
16161650 } else if (srs_string_ends_with (entry->pattern , " .aac" )) {
16171651 w->header ()->set_content_type (" audio/x-aac" );
16181652 enc = new SrsAacStreamEncoder ();
@@ -1658,6 +1692,10 @@ int SrsLiveStream::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r)
16581692 }
16591693 }
16601694
1695+ #ifdef SRS_PERF_FAST_FLV_ENCODER
1696+ SrsFastFlvStreamEncoder* ffe = dynamic_cast <SrsFastFlvStreamEncoder*>(enc);
1697+ #endif
1698+
16611699 while (true ) {
16621700 pprint->elapse ();
16631701
@@ -1684,7 +1722,15 @@ int SrsLiveStream::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r)
16841722 }
16851723
16861724 // sendout all messages.
1725+ #ifdef SRS_PERF_FAST_FLV_ENCODER
1726+ if (ffe) {
1727+ ret = ffe->write_tags (msgs.msgs , count);
1728+ } else {
1729+ ret = streaming_send_messages (enc, msgs.msgs , count);
1730+ }
1731+ #else
16871732 ret = streaming_send_messages (enc, msgs.msgs , count);
1733+ #endif
16881734
16891735 // free the messages.
16901736 for (int i = 0 ; i < count; i++) {
0 commit comments