Commit 3c9776e9faad1b5d6bcdbe4b7933f99c9427faee

Authored by Hu Chunming
1 parent 579b2613

代码优化

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 */
... ...