Commit 3c9776e9faad1b5d6bcdbe4b7933f99c9427faee
1 parent
579b2613
代码优化
Showing
4 changed files
with
20 additions
and
17 deletions
src/decoder/dvpp/DvppRtpDecoder.cpp
1 | 1 | #include "DvppRtpDecoder.h" |
2 | 2 | |
3 | 3 | #include "DvppSourceManager.h" |
4 | -#include "../gb28181/rtp2/Rtp.h" | |
5 | 4 | |
6 | 5 | |
7 | 6 | #define CHECK_AND_RETURN(ret, message) \ |
... | ... | @@ -365,9 +364,9 @@ void DvppRtpDecoder::release_ffmpeg() { |
365 | 364 | } |
366 | 365 | |
367 | 366 | void DvppRtpDecoder::CacheBuffer(uint8_t* recvBuf, int recvBufSize) { |
368 | - if ((m_bufferSize + recvBufSize - RTP_HEADER_SIZE) < MAX_RTP_BUFFER_SIZE) { | |
369 | - memcpy(m_buffer + m_bufferSize, recvBuf + RTP_HEADER_SIZE, recvBufSize - RTP_HEADER_SIZE); | |
370 | - m_bufferSize += recvBufSize - RTP_HEADER_SIZE; | |
367 | + if ((m_bufferSize + recvBufSize) < MAX_RTP_BUFFER_SIZE) { | |
368 | + memcpy(m_buffer + m_bufferSize, recvBuf, recvBufSize); | |
369 | + m_bufferSize += recvBufSize; | |
371 | 370 | } else { |
372 | 371 | LOG_WARN("recvBufSize = {} over MAX_RTP_BUFFER_SIZE ", recvBufSize); |
373 | 372 | } |
... | ... | @@ -402,8 +401,8 @@ bool DvppRtpDecoder::probe() { |
402 | 401 | m_buffer_waiting_time = 3000; //probe只等待30s,避免卡主任务添加 |
403 | 402 | |
404 | 403 | // todo: 此处可能有泄露 |
405 | - unsigned char* avioBuff = (unsigned char*)av_malloc(MAX_RTP_BUFFER_SIZE); | |
406 | - AVIOContext *ioCtx = avio_alloc_context(avioBuff, sizeof(avioBuff), 0, this, avio_read_packet, NULL, NULL); | |
404 | + unsigned char* avioBuff = (unsigned char*)av_malloc(2048); // 32768 < MAX_RTP_BUFFER_SIZE - RTP_HEADER_SIZE | |
405 | + AVIOContext *ioCtx = avio_alloc_context(avioBuff, 2048, 0, this, avio_read_packet, NULL, NULL); | |
407 | 406 | |
408 | 407 | do{ |
409 | 408 | fmt_ctx = avformat_alloc_context(); |
... | ... | @@ -577,6 +576,10 @@ void DvppRtpDecoder::read_thread() { |
577 | 576 | continue; |
578 | 577 | } |
579 | 578 | |
579 | + // av_packet_free(&pkt); | |
580 | + // pkt = nullptr; | |
581 | + // continue; | |
582 | + | |
580 | 583 | if (m_DvppCacheCounter.load() > m_cache_gop){ |
581 | 584 | // 解码器解码不过来。实时流在此处的处理会导致花屏,这是由于解码器性能问题导致,无法避免 |
582 | 585 | // 实时流在这里处理是为了避免长时间不读取数据导致数据中断 | ... | ... |
src/decoder/dvpp/DvppRtpDecoder.h
... | ... | @@ -7,7 +7,7 @@ |
7 | 7 | #include <queue> |
8 | 8 | #include <mutex> |
9 | 9 | #include <chrono> |
10 | -#include<string> | |
10 | +#include <string> | |
11 | 11 | |
12 | 12 | #include "depend_headers.h" |
13 | 13 | #include "dvpp_headers.h" |
... | ... | @@ -21,6 +21,7 @@ using namespace std; |
21 | 21 | |
22 | 22 | #define MAX_RTP_BUFFER_SIZE 4194304 // 4M = 4 * 1024 * 1024 = 4194304 字节 |
23 | 23 | |
24 | + | |
24 | 25 | typedef void(*CallBack_DecodeFinished)(void* userdata); |
25 | 26 | |
26 | 27 | class DvppRtpDecoder |
... | ... | @@ -30,10 +31,6 @@ public: |
30 | 31 | ~DvppRtpDecoder(); |
31 | 32 | |
32 | 33 | public: |
33 | - std::atomic<char> m_buffer[MAX_RTP_BUFFER_SIZE]; | |
34 | - std::atomic_int m_bufferSize {0}; | |
35 | - | |
36 | -public: | |
37 | 34 | bool Init(FFDecConfig cfg); |
38 | 35 | void Close(); |
39 | 36 | bool start(); |
... | ... | @@ -160,5 +157,8 @@ private: |
160 | 157 | |
161 | 158 | int m_buffer_waiting_time{3000} ; |
162 | 159 | |
160 | + std::atomic<char> m_buffer[MAX_RTP_BUFFER_SIZE]; | |
161 | + std::atomic_int m_bufferSize {0}; | |
162 | + | |
163 | 163 | }; |
164 | 164 | #endif //__DVPP_RTP_DECODER_H__ |
165 | 165 | \ No newline at end of file | ... | ... |
src/decoder/gb28181/rtp2/RTPReceiver2.cpp
... | ... | @@ -170,7 +170,7 @@ int RTPReceiver2::udp_server() { |
170 | 170 | last_time = get_cur_time_second(); |
171 | 171 | |
172 | 172 | // buffer 抛出 |
173 | - m_buffer_cbk(m_bufferParam, recvBuf, recvBufSize, 0); | |
173 | + m_buffer_cbk(m_bufferParam, recvBuf + RTP_HEADER_SIZE, recvBufSize - RTP_HEADER_SIZE, 0); | |
174 | 174 | } |
175 | 175 | |
176 | 176 | close(server_fd); |
... | ... | @@ -220,12 +220,11 @@ int RTPReceiver2::tcp_server() { |
220 | 220 | |
221 | 221 | long long last_time = get_cur_time_second(); |
222 | 222 | |
223 | + socklen_t len = sizeof(sockaddr); | |
224 | + sockaddr_in accept_addr; | |
223 | 225 | while (!m_bRtpExit) |
224 | 226 | { |
225 | - // LOG_INFO("阻塞监听新连接..."); | |
226 | - // 阻塞接收请求 start | |
227 | - socklen_t len = sizeof(sockaddr); | |
228 | - sockaddr_in accept_addr; | |
227 | + // 非阻塞接收请求 start | |
229 | 228 | int clientFd = accept(listenfd, (struct sockaddr*)&accept_addr, &len); |
230 | 229 | if (clientFd < 0) { |
231 | 230 | if (!bFilter) { |
... | ... | @@ -310,7 +309,7 @@ void RTPReceiver2::parseTcpData(uint8_t* recvBuf, int recvBufSize) { |
310 | 309 | // mRecvCacheSize,rtpHeader.marker, rtpHeader.timestamp); |
311 | 310 | |
312 | 311 | // buffer 抛出 |
313 | - m_buffer_cbk(m_bufferParam, mRecvRtpBuffer, mRecvRtpBufferSize, rtpHeader.timestamp); | |
312 | + m_buffer_cbk(m_bufferParam, mRecvRtpBuffer + RTP_HEADER_SIZE, mRecvRtpBufferSize - RTP_HEADER_SIZE, rtpHeader.timestamp); | |
314 | 313 | |
315 | 314 | } else { |
316 | 315 | //LOGI("跳出解析:cacheSize=%d,pktSize=%d", cacheSize, pktSize); | ... | ... |
src/decoder/gb28181/rtp2/Rtp.cpp
... | ... | @@ -23,6 +23,7 @@ void rtpHeaderInit(struct RtpPacket* rtpPacket, uint8_t csrcLen, uint8_t extensi |
23 | 23 | rtpPacket->rtpHeader.timestamp = timestamp; |
24 | 24 | rtpPacket->rtpHeader.ssrc = ssrc; |
25 | 25 | } |
26 | + | |
26 | 27 | int parseRtpHeader(uint8_t* headerBuf, struct RtpHeader* rtpHeader){ |
27 | 28 | memset(rtpHeader,0,sizeof(*rtpHeader)); |
28 | 29 | /* byte 0 */ | ... | ... |