feat/hk #1
@ -31,6 +31,8 @@ set(CMAKE_C_VISIBILITY_PRESET hidden)
|
|||||||
set(CMAKE_CXX_VISIBILITY_PRESET hidden)
|
set(CMAKE_CXX_VISIBILITY_PRESET hidden)
|
||||||
# set(CMAKE_C_FLAGS$ "${CMAKE_C_FLAGS} -fvisibility = hidden")
|
# set(CMAKE_C_FLAGS$ "${CMAKE_C_FLAGS} -fvisibility = hidden")
|
||||||
# set(CMAKE_CXX_FLAGS$ "${CMAKE_CXX_FLAGS} -fvisibility = hidden")
|
# set(CMAKE_CXX_FLAGS$ "${CMAKE_CXX_FLAGS} -fvisibility = hidden")
|
||||||
|
# set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address
|
||||||
|
# -fno-omit-frame-pointer")
|
||||||
set(SecMedia_Root ${CMAKE_CURRENT_SOURCE_DIR}/src)
|
set(SecMedia_Root ${CMAKE_CURRENT_SOURCE_DIR}/src)
|
||||||
add_compile_options(-fPIC)
|
add_compile_options(-fPIC)
|
||||||
# add_compile_options(-fvisibility=hidden) add_compile_options(-std=c++11)
|
# add_compile_options(-fvisibility=hidden) add_compile_options(-std=c++11)
|
||||||
@ -105,10 +107,13 @@ file(GLOB SecMedia_api_list ${CMAKE_CURRENT_SOURCE_DIR}/include/common.h)
|
|||||||
|
|
||||||
# # target_compile_options(${PROJECT_NAME} PRIVATE -fvisibility=hidden)
|
# # target_compile_options(${PROJECT_NAME} PRIVATE -fvisibility=hidden)
|
||||||
# list(APPEND LINK_LIB_LIST ${LINK_LIB_SVAC_LIST})
|
# list(APPEND LINK_LIB_LIST ${LINK_LIB_SVAC_LIST})
|
||||||
|
#
|
||||||
|
find_package(Threads REQUIRED)
|
||||||
|
|
||||||
add_library(${PROJECT_NAME} SHARED ${SecMedia_src_list})
|
add_library(${PROJECT_NAME} SHARED ${SecMedia_src_list})
|
||||||
# add_library(${PROJECT_NAME} STATIC ${SecMedia_src_list})
|
# add_library(${PROJECT_NAME} STATIC ${SecMedia_src_list})
|
||||||
target_link_libraries(${PROJECT_NAME} PUBLIC ${LINK_LIB_SVAC_LIST} rtp)
|
target_link_libraries(${PROJECT_NAME} PUBLIC ${LINK_LIB_SVAC_LIST} rtp
|
||||||
|
Threads::Threads)
|
||||||
target_include_directories(
|
target_include_directories(
|
||||||
${PROJECT_NAME}
|
${PROJECT_NAME}
|
||||||
PRIVATE ${SecMedia_Root}
|
PRIVATE ${SecMedia_Root}
|
||||||
|
@ -3,20 +3,21 @@
|
|||||||
|
|
||||||
namespace sign {
|
namespace sign {
|
||||||
|
|
||||||
FrameManager::FrameManager() { Init(); }
|
FrameManager::FrameManager() {}
|
||||||
|
|
||||||
FrameManager::~FrameManager() {}
|
FrameManager::~FrameManager() {}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
FrameManager::Initialize()
|
FrameManager::Initialize()
|
||||||
{
|
{
|
||||||
|
Init();
|
||||||
return _rtp_manager.Initialize();
|
return _rtp_manager.Initialize();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
FrameManager::Enqueue(Frame::Ptr frame)
|
FrameManager::Enqueue(Frame::Ptr frame)
|
||||||
{
|
{
|
||||||
|
CheckMagicNumber();
|
||||||
std::lock_guard<std::mutex> _(_frame_queue_lock);
|
std::lock_guard<std::mutex> _(_frame_queue_lock);
|
||||||
OnFrameEnqueue(frame);
|
OnFrameEnqueue(frame);
|
||||||
_frame_queue.push(frame);
|
_frame_queue.push(frame);
|
||||||
@ -26,6 +27,7 @@ FrameManager::Enqueue(Frame::Ptr frame)
|
|||||||
Frame::Ptr
|
Frame::Ptr
|
||||||
FrameManager::Dequeue()
|
FrameManager::Dequeue()
|
||||||
{
|
{
|
||||||
|
CheckMagicNumber();
|
||||||
Frame::Ptr frame{nullptr};
|
Frame::Ptr frame{nullptr};
|
||||||
auto start = std::chrono::system_clock::now();
|
auto start = std::chrono::system_clock::now();
|
||||||
{
|
{
|
||||||
@ -54,4 +56,13 @@ FrameManager::Init()
|
|||||||
OnFrameEnqueue.connect(&_rtp_manager, &RTPManager::OnFrameEnqueue);
|
OnFrameEnqueue.connect(&_rtp_manager, &RTPManager::OnFrameEnqueue);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
FrameManager::CheckMagicNumber()
|
||||||
|
{
|
||||||
|
if (memcmp(magic_number, "MAGI", 4) != 0) {
|
||||||
|
ERROL("Please Init FrameManager.\n");
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}// namespace sign
|
}// namespace sign
|
||||||
|
@ -28,8 +28,10 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
void Init();
|
void Init();
|
||||||
|
void CheckMagicNumber();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
char magic_number[4] = {'M', 'A', 'G', 'I'};
|
||||||
RTPManager _rtp_manager;
|
RTPManager _rtp_manager;
|
||||||
|
|
||||||
std::mutex _frame_queue_lock;
|
std::mutex _frame_queue_lock;
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
#include "HuaWei/HWcommon.h"
|
||||||
#include "HuaWei/HWsign.h"
|
#include "HuaWei/HWsign.h"
|
||||||
#include "base/frame_manager.h"
|
#include "base/frame_manager.h"
|
||||||
|
|
||||||
@ -18,6 +19,10 @@ HK_udp_in(void *Handle, const char *buf, const uint32_t len, void *param)
|
|||||||
{
|
{
|
||||||
sign::FrameManager *fm = (sign::FrameManager *) Handle;
|
sign::FrameManager *fm = (sign::FrameManager *) Handle;
|
||||||
auto frame = sign::Frame::CreateUDPFrame(buf, len);
|
auto frame = sign::Frame::CreateUDPFrame(buf, len);
|
||||||
|
if (!frame) {
|
||||||
|
ERROL("Create frame failed\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
fm->Enqueue(frame);
|
fm->Enqueue(frame);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -73,8 +73,15 @@ RTPManager::InitVerifySet(void *info)
|
|||||||
void
|
void
|
||||||
RTPManager::ProcessUDPFrame(Frame::Ptr frame)
|
RTPManager::ProcessUDPFrame(Frame::Ptr frame)
|
||||||
{
|
{
|
||||||
if (!IsRTPHeader(frame->data(), frame->size())) { return; }
|
if (!IsRTPHeader(frame->data(), frame->size())) {
|
||||||
|
INFOL("Not a RTP packet. discard it.\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
auto packet = RTPPacket::CreateCompleteRTPPacket(this, frame);
|
auto packet = RTPPacket::CreateCompleteRTPPacket(this, frame);
|
||||||
|
if (packet->payload_type() == 112) {
|
||||||
|
INFOL("RTCP packet pt=112. discard it.\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
ProcessPacket(packet);
|
ProcessPacket(packet);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -86,7 +93,7 @@ void
|
|||||||
RTPManager::ProcessPacket(RTPPacket::Ptr packet)
|
RTPManager::ProcessPacket(RTPPacket::Ptr packet)
|
||||||
{
|
{
|
||||||
if (!packet->IsComplete()) {
|
if (!packet->IsComplete()) {
|
||||||
// ERROL("RTP packet is not complete, discard it.\n");
|
ERROL("RTP packet is not complete, discard it.\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -99,7 +106,7 @@ RTPManager::ProcessPacket(RTPPacket::Ptr packet)
|
|||||||
|
|
||||||
MaybeSetSeq(packet->seq());
|
MaybeSetSeq(packet->seq());
|
||||||
if (packet->seq() != _cur_rtp_seq) {
|
if (packet->seq() != _cur_rtp_seq) {
|
||||||
// WRNGL("RTP packet seq is not continuous. cur_seq=%ld, packet->seq=%d\n", _cur_rtp_seq, packet->seq());
|
WRNGL("RTP packet seq is not continuous. cur_seq=%ld, packet->seq=%d\n", _cur_rtp_seq, packet->seq());
|
||||||
SetCurSeq(packet->seq());
|
SetCurSeq(packet->seq());
|
||||||
}
|
}
|
||||||
IncCurSeq();
|
IncCurSeq();
|
||||||
@ -110,7 +117,7 @@ RTPManager::ProcessPacket(RTPPacket::Ptr packet)
|
|||||||
}
|
}
|
||||||
if (_decoder) { _decoder->Input(packet); }
|
if (_decoder) { _decoder->Input(packet); }
|
||||||
|
|
||||||
MaybeReplaceSeq(packet);
|
// MaybeReplaceSeq(packet);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -156,6 +163,25 @@ RTPManager::GetNextSeq()
|
|||||||
return (_cur_rtp_seq + 1) & 0xFFFF;
|
return (_cur_rtp_seq + 1) & 0xFFFF;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const char *
|
||||||
|
ToString(H264Nal::H264Nal_t type)
|
||||||
|
{
|
||||||
|
switch (type) {
|
||||||
|
case H264Nal::NAL_IDR:
|
||||||
|
return "IDR";
|
||||||
|
case H264Nal::NAL_SEI:
|
||||||
|
return "SEI";
|
||||||
|
case H264Nal::NAL_PPS:
|
||||||
|
return "PPS";
|
||||||
|
case H264Nal::NAL_SPS:
|
||||||
|
return "SPS";
|
||||||
|
case H264Nal::NAL_P_B:
|
||||||
|
return "P_B";
|
||||||
|
default:
|
||||||
|
return "Unknown";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
RTPManager::OnRTPDecoded(RTPDecoder::DecodedPacket packet)
|
RTPManager::OnRTPDecoded(RTPDecoder::DecodedPacket packet)
|
||||||
{
|
{
|
||||||
@ -169,7 +195,8 @@ RTPManager::OnRTPDecoded(RTPDecoder::DecodedPacket packet)
|
|||||||
}
|
}
|
||||||
auto str = ss.str();
|
auto str = ss.str();
|
||||||
if (!str.empty()) str.pop_back();
|
if (!str.empty()) str.pop_back();
|
||||||
INFOL("RTP decoded. type=%2d, size=%5u seq=[%s]\n", h264_type, packet.bytes, str.c_str());
|
INFOL("RTP decoded. type=%s, size=%5u seq=[%s]\n", ToString((H264Nal::H264Nal_t) h264_type), packet.bytes,
|
||||||
|
str.c_str());
|
||||||
if (h264_type == H264Nal::NAL_IDR) {
|
if (h264_type == H264Nal::NAL_IDR) {
|
||||||
// remove old sign
|
// remove old sign
|
||||||
ResetSignData();
|
ResetSignData();
|
||||||
|
@ -141,8 +141,12 @@ RTPPacket::RTPPacket(RTPManager *owner, Frame::Ptr udp_frame)
|
|||||||
rtp_packet_t pkt;
|
rtp_packet_t pkt;
|
||||||
if (rtp_packet_deserialize(&pkt, udp_frame->data(), udp_frame->size()) == 0) {
|
if (rtp_packet_deserialize(&pkt, udp_frame->data(), udp_frame->size()) == 0) {
|
||||||
_state = kComplete;
|
_state = kComplete;
|
||||||
uint8_t h264_type = ((uint8_t *) pkt.payload)[0] & 0x1F;
|
if (pkt.payloadlen > 0 && pkt.payload) {
|
||||||
if (h264_type == H264Nal::NAL_SEI) { udp_frame->set_paused(true); }
|
uint8_t h264_type = ((uint8_t *) pkt.payload)[0] & 0x1F;
|
||||||
|
if (h264_type == H264Nal::NAL_SEI) { udp_frame->set_paused(true); }
|
||||||
|
} else {
|
||||||
|
// WRNGL("rtp packet payload is empty\n");
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
_state = kError;
|
_state = kError;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user