Skip to content

Commit

Permalink
feat(data_source): support open with range
Browse files Browse the repository at this point in the history
Signed-off-by: pingkai <pingkai010@gmail.com>
  • Loading branch information
pingkai committed Feb 28, 2020
1 parent 525611c commit 428f79b
Show file tree
Hide file tree
Showing 6 changed files with 46 additions and 6 deletions.
7 changes: 7 additions & 0 deletions framework/data_source/IDataSource.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,13 @@ namespace Cicada {
return mOpts;
}

int IDataSource::setRange(int64_t start, int64_t end)
{
rangeStart = start;
rangeEnd = end;
return 0;
}

std::string IDataSource::SourceConfig::toString()
{
CicadaJSONItem item{};
Expand Down
10 changes: 8 additions & 2 deletions framework/data_source/IDataSource.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
#include <vector>
#include <atomic>

namespace Cicada{
namespace Cicada {

enum {
SEEK_SIZE = 0x10000,
Expand All @@ -28,7 +28,9 @@ namespace Cicada{
};

virtual NetWorkRetryStatus onNetWorkRetry(int error) = 0;
virtual void onNetWorkConnected(){

virtual void onNetWorkConnected()
{
}
};

Expand Down Expand Up @@ -59,6 +61,8 @@ namespace Cicada{

virtual ~IDataSource() = default;

virtual int setRange(int64_t start, int64_t end);

virtual int Open(int flags) = 0;

virtual int Open(const std::string &url);
Expand Down Expand Up @@ -90,6 +94,8 @@ namespace Cicada{
std::atomic_bool mInterrupt{false};
SourceConfig mConfig{};
std::string mUri{};
int64_t rangeStart{INT64_MIN};
int64_t rangeEnd{INT64_MIN};

};
}
Expand Down
19 changes: 17 additions & 2 deletions framework/data_source/curl/curl_data_source.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -186,7 +186,7 @@ int CurlDataSource::Open(int flags)
mPConnection->setInterrupt(&mInterrupt);
}

int ret = curl_connect(mPConnection, 0);
int ret = curl_connect(mPConnection, rangeStart != INT64_MIN ? rangeStart : 0);
mOpenTimeMS = af_gettime_relative() / 1000 - mOpenTimeMS;

if (ret >= 0) {
Expand All @@ -203,13 +203,20 @@ int CurlDataSource::Open(const string &url)
return Open(0);
}

if (mUri == url) {
if (rangeStart != INT64_MIN) {
Seek(rangeStart, SEEK_SET);
return 0;
}
}

mOpenTimeMS = af_gettime_relative() / 1000;
mPConnection->disconnect();
bool isRTMP = url.compare(0, 7, "rtmp://") == 0;
mLocation = (isRTMP ? (url + " live=1").c_str() : url.c_str());
// only change url, don,t change share and resolve
curl_easy_setopt(mPConnection->getCurlHandle(), CURLOPT_URL, mLocation.c_str());
int ret = curl_connect(mPConnection, 0);
int ret = curl_connect(mPConnection, rangeStart != INT64_MIN ? rangeStart : 0);
mOpenTimeMS = af_gettime_relative() / 1000 - mOpenTimeMS;

if (ret >= 0) {
Expand Down Expand Up @@ -360,6 +367,14 @@ int CurlDataSource::Read(void *buf, size_t size)
{
int ret = 0;

if (rangeEnd != INT64_MIN) {
size = std::min(size, (size_t) (rangeEnd - mPConnection->tell()));

if (size == 0) {
return 0;
}
}

/* only request 1 byte, for truncated reads (only if not eof) */
if ((mFileSize <= 0 || mPConnection->tell() < mFileSize) &&
(ret = mPConnection->FillBuffer(1)) < 0) {
Expand Down
12 changes: 12 additions & 0 deletions framework/data_source/ffmpeg_data_source.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,10 @@ namespace Cicada {
ret = FRAMEWORK_ERR_PROTOCOL_NOT_SUPPORT;
}

if (rangeStart != INT64_MIN) {
ffurl_seek(mPuc, (int64_t) rangeStart, SEEK_SET);
}

return ret;
}

Expand All @@ -65,6 +69,14 @@ namespace Cicada {

int ffmpegDataSource::Read(void *buf, size_t nbyte)
{
if (rangeEnd != INT64_MIN) {
nbyte = std::min(nbyte, (size_t) (rangeEnd - Seek(0, SEEK_CUR)));

if (nbyte == 0) {
return 0;
}
}

int ret = ffurl_read(mPuc, (unsigned char *) buf, nbyte);

if (ret == AVERROR_EOF) {
Expand Down
2 changes: 1 addition & 1 deletion framework/data_source/proxyDataSource.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ namespace Cicada {
int proxyDataSource::Open(const string &url)
{
if (mOpen) {
return mOpen(mUserArg, url.c_str());
return mOpen(mUserArg, url.c_str(), rangeStart, rangeEnd);
}

return -1;
Expand Down
2 changes: 1 addition & 1 deletion framework/data_source/proxyDataSource.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ typedef int (*readImpl)(void *arg, uint8_t *buffer, int size);

typedef int64_t (*seekImpl)(void *arg, int64_t offset, int whence);

typedef int (*openImpl)(void *arg, const char *url);
typedef int (*openImpl)(void *arg, const char *url,int64_t start, int64_t end);

typedef void (*interruptImpl)(void *arg, int inter);

Expand Down

0 comments on commit 428f79b

Please sign in to comment.