mirror of
https://github.com/ossrs/srs.git
synced 2025-03-09 15:49:59 +00:00
parent
16d7b5d7d4
commit
e73d00250b
5 changed files with 44 additions and 44 deletions
|
@ -56,7 +56,7 @@ SrsVodStream::~SrsVodStream()
|
||||||
map_ctx_info_.clear();
|
map_ctx_info_.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
srs_error_t SrsVodStream::serve_flv_stream(ISrsHttpResponseWriter* w, ISrsHttpMessage* r, string fullpath, int offset)
|
srs_error_t SrsVodStream::serve_flv_stream(ISrsHttpResponseWriter* w, ISrsHttpMessage* r, string fullpath, int64_t offset)
|
||||||
{
|
{
|
||||||
srs_error_t err = srs_success;
|
srs_error_t err = srs_success;
|
||||||
|
|
||||||
|
@ -69,7 +69,7 @@ srs_error_t SrsVodStream::serve_flv_stream(ISrsHttpResponseWriter* w, ISrsHttpMe
|
||||||
}
|
}
|
||||||
|
|
||||||
if (offset > fs->filesize()) {
|
if (offset > fs->filesize()) {
|
||||||
return srs_error_new(ERROR_HTTP_REMUX_OFFSET_OVERFLOW, "http flv streaming %s overflow. size=%" PRId64 ", offset=%d",
|
return srs_error_new(ERROR_HTTP_REMUX_OFFSET_OVERFLOW, "http flv streaming %s overflow. size=%" PRId64 ", offset=%" PRId64,
|
||||||
fullpath.c_str(), fs->filesize(), offset);
|
fullpath.c_str(), fs->filesize(), offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -112,7 +112,7 @@ srs_error_t SrsVodStream::serve_flv_stream(ISrsHttpResponseWriter* w, ISrsHttpMe
|
||||||
int64_t left = fs->filesize() - offset;
|
int64_t left = fs->filesize() - offset;
|
||||||
|
|
||||||
// write http header for ts.
|
// write http header for ts.
|
||||||
w->header()->set_content_length((int)(sizeof(flv_header) + sh_size + left));
|
w->header()->set_content_length(sizeof(flv_header) + sh_size + left);
|
||||||
w->header()->set_content_type("video/x-flv");
|
w->header()->set_content_type("video/x-flv");
|
||||||
w->write_header(SRS_CONSTS_HTTP_OK);
|
w->write_header(SRS_CONSTS_HTTP_OK);
|
||||||
|
|
||||||
|
@ -130,14 +130,14 @@ srs_error_t SrsVodStream::serve_flv_stream(ISrsHttpResponseWriter* w, ISrsHttpMe
|
||||||
}
|
}
|
||||||
|
|
||||||
// send data
|
// send data
|
||||||
if ((err = copy(w, fs, r, (int)left)) != srs_success) {
|
if ((err = copy(w, fs, r, left)) != srs_success) {
|
||||||
return srs_error_wrap(err, "read flv=%s size=%d", fullpath.c_str(), (int)left);
|
return srs_error_wrap(err, "read flv=%s size=%" PRId64, fullpath.c_str(), left);
|
||||||
}
|
}
|
||||||
|
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
srs_error_t SrsVodStream::serve_mp4_stream(ISrsHttpResponseWriter* w, ISrsHttpMessage* r, string fullpath, int start, int end)
|
srs_error_t SrsVodStream::serve_mp4_stream(ISrsHttpResponseWriter* w, ISrsHttpMessage* r, string fullpath, int64_t start, int64_t end)
|
||||||
{
|
{
|
||||||
srs_error_t err = srs_success;
|
srs_error_t err = srs_success;
|
||||||
|
|
||||||
|
@ -154,7 +154,7 @@ srs_error_t SrsVodStream::serve_mp4_stream(ISrsHttpResponseWriter* w, ISrsHttpMe
|
||||||
|
|
||||||
// parse -1 to whole file.
|
// parse -1 to whole file.
|
||||||
if (end == -1) {
|
if (end == -1) {
|
||||||
end = (int)(fs->filesize() - 1);
|
end = fs->filesize() - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (end > fs->filesize() || start > end || end < 0) {
|
if (end > fs->filesize() || start > end || end < 0) {
|
||||||
|
@ -180,8 +180,8 @@ srs_error_t SrsVodStream::serve_mp4_stream(ISrsHttpResponseWriter* w, ISrsHttpMe
|
||||||
fs->seek2(start);
|
fs->seek2(start);
|
||||||
|
|
||||||
// send data
|
// send data
|
||||||
if ((err = copy(w, fs, r, (int)left)) != srs_success) {
|
if ((err = copy(w, fs, r, left)) != srs_success) {
|
||||||
return srs_error_wrap(err, "read mp4=%s size=%d", fullpath.c_str(), (int)left);
|
return srs_error_wrap(err, "read mp4=%s size=%" PRId64, fullpath.c_str(), left);
|
||||||
}
|
}
|
||||||
|
|
||||||
return err;
|
return err;
|
||||||
|
|
|
@ -30,8 +30,8 @@ public:
|
||||||
SrsVodStream(std::string root_dir);
|
SrsVodStream(std::string root_dir);
|
||||||
virtual ~SrsVodStream();
|
virtual ~SrsVodStream();
|
||||||
protected:
|
protected:
|
||||||
virtual srs_error_t serve_flv_stream(ISrsHttpResponseWriter* w, ISrsHttpMessage* r, std::string fullpath, int offset);
|
virtual srs_error_t serve_flv_stream(ISrsHttpResponseWriter* w, ISrsHttpMessage* r, std::string fullpath, int64_t offset);
|
||||||
virtual srs_error_t serve_mp4_stream(ISrsHttpResponseWriter* w, ISrsHttpMessage* r, std::string fullpath, int start, int end);
|
virtual srs_error_t serve_mp4_stream(ISrsHttpResponseWriter* w, ISrsHttpMessage* r, std::string fullpath, int64_t start, int64_t end);
|
||||||
virtual srs_error_t serve_m3u8_ctx(ISrsHttpResponseWriter* w, ISrsHttpMessage* r, std::string fullpath);
|
virtual srs_error_t serve_m3u8_ctx(ISrsHttpResponseWriter* w, ISrsHttpMessage* r, std::string fullpath);
|
||||||
private:
|
private:
|
||||||
virtual bool ctx_is_exist(std::string ctx);
|
virtual bool ctx_is_exist(std::string ctx);
|
||||||
|
|
|
@ -456,8 +456,8 @@ srs_error_t SrsHttpFileServer::serve_file(ISrsHttpResponseWriter* w, ISrsHttpMes
|
||||||
|
|
||||||
// write body.
|
// write body.
|
||||||
int64_t left = length;
|
int64_t left = length;
|
||||||
if ((err = copy(w, fs, r, (int)left)) != srs_success) {
|
if ((err = copy(w, fs, r, left)) != srs_success) {
|
||||||
return srs_error_wrap(err, "copy file=%s size=%d", fullpath.c_str(), (int)left);
|
return srs_error_wrap(err, "copy file=%s size=%" PRId64, fullpath.c_str(), left);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((err = w->final_request()) != srs_success) {
|
if ((err = w->final_request()) != srs_success) {
|
||||||
|
@ -474,7 +474,7 @@ srs_error_t SrsHttpFileServer::serve_flv_file(ISrsHttpResponseWriter* w, ISrsHtt
|
||||||
return serve_file(w, r, fullpath);
|
return serve_file(w, r, fullpath);
|
||||||
}
|
}
|
||||||
|
|
||||||
int offset = ::atoi(start.c_str());
|
int64_t offset = ::atoll(start.c_str());
|
||||||
if (offset <= 0) {
|
if (offset <= 0) {
|
||||||
return serve_file(w, r, fullpath);
|
return serve_file(w, r, fullpath);
|
||||||
}
|
}
|
||||||
|
@ -507,15 +507,15 @@ srs_error_t SrsHttpFileServer::serve_mp4_file(ISrsHttpResponseWriter* w, ISrsHtt
|
||||||
}
|
}
|
||||||
|
|
||||||
// parse the start in query string
|
// parse the start in query string
|
||||||
int start = 0;
|
int64_t start = 0;
|
||||||
if (pos > 0) {
|
if (pos > 0) {
|
||||||
start = ::atoi(range.substr(0, pos).c_str());
|
start = ::atoll(range.substr(0, pos).c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
// parse end in query string.
|
// parse end in query string.
|
||||||
int end = -1;
|
int64_t end = -1;
|
||||||
if (pos < range.length() - 1) {
|
if (pos < range.length() - 1) {
|
||||||
end = ::atoi(range.substr(pos + 1).c_str());
|
end = ::atoll(range.substr(pos + 1).c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
// invalid param, serve as whole mp4 file.
|
// invalid param, serve as whole mp4 file.
|
||||||
|
@ -531,14 +531,14 @@ srs_error_t SrsHttpFileServer::serve_m3u8_file(ISrsHttpResponseWriter * w, ISrsH
|
||||||
return serve_m3u8_ctx(w, r, fullpath);
|
return serve_m3u8_ctx(w, r, fullpath);
|
||||||
}
|
}
|
||||||
|
|
||||||
srs_error_t SrsHttpFileServer::serve_flv_stream(ISrsHttpResponseWriter* w, ISrsHttpMessage* r, string fullpath, int offset)
|
srs_error_t SrsHttpFileServer::serve_flv_stream(ISrsHttpResponseWriter* w, ISrsHttpMessage* r, string fullpath, int64_t offset)
|
||||||
{
|
{
|
||||||
// @remark For common http file server, we don't support stream request, please use SrsVodStream instead.
|
// @remark For common http file server, we don't support stream request, please use SrsVodStream instead.
|
||||||
// TODO: FIXME: Support range in header https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Range_requests
|
// TODO: FIXME: Support range in header https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Range_requests
|
||||||
return serve_file(w, r, fullpath);
|
return serve_file(w, r, fullpath);
|
||||||
}
|
}
|
||||||
|
|
||||||
srs_error_t SrsHttpFileServer::serve_mp4_stream(ISrsHttpResponseWriter* w, ISrsHttpMessage* r, string fullpath, int start, int end)
|
srs_error_t SrsHttpFileServer::serve_mp4_stream(ISrsHttpResponseWriter* w, ISrsHttpMessage* r, string fullpath, int64_t start, int64_t end)
|
||||||
{
|
{
|
||||||
// @remark For common http file server, we don't support stream request, please use SrsVodStream instead.
|
// @remark For common http file server, we don't support stream request, please use SrsVodStream instead.
|
||||||
// TODO: FIXME: Support range in header https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Range_requests
|
// TODO: FIXME: Support range in header https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Range_requests
|
||||||
|
@ -552,11 +552,11 @@ srs_error_t SrsHttpFileServer::serve_m3u8_ctx(ISrsHttpResponseWriter * w, ISrsHt
|
||||||
return serve_file(w, r, fullpath);
|
return serve_file(w, r, fullpath);
|
||||||
}
|
}
|
||||||
|
|
||||||
srs_error_t SrsHttpFileServer::copy(ISrsHttpResponseWriter* w, SrsFileReader* fs, ISrsHttpMessage* r, int size)
|
srs_error_t SrsHttpFileServer::copy(ISrsHttpResponseWriter* w, SrsFileReader* fs, ISrsHttpMessage* r, int64_t size)
|
||||||
{
|
{
|
||||||
srs_error_t err = srs_success;
|
srs_error_t err = srs_success;
|
||||||
|
|
||||||
int left = size;
|
int64_t left = size;
|
||||||
char* buf = new char[SRS_HTTP_TS_SEND_BUFFER_SIZE];
|
char* buf = new char[SRS_HTTP_TS_SEND_BUFFER_SIZE];
|
||||||
SrsAutoFreeA(char, buf);
|
SrsAutoFreeA(char, buf);
|
||||||
|
|
||||||
|
@ -564,12 +564,12 @@ srs_error_t SrsHttpFileServer::copy(ISrsHttpResponseWriter* w, SrsFileReader* fs
|
||||||
ssize_t nread = -1;
|
ssize_t nread = -1;
|
||||||
int max_read = srs_min(left, SRS_HTTP_TS_SEND_BUFFER_SIZE);
|
int max_read = srs_min(left, SRS_HTTP_TS_SEND_BUFFER_SIZE);
|
||||||
if ((err = fs->read(buf, max_read, &nread)) != srs_success) {
|
if ((err = fs->read(buf, max_read, &nread)) != srs_success) {
|
||||||
return srs_error_wrap(err, "read limit=%d, left=%d", max_read, left);
|
return srs_error_wrap(err, "read limit=%d, left=%" PRId64, max_read, left);
|
||||||
}
|
}
|
||||||
|
|
||||||
left -= nread;
|
left -= nread;
|
||||||
if ((err = w->write(buf, (int)nread)) != srs_success) {
|
if ((err = w->write(buf, (int)nread)) != srs_success) {
|
||||||
return srs_error_wrap(err, "write limit=%d, bytes=%d, left=%d", max_read, (int)nread, left);
|
return srs_error_wrap(err, "write limit=%d, bytes=%d, left=%" PRId64, max_read, (int)nread, left);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -288,12 +288,12 @@ private:
|
||||||
virtual srs_error_t serve_m3u8_file(ISrsHttpResponseWriter* w, ISrsHttpMessage* r, std::string fullpath);
|
virtual srs_error_t serve_m3u8_file(ISrsHttpResponseWriter* w, ISrsHttpMessage* r, std::string fullpath);
|
||||||
protected:
|
protected:
|
||||||
// When access flv file with x.flv?start=xxx
|
// When access flv file with x.flv?start=xxx
|
||||||
virtual srs_error_t serve_flv_stream(ISrsHttpResponseWriter* w, ISrsHttpMessage* r, std::string fullpath, int offset);
|
virtual srs_error_t serve_flv_stream(ISrsHttpResponseWriter* w, ISrsHttpMessage* r, std::string fullpath, int64_t offset);
|
||||||
// When access mp4 file with x.mp4?range=start-end
|
// When access mp4 file with x.mp4?range=start-end
|
||||||
// @param start the start offset in bytes.
|
// @param start the start offset in bytes.
|
||||||
// @param end the end offset in bytes. -1 to end of file.
|
// @param end the end offset in bytes. -1 to end of file.
|
||||||
// @remark response data in [start, end].
|
// @remark response data in [start, end].
|
||||||
virtual srs_error_t serve_mp4_stream(ISrsHttpResponseWriter* w, ISrsHttpMessage* r, std::string fullpath, int start, int end);
|
virtual srs_error_t serve_mp4_stream(ISrsHttpResponseWriter* w, ISrsHttpMessage* r, std::string fullpath, int64_t start, int64_t end);
|
||||||
// For HLS protocol.
|
// For HLS protocol.
|
||||||
// When the request url, like as "http://127.0.0.1:8080/live/livestream.m3u8",
|
// When the request url, like as "http://127.0.0.1:8080/live/livestream.m3u8",
|
||||||
// returns the response like as "http://127.0.0.1:8080/live/livestream.m3u8?hls_ctx=12345678" .
|
// returns the response like as "http://127.0.0.1:8080/live/livestream.m3u8?hls_ctx=12345678" .
|
||||||
|
@ -306,7 +306,7 @@ protected:
|
||||||
virtual srs_error_t serve_m3u8_ctx(ISrsHttpResponseWriter* w, ISrsHttpMessage* r, std::string fullpath);
|
virtual srs_error_t serve_m3u8_ctx(ISrsHttpResponseWriter* w, ISrsHttpMessage* r, std::string fullpath);
|
||||||
protected:
|
protected:
|
||||||
// Copy the fs to response writer in size bytes.
|
// Copy the fs to response writer in size bytes.
|
||||||
virtual srs_error_t copy(ISrsHttpResponseWriter* w, SrsFileReader* fs, ISrsHttpMessage* r, int size);
|
virtual srs_error_t copy(ISrsHttpResponseWriter* w, SrsFileReader* fs, ISrsHttpMessage* r, int64_t size);
|
||||||
};
|
};
|
||||||
|
|
||||||
// The mux entry for server mux.
|
// The mux entry for server mux.
|
||||||
|
|
|
@ -755,7 +755,7 @@ srs_error_t SrsHttpResponseWriter::write(char* data, int size)
|
||||||
// check the bytes send and content length.
|
// check the bytes send and content length.
|
||||||
written += size;
|
written += size;
|
||||||
if (content_length != -1 && written > content_length) {
|
if (content_length != -1 && written > content_length) {
|
||||||
return srs_error_new(ERROR_HTTP_CONTENT_LENGTH, "overflow writen=%d, max=%d", (int)written, (int)content_length);
|
return srs_error_new(ERROR_HTTP_CONTENT_LENGTH, "overflow writen=%" PRId64 ", max=%" PRId64, written, content_length);
|
||||||
}
|
}
|
||||||
|
|
||||||
// ignore NULL content.
|
// ignore NULL content.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue