1
0
Fork 0
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:
kyxlx550 2020-06-27 19:38:24 +08:00
parent e506191484
commit 6bf1eee2bc
2 changed files with 29 additions and 19 deletions

View file

@ -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);

View file

@ -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);