From 9e5babf9db52e64bdae60137be7696e56241fca6 Mon Sep 17 00:00:00 2001
From: xingzilong <xingzilong@454eff88-639b-444f-9e54-f578c98de674>
Date: 星期五, 18 八月 2017 18:12:17 +0800
Subject: [PATCH] H264 NALU解析 并在RTSPServer判断
---
RtspFace/PL_RTSPServer2.cpp | 105 ++++++++++++++++++++++++++++++++++++++++++++++++----
1 files changed, 97 insertions(+), 8 deletions(-)
diff --git a/RtspFace/PL_RTSPServer2.cpp b/RtspFace/PL_RTSPServer2.cpp
index 16da9fa..7974fb5 100644
--- a/RtspFace/PL_RTSPServer2.cpp
+++ b/RtspFace/PL_RTSPServer2.cpp
@@ -12,6 +12,32 @@
#include "PreAllocBufferQueue.h"
#include "MediaHelper.h"
+typedef enum {
+ NALU_TYPE_SLICE = 1,
+ NALU_TYPE_DPA = 2,
+ NALU_TYPE_DPB = 3,
+ NALU_TYPE_DPC = 4,
+ NALU_TYPE_IDR = 5,
+ NALU_TYPE_SEI = 6,
+ NALU_TYPE_SPS = 7,
+ NALU_TYPE_PPS = 8,
+ NALU_TYPE_AUD = 9,
+ NALU_TYPE_EOSEQ = 10,
+ NALU_TYPE_EOSTREAM = 11,
+ NALU_TYPE_FILL = 12,
+} NaluType;
+
+typedef struct
+{
+ int startcodeprefix_len; //! 4 for parameter sets and first slice in picture, 3 for everything else (suggested)
+ unsigned len; //! Length of the NAL unit (Excluding the start code, which does not belong to the NALU)
+ unsigned max_size; //! Nal Unit Buffer size
+ int forbidden_bit; //! should be always FALSE
+ int nal_reference_idc; //! NALU_PRIORITY_xxxx
+ int nal_unit_type; //! NALU_TYPE_xxxx
+ char *buf; //! contains the first byte followed by the EBSP
+} NALU_t;
+
struct RTSPServer2_Internal
{
RTSPServer2Config config;
@@ -28,12 +54,20 @@
bool auxLineSet;
+ uint8_t lastSps[50];
+ uint8_t lastPps[50];
+ uint8_t lastSpsPps[100];
+
+ size_t lastSpsSize;
+ size_t lastPpsSize;
+
RTSPServer2_Internal() :
config(),
live_daemon_thid(0), live_daemon_running(false),
server(nullptr),
frameQueue(nullptr), queue_mutex(nullptr), queue_empty_mutex(nullptr), queue_full_mutex(nullptr), //#todo from config
- auxLineSet(false)
+ auxLineSet(false),
+ lastSps(), lastPps(),lastSpsPps(),lastSpsSize(0),lastPpsSize(0)
{
}
@@ -86,6 +120,8 @@
server = nullptr; //#todo delete
auxLineSet = false;
+ lastSpsSize = 0;
+ lastPpsSize = 0;
}
};
@@ -123,6 +159,18 @@
}
}
+ static int get_nalu_info(NALU_t* _p_nalu_info,const uint8_t* _pbuffer,const size_t _len)
+ {
+ if((nullptr==_pbuffer)||(_len<=4))
+ {
+ return -1;
+ }
+ _p_nalu_info->forbidden_bit = _pbuffer[4] & 0x80; //1 bit
+ _p_nalu_info->nal_reference_idc = _pbuffer[4] & 0x60; // 2 bit
+ _p_nalu_info->nal_unit_type = _pbuffer[4] & 0x1f;// 5 bit
+ return 0;
+ }
+
static bool deliverFrame(void* args, uint8_t*& buffer, size_t& buffSize, timeval& pts)
{
DeliverFrameCallback* _this = (DeliverFrameCallback*)args;
@@ -159,6 +207,26 @@
_this->in->frameQueue->Release(_this->lastBuffer);
_this->lastBuffer = nullptr;
}
+
+ //#todo
+#if 0
+ //find frameQueue->Seek is pps/sps
+ PreAllocBufferQueue::Buffer* _p_Buffer = _this->in->frameQueue->Seek();
+ // if not: send bufferred pps , return;
+
+ NALU_t _obj_NALU_t;
+ get_nalu_info(&_obj_NALU_t,_p_Buffer->buffer,_p_Buffer->buffSize);
+ if(NALU_TYPE_PPS!=_obj_NALU_t.nal_unit_type)
+ {
+ memcpy(_this->in->lastSpsPps,_this->in->lastSps,_this->in->lastSpsSize);
+ memcpy(_this->in->lastSpsPps+_this->in->lastSpsSize,_this->in->lastPps,_this->in->lastPpsSize);
+ buffer = _this->in->lastSpsPps;
+ buffSize = _this->in->lastSpsSize+_this->in->lastPpsSize;
+ gettimeofday(&pts, NULL);
+ return true;
+ }
+#endif
+
_this->lastBuffer = _this->in->frameQueue->Dequeue();
if (_this->lastBuffer == nullptr)
@@ -281,6 +349,33 @@
}
}
+ MB_Frame* frame = (MB_Frame*)pm.buffer;
+ if (frame->buffer == nullptr || frame->buffSize == 0)
+ return false;
+ //LOG_WARN << "sizeR=" << frame->buffSize << LOG_ENDL;
+
+
+
+//#todo
+#if 0
+ // find if is pps/
+ // buffer the frame into spsRTSPServer2_Internal
+
+ if(frame->type==MB_Frame::MBFT_H264_NALU)
+ {
+ NALU_t objNALU_t;
+ DeliverFrameCallback::get_nalu_info(&objNALU_t,(const uint8_t*)(frame->buffer),frame->buffSize);
+ if(NALU_TYPE_PPS!=objNALU_t.nal_unit_type)
+ {
+ memcpy(in->lastPps,frame->buffer,frame->buffSize);
+ }
+ else if(NALU_TYPE_SPS!=objNALU_t.nal_unit_type)
+ {
+ memcpy(in->lastSps,frame->buffer,frame->buffSize);
+ }
+ }
+#endif
+
while (in->config.payBlockFullQueue && in->frameQueue->Full())
{
int ret = pthread_mutex_lock(in->queue_full_mutex);
@@ -295,12 +390,6 @@
// return false;
//}
}
-
- MB_Frame* frame = (MB_Frame*)pm.buffer;
- if (frame->buffer == nullptr || frame->buffSize == 0)
- return false;
-
- //LOG_WARN << "sizeR=" << frame->buffSize << LOG_ENDL;
ScopeLocker<pthread_mutex_t>(in->queue_mutex);
//if (in->frameQueue->Full())
@@ -355,5 +444,5 @@
pm.buffer = nullptr;
pm.buffSize = 0;
pm.former = this;
- return true;
+ return false;
}
--
Gitblit v1.8.0