mirror of
https://github.com/ossrs/srs.git
synced 2025-03-09 15:49:59 +00:00
for #405, improve the HTT FLV to 3k. 2.0.169
This commit is contained in:
parent
b53e9814b3
commit
960341b9b2
8 changed files with 140 additions and 26 deletions
|
@ -30,6 +30,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|||
|
||||
#include <fcntl.h>
|
||||
#include <sstream>
|
||||
#include <sys/uio.h>
|
||||
using namespace std;
|
||||
|
||||
#include <srs_kernel_log.hpp>
|
||||
|
@ -145,6 +146,27 @@ int SrsFileWriter::write(void* buf, size_t count, ssize_t* pnwrite)
|
|||
return ret;
|
||||
}
|
||||
|
||||
int SrsFileWriter::writev(iovec* iov, int iovcnt, ssize_t* pnwrite)
|
||||
{
|
||||
int ret = ERROR_SUCCESS;
|
||||
|
||||
ssize_t nwrite = 0;
|
||||
for (int i = 0; i < iovcnt; i++) {
|
||||
iovec* piov = iov + i;
|
||||
ssize_t this_nwrite = 0;
|
||||
if ((ret = write(piov->iov_base, piov->iov_len, &this_nwrite)) != ERROR_SUCCESS) {
|
||||
return ret;
|
||||
}
|
||||
nwrite += this_nwrite;
|
||||
}
|
||||
|
||||
if (pnwrite) {
|
||||
*pnwrite = nwrite;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
SrsFileReader::SrsFileReader()
|
||||
{
|
||||
fd = -1;
|
||||
|
|
|
@ -31,6 +31,11 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|||
|
||||
#include <string>
|
||||
|
||||
// for srs-librtmp, @see https://github.com/simple-rtmp-server/srs/issues/213
|
||||
#ifndef _WIN32
|
||||
#include <sys/uio.h>
|
||||
#endif
|
||||
|
||||
/**
|
||||
* file writer, to write to file.
|
||||
*/
|
||||
|
@ -62,6 +67,11 @@ public:
|
|||
* @param pnwrite the output nb_write, NULL to ignore.
|
||||
*/
|
||||
virtual int write(void* buf, size_t count, ssize_t* pnwrite);
|
||||
/**
|
||||
* for the HTTP FLV, to writev to improve performance.
|
||||
* @see https://github.com/simple-rtmp-server/srs/issues/405
|
||||
*/
|
||||
virtual int writev(iovec* iov, int iovcnt, ssize_t* pnwrite);
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
|
@ -223,31 +223,24 @@ int SrsFlvEncoder::write_tag(char* header, int header_size, char* tag, int tag_s
|
|||
{
|
||||
int ret = ERROR_SUCCESS;
|
||||
|
||||
// write tag header.
|
||||
if ((ret = _fs->write(header, header_size, NULL)) != ERROR_SUCCESS) {
|
||||
if (!srs_is_client_gracefully_close(ret)) {
|
||||
srs_error("write flv tag header failed. ret=%d", ret);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
// write tag data.
|
||||
if ((ret = _fs->write(tag, tag_size, NULL)) != ERROR_SUCCESS) {
|
||||
if (!srs_is_client_gracefully_close(ret)) {
|
||||
srs_error("write flv tag failed. ret=%d", ret);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
// PreviousTagSizeN UI32 Size of last tag, including its header, in bytes.
|
||||
char pre_size[SRS_FLV_PREVIOUS_TAG_SIZE];
|
||||
if ((ret = tag_stream->initialize(pre_size, SRS_FLV_PREVIOUS_TAG_SIZE)) != ERROR_SUCCESS) {
|
||||
return ret;
|
||||
}
|
||||
tag_stream->write_4bytes(tag_size + header_size);
|
||||
if ((ret = _fs->write(pre_size, sizeof(pre_size), NULL)) != ERROR_SUCCESS) {
|
||||
|
||||
iovec iovs[3];
|
||||
iovs[0].iov_base = header;
|
||||
iovs[0].iov_len = header_size;
|
||||
iovs[1].iov_base = tag;
|
||||
iovs[1].iov_len = tag_size;
|
||||
iovs[2].iov_base = pre_size;
|
||||
iovs[2].iov_len = sizeof(SRS_FLV_PREVIOUS_TAG_SIZE);
|
||||
|
||||
if ((ret = _fs->writev(iovs, 3, NULL)) != ERROR_SUCCESS) {
|
||||
if (!srs_is_client_gracefully_close(ret)) {
|
||||
srs_error("write flv previous tag size failed. ret=%d", ret);
|
||||
srs_error("write flv tag failed. ret=%d", ret);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue