1
0
Fork 0
mirror of https://github.com/ossrs/srs.git synced 2025-03-09 15:49:59 +00:00

supprot LAS(live adaptive stream)

Change-Id: I2f9fd889fc924a3b080667bd2114f4632be461a0
This commit is contained in:
liulichuan 2020-05-11 00:50:14 +08:00 committed by winlin
parent 34e7db5a93
commit c1f98ddcc8
10 changed files with 843 additions and 10 deletions

View file

@ -178,6 +178,22 @@ bool SrsFlvVideo::acceptable(char* data, int size)
return true;
}
#ifdef SRS_LAS
int64_t SrsFlvVideo::cts(char *data, int size)
{
if (!h264(data, size) || size < 6) {
return -1;
} else {
int32_t cts = 0x00;
char* pp = (char*)&cts;
pp[2] = data[2];
pp[1] = data[3];
pp[0] = data[4];
return cts;
}
}
#endif
SrsFlvAudio::SrsFlvAudio()
{
}

View file

@ -268,6 +268,13 @@ public:
* @remark all type of audio is possible, no need to check audio.
*/
static bool acceptable(char* data, int size);
#ifdef SRS_LAS
/**
* get cts if is 264, if not 264 return 0
*/
static int64_t cts(char *data, int size);
#endif
};
/**

View file

@ -220,6 +220,11 @@ SrsSharedPtrMessage::SrsSharedPtrPayload::~SrsSharedPtrPayload()
SrsSharedPtrMessage::SrsSharedPtrMessage() : timestamp(0), stream_id(0), size(0), payload(NULL)
{
ptr = NULL;
#ifdef SRS_LAS
is_keyframe = false;
is_header = false;
pts = 0;
#endif
}
SrsSharedPtrMessage::~SrsSharedPtrMessage()
@ -232,6 +237,23 @@ SrsSharedPtrMessage::~SrsSharedPtrMessage()
}
}
}
#ifdef SRS_LAS
std::string SrsSharedPtrMessage::to_str() {
stringstream ss;
ss << "{";
ss << "dts=" << timestamp;
ss << ",pts=" << pts;
ss << ",is_k=" << is_keyframe;
ss << ",is_h=" << is_header;
if (ptr) {
ss << ",type=" << (int)ptr->header.message_type;
} else {
ss << ",type=unknow";
}
ss << "}";
return ss.str();
};
#endif
srs_error_t SrsSharedPtrMessage::create(SrsCommonMessage* msg)
{
@ -268,6 +290,19 @@ srs_error_t SrsSharedPtrMessage::create(SrsMessageHeader* pheader, char* payload
ptr->header.perfer_cid = pheader->perfer_cid;
this->timestamp = pheader->timestamp;
this->stream_id = pheader->stream_id;
#ifdef SRS_LAS
if (ptr->header.message_type == RTMP_MSG_VideoMessage) {
is_header = SrsFlvVideo::sh(payload, size);
is_keyframe = SrsFlvVideo::keyframe(payload, size) && !is_header;
pts = this->timestamp + SrsFlvVideo::cts(payload, size);
} else if (ptr->header.message_type == RTMP_MSG_AudioMessage) {
is_header = SrsFlvAudio::sh(payload, size);
pts=this->timestamp;
} else { // metadate
is_header = true;
pts=this->timestamp;
}
#endif
}
ptr->payload = payload;
ptr->size = size;
@ -361,6 +396,12 @@ SrsSharedPtrMessage* SrsSharedPtrMessage::copy()
copy->payload = ptr->payload;
copy->size = ptr->size;
#ifdef SRS_LAS
copy->pts = pts;
copy->is_header = is_header;
copy->is_keyframe = is_keyframe;
#endif
return copy;
}

View file

@ -290,6 +290,17 @@ public:
// video/audio packet use raw bytes, no video/audio packet.
char* payload;
#ifdef SRS_LAS
//if is video key frame, not include video sequence header
bool is_keyframe;
// if is {video sequence header|aac header|metadata}
bool is_header;
// for video pts = timstamp + cts, others pts = timestamp
int64_t pts;
public:
std::string to_str();
#endif
private:
class SrsSharedPtrPayload
{