mirror of
https://github.com/ossrs/srs.git
synced 2025-03-09 15:49:59 +00:00
fix ps buffer dynamic increase according to stream size
This commit is contained in:
parent
e506191484
commit
6bf1eee2bc
2 changed files with 29 additions and 19 deletions
|
@ -299,25 +299,18 @@ PsFrameBufferEnum SrsPsFrameBuffer::InsertPacket(const VCMPacket& packet, const
|
||||||
return kDuplicatePacket;
|
return kDuplicatePacket;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((packet.isFirstPacket == 0)&&
|
if ((packets_.size() == 0)&&
|
||||||
(first_packet_seq_num_ == -1 ||
|
(first_packet_seq_num_ == -1 ||
|
||||||
IsNewerSequenceNumber(first_packet_seq_num_, packet.seqNum))) {
|
IsNewerSequenceNumber(first_packet_seq_num_, packet.seqNum))) {
|
||||||
first_packet_seq_num_ = packet.seqNum;
|
first_packet_seq_num_ = packet.seqNum;
|
||||||
}else if (first_packet_seq_num_ != -1 &&
|
|
||||||
IsNewerSequenceNumber(first_packet_seq_num_, packet.seqNum)) {
|
|
||||||
srs_warn("Received packet with a sequence number which is out of frame boundaries");
|
|
||||||
return kDuplicatePacket;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (packet.markerBit &&
|
|
||||||
(last_packet_seq_num_ == -1 ||
|
|
||||||
IsNewerSequenceNumber(packet.seqNum, last_packet_seq_num_))) {
|
|
||||||
last_packet_seq_num_ = packet.seqNum;
|
|
||||||
} else if (last_packet_seq_num_ != -1 &&
|
|
||||||
IsNewerSequenceNumber(packet.seqNum, last_packet_seq_num_)) {
|
|
||||||
srs_warn("Received packet with a sequence number which is out of frame boundaries");
|
|
||||||
return kDuplicatePacket;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//TODO: not check marker, check a complete frame with timestamp
|
||||||
|
// if (packet.markerBit &&
|
||||||
|
// (last_packet_seq_num_ == -1 ||
|
||||||
|
// IsNewerSequenceNumber(packet.seqNum, last_packet_seq_num_))) {
|
||||||
|
// last_packet_seq_num_ = packet.seqNum;
|
||||||
|
// }
|
||||||
|
|
||||||
// The insert operation invalidates the iterator |rit|.
|
// The insert operation invalidates the iterator |rit|.
|
||||||
PacketIterator packet_list_it = packets_.insert(rit.base(), packet);
|
PacketIterator packet_list_it = packets_.insert(rit.base(), packet);
|
||||||
|
@ -1400,7 +1393,7 @@ bool SrsPsJitterBuffer::FoundFrame(uint32_t& time_stamp)
|
||||||
return found_frame;
|
return found_frame;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SrsPsJitterBuffer::GetPsFrame(char *buffer, int &size, const uint32_t time_stamp)
|
bool SrsPsJitterBuffer::GetPsFrame(char **buffer, int &buf_len, int &size, const uint32_t time_stamp)
|
||||||
{
|
{
|
||||||
SrsPsFrameBuffer* frame = ExtractAndSetDecode(time_stamp);
|
SrsPsFrameBuffer* frame = ExtractAndSetDecode(time_stamp);
|
||||||
|
|
||||||
|
@ -1408,13 +1401,30 @@ bool SrsPsJitterBuffer::GetPsFrame(char *buffer, int &size, const uint32_t time
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
size = frame->Length();
|
||||||
|
if (size <= 0){
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
if (buffer == NULL){
|
if (buffer == NULL){
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
size = frame->Length();
|
//verify and allocate ps buffer
|
||||||
|
if (buf_len < size || *buffer == NULL) {
|
||||||
|
srs_freepa(*buffer);
|
||||||
|
|
||||||
|
int resize = size + 10240;
|
||||||
|
*buffer = new char[resize];
|
||||||
|
|
||||||
|
srs_trace("gb28181: SrsPsJitterBuffer key=%s reallocate ps buffer size(%d>%d) resize(%d)",
|
||||||
|
key_.c_str(), size, buf_len, resize);
|
||||||
|
|
||||||
|
buf_len = resize;
|
||||||
|
}
|
||||||
|
|
||||||
const uint8_t *frame_buffer = frame->Buffer();
|
const uint8_t *frame_buffer = frame->Buffer();
|
||||||
memcpy(buffer, frame_buffer, size);
|
memcpy(*buffer, frame_buffer, size);
|
||||||
|
|
||||||
frame->PrepareForDecode(false);
|
frame->PrepareForDecode(false);
|
||||||
ReleaseFrame(frame);
|
ReleaseFrame(frame);
|
||||||
|
|
|
@ -341,7 +341,7 @@ public:
|
||||||
PsFrameBufferEnum InsertPacket(const SrsPsRtpPacket &packet, char *buf, int size, bool* retransmitted);
|
PsFrameBufferEnum InsertPacket(const SrsPsRtpPacket &packet, char *buf, int size, bool* retransmitted);
|
||||||
void ReleaseFrame(SrsPsFrameBuffer* frame);
|
void ReleaseFrame(SrsPsFrameBuffer* frame);
|
||||||
bool FoundFrame(uint32_t& time_stamp);
|
bool FoundFrame(uint32_t& time_stamp);
|
||||||
bool GetPsFrame(char *buffer, int &size, const uint32_t time_stamp);
|
bool GetPsFrame(char **buffer, int &buf_len, int &size, const uint32_t time_stamp);
|
||||||
void SetDecodeErrorMode(PsDecodeErrorMode error_mode);
|
void SetDecodeErrorMode(PsDecodeErrorMode error_mode);
|
||||||
void SetNackMode(PsNackMode mode,int64_t low_rtt_nack_threshold_ms,
|
void SetNackMode(PsNackMode mode,int64_t low_rtt_nack_threshold_ms,
|
||||||
int64_t high_rtt_nack_threshold_ms);
|
int64_t high_rtt_nack_threshold_ms);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue