From 513d2e24abff6de1b35b2471a57ce1361686e6de Mon Sep 17 00:00:00 2001 From: chenshijun <csj_sky@126.com> Date: 星期六, 29 六月 2019 16:21:15 +0800 Subject: [PATCH] 修改解码gb28181的bug --- csrc/thirdparty/gb28181/lib/librtspclient.so | 0 .idea/vcs.xml | 6 .idea/modules.xml | 8 .idea/goffmpeg.iml | 2 csrc/thirdparty/gb28181/include/librtsp.h | 114 ++++++++++++ .idea/workspace.xml | 142 +++++++++++++++ csrc/thirdparty/gb28181/include/PsToEs.hpp | 190 +++++++++++++++++++++ .idea/codeStyles/Project.xml | 29 +++ .idea/misc.xml | 7 csrc/thirdparty/gb28181/lib/libStreamParse.so | 0 10 files changed, 498 insertions(+), 0 deletions(-) diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml new file mode 100644 index 0000000..30aa626 --- /dev/null +++ b/.idea/codeStyles/Project.xml @@ -0,0 +1,29 @@ +<component name="ProjectCodeStyleConfiguration"> + <code_scheme name="Project" version="173"> + <Objective-C-extensions> + <file> + <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Import" /> + <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Macro" /> + <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Typedef" /> + <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Enum" /> + <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Constant" /> + <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Global" /> + <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Struct" /> + <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="FunctionPredecl" /> + <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Function" /> + </file> + <class> + <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Property" /> + <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Synthesize" /> + <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="InitMethod" /> + <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="StaticMethod" /> + <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="InstanceMethod" /> + <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="DeallocMethod" /> + </class> + <extensions> + <pair source="cpp" header="h" fileNamingConvention="NONE" /> + <pair source="c" header="h" fileNamingConvention="NONE" /> + </extensions> + </Objective-C-extensions> + </code_scheme> +</component> \ No newline at end of file diff --git a/.idea/goffmpeg.iml b/.idea/goffmpeg.iml new file mode 100644 index 0000000..f08604b --- /dev/null +++ b/.idea/goffmpeg.iml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8"?> +<module classpath="CMake" type="CPP_MODULE" version="4" /> \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..8822db8 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="CMakeWorkspace" PROJECT_DIR="$PROJECT_DIR$" /> + <component name="JavaScriptSettings"> + <option name="languageLevel" value="ES6" /> + </component> +</project> \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..5377626 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="ProjectModuleManager"> + <modules> + <module fileurl="file://$PROJECT_DIR$/.idea/goffmpeg.iml" filepath="$PROJECT_DIR$/.idea/goffmpeg.iml" /> + </modules> + </component> +</project> \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="VcsDirectoryMappings"> + <mapping directory="$PROJECT_DIR$" vcs="Git" /> + </component> +</project> \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml new file mode 100644 index 0000000..ec5d76c --- /dev/null +++ b/.idea/workspace.xml @@ -0,0 +1,142 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="CMakeRunConfigurationManager" shouldGenerate="true" shouldDeleteObsolete="true" buildAllGenerated="true"> + <generated> + <config projectName="cffmpeg" targetName="cffmpeg" /> + </generated> + </component> + <component name="CMakeSettings"> + <configurations> + <configuration PROFILE_NAME="Debug" CONFIG_NAME="Debug" /> + </configurations> + </component> + <component name="ChangeListManager"> + <list default="true" id="d36808e2-34af-4b98-9cbb-dcee35b4ca2e" name="Default Changelist" comment=""> + <change beforePath="$PROJECT_DIR$/csrc/ffmpeg/format/FormatIn.cpp" beforeDir="false" afterPath="$PROJECT_DIR$/csrc/ffmpeg/format/FormatIn.cpp" afterDir="false" /> + </list> + <ignored path="$PROJECT_DIR$/cmake-build-debug/" /> + <option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" /> + <option name="SHOW_DIALOG" value="false" /> + <option name="HIGHLIGHT_CONFLICTS" value="true" /> + <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" /> + <option name="LAST_RESOLUTION" value="IGNORE" /> + </component> + <component name="ExecutionTargetManager" SELECTED_TARGET="CMakeBuildProfile:Debug" /> + <component name="FUSProjectUsageTrigger"> + <session id="1605316314"> + <usages-collector id="statistics.lifecycle.project"> + <counts> + <entry key="project.open.time.0" value="1" /> + <entry key="project.opened" value="1" /> + </counts> + </usages-collector> + </session> + </component> + <component name="Git.Settings"> + <option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" /> + </component> + <component name="JsBuildToolGruntFileManager" detection-done="true" sorting="DEFINITION_ORDER" /> + <component name="JsBuildToolPackageJson" detection-done="true" sorting="DEFINITION_ORDER" /> + <component name="JsGulpfileManager"> + <detection-done>true</detection-done> + <sorting>DEFINITION_ORDER</sorting> + </component> + <component name="ProjectFrameBounds" extendedState="7"> + <option name="x" value="65" /> + <option name="y" value="24" /> + <option name="width" value="928" /> + <option name="height" value="1176" /> + </component> + <component name="ProjectView"> + <navigator proportions="" version="1"> + <foldersAlwaysOnTop value="true" /> + </navigator> + <panes> + <pane id="Scope" /> + <pane id="ProjectPane" /> + </panes> + </component> + <component name="PropertiesComponent"> + <property name="WebServerToolWindowFactoryState" value="false" /> + <property name="last_opened_file_path" value="$PROJECT_DIR$" /> + <property name="nodejs_interpreter_path.stuck_in_default_project" value="undefined stuck path" /> + <property name="nodejs_npm_path_reset_for_default_project" value="true" /> + <property name="settings.editor.selected.configurable" value="configurable.group.appearance" /> + </component> + <component name="RunDashboard"> + <option name="ruleStates"> + <list> + <RuleState> + <option name="name" value="ConfigurationTypeDashboardGroupingRule" /> + </RuleState> + <RuleState> + <option name="name" value="StatusDashboardGroupingRule" /> + </RuleState> + </list> + </option> + </component> + <component name="RunManager" selected="Application.cffmpeg"> + <configuration name="Build All" type="CMakeRunConfiguration" factoryName="Application" PASS_PARENT_ENVS_2="true" CONFIG_NAME="Debug" EXPLICIT_BUILD_TARGET_NAME="all"> + <method v="2"> + <option name="com.jetbrains.cidr.execution.CidrBuildBeforeRunTaskProvider$BuildBeforeRunTask" enabled="true" /> + </method> + </configuration> + <configuration name="cffmpeg" type="CMakeRunConfiguration" factoryName="Application" PASS_PARENT_ENVS_2="true" PROJECT_NAME="cffmpeg" TARGET_NAME="cffmpeg" CONFIG_NAME="Debug"> + <method v="2"> + <option name="com.jetbrains.cidr.execution.CidrBuildBeforeRunTaskProvider$BuildBeforeRunTask" enabled="true" /> + </method> + </configuration> + <list> + <item itemvalue="Application.Build All" /> + <item itemvalue="Application.cffmpeg" /> + </list> + </component> + <component name="SvnConfiguration"> + <configuration /> + </component> + <component name="TaskManager"> + <task active="true" id="Default" summary="Default task"> + <changelist id="d36808e2-34af-4b98-9cbb-dcee35b4ca2e" name="Default Changelist" comment="" /> + <created>1561627005122</created> + <option name="number" value="Default" /> + <option name="presentableId" value="Default" /> + <updated>1561627005122</updated> + <workItem from="1561627006451" duration="599000" /> + </task> + <servers /> + </component> + <component name="TimeTrackingManager"> + <option name="totallyTimeSpent" value="599000" /> + </component> + <component name="ToolWindowManager"> + <frame x="65" y="24" width="928" height="1176" extended-state="7" /> + <editor active="true" /> + <layout> + <window_info id="Favorites" side_tool="true" /> + <window_info active="true" content_ui="combo" id="Project" order="0" visible="true" weight="0.24943566" /> + <window_info id="Structure" order="1" side_tool="true" weight="0.25" /> + <window_info anchor="bottom" id="Database Changes" show_stripe_button="false" /> + <window_info anchor="bottom" id="Version Control" /> + <window_info anchor="bottom" id="Terminal" /> + <window_info anchor="bottom" id="Event Log" side_tool="true" /> + <window_info anchor="bottom" id="CMake" /> + <window_info anchor="bottom" id="Message" order="0" /> + <window_info anchor="bottom" id="Find" order="1" /> + <window_info anchor="bottom" id="Run" order="2" /> + <window_info anchor="bottom" id="Debug" order="3" weight="0.4" /> + <window_info anchor="bottom" id="Cvs" order="4" weight="0.25" /> + <window_info anchor="bottom" id="Inspection" order="5" weight="0.4" /> + <window_info anchor="bottom" id="TODO" order="6" /> + <window_info anchor="right" id="Database" /> + <window_info anchor="right" id="Commander" internal_type="SLIDING" order="0" type="SLIDING" weight="0.4" /> + <window_info anchor="right" id="Ant Build" order="1" weight="0.25" /> + <window_info anchor="right" content_ui="combo" id="Hierarchy" order="2" weight="0.25" /> + </layout> + </component> + <component name="TypeScriptGeneratedFilesManager"> + <option name="version" value="1" /> + </component> + <component name="VcsContentAnnotationSettings"> + <option name="myLimit" value="2678400000" /> + </component> +</project> \ No newline at end of file diff --git a/csrc/thirdparty/gb28181/include/PsToEs.hpp b/csrc/thirdparty/gb28181/include/PsToEs.hpp new file mode 100644 index 0000000..663fbdb --- /dev/null +++ b/csrc/thirdparty/gb28181/include/PsToEs.hpp @@ -0,0 +1,190 @@ +#include <cstdio> +#include <string> +#include <cstring> +#include <deque> +#include <pthread.h> + +#include "librtsp.h" + + +using namespace std; + +template<typename T> +class MyQueue { +public: + MyQueue():mtx(PTHREAD_MUTEX_INITIALIZER), cond(PTHREAD_COND_INITIALIZER){ + t.tv_sec = 0; + t.tv_nsec = 20000000; + } + + ~MyQueue() { + + } + +public: + void push(T v) { + pthread_mutex_lock(&mtx); + q.push_back(v); + pthread_cond_signal(&cond); + pthread_mutex_unlock(&mtx); + } + + //鍚戦槦鍒楃殑鍓嶉潰鎻掑叆鍏冪礌 + void push_front_one(T v) { + pthread_mutex_lock(&mtx); + q.push_front(v); + pthread_cond_signal(&cond); + pthread_mutex_unlock(&mtx); + } + + T pop() { + pthread_mutex_lock(&mtx); + while (q.empty()) { + pthread_cond_wait(&cond, &mtx); + pthread_cond_timedwait(&cond, &mtx, &t); + } + T value = q.front(); + q.pop_front(); + pthread_mutex_unlock(&mtx); + return value; + } + + T popNotWait() { + pthread_mutex_lock(&mtx); + T value = q.front(); + q.pop_front(); + pthread_mutex_unlock(&mtx); + return value; + + } + + int count_queue() { + return q.size(); + } + + T clearAll(){ + pthread_mutex_lock(&mtx); + while (!q.empty()) q.pop_front(); + pthread_mutex_unlock(&mtx); + } + +private: + deque<T> q; + pthread_mutex_t mtx; + pthread_cond_t cond; + timespec t; +}; + +typedef struct _buffInfo { + unsigned char *buff; + int buffLen; +} frameBuffInfo; + +MyQueue<frameBuffInfo *> m_rtpQueue; +long Handle; + +bool pushInfo(unsigned char *data, int datalen) { + + frameBuffInfo *info = new frameBuffInfo(); + info->buff = new unsigned char[datalen]; + info->buffLen = datalen; + memcpy(info->buff, data, datalen); + + //printf(" m_rtpQueue.push befores "); + m_rtpQueue.push(info); + //printf(" m_rtpQueue.push after "); + + return true; +} + +int readData(void *opaque, unsigned char *buf, int bufsize) { + +// GB28181API *_this = (GB28181API *)opaque; + int len = bufsize; + int diff = 0; + do { + + //printf(" m_rtpQueue.pop before "); + //浠庣紦瀛樹腑鑾峰彇buffinfo + frameBuffInfo *buffinfo = m_rtpQueue.pop(); +// DBG(" m_rtpQueue.pop after "); + diff = len - buffinfo->buffLen; + + //甯ч暱澶т簬bufsize + if (diff < 0) { + printf("/甯ч暱澶т簬bufsize:%d\n", diff); + memcpy(buf + bufsize - len, buffinfo->buff, len); + + frameBuffInfo *info = new frameBuffInfo(); + info->buffLen = buffinfo->buffLen - len; + info->buff = new unsigned char[buffinfo->buffLen - len]{}; + memcpy(info->buff, buffinfo->buff + len, buffinfo->buffLen - len); + + m_rtpQueue.push_front_one(info); + } else if (diff == 0) { + printf("/甯ч暱绛変簬bufsize:%d\n", diff); + memcpy(buf + bufsize - len, buffinfo->buff, buffinfo->buffLen); + } else if (diff > 0) { + printf("/甯ч暱灏忎簬bufsize:%d\n", diff); + memcpy(buf + bufsize - len, buffinfo->buff, buffinfo->buffLen); + len = len - buffinfo->buffLen; //杩橀渶瑕佸~鍏呯殑澶у皬 + memset(buf + bufsize - len, 0, len); + //涓嶇瓑寰呭~鍏咃紝鐩存帴杩涜瑙g爜 + diff = 0; + } + delete[] buffinfo->buff; + delete buffinfo; + } while (diff > 0); + + return bufsize; +} + +void streamCallBack(int datatype, int frametype, unsigned char *data, unsigned int datalen, long userdata) +{ + //GB28181API *_this = (GB28181API *)userdata; + printf("userdata:%ld,datatype:%d, frametype:%d, datalen:%d\n", userdata, datatype, frametype, datalen); + +// //debug=============== +// static int count = 0; +// static FILE *fp_write = NULL; +// if(count < 100) { +// count++; +// +// if (!fp_write) { +// fp_write = fopen("stream_callback.mp4", "wb+"); +// } +// +// fwrite(data, sizeof(char), datalen, fp_write); +// } +// if(count >= 100){ +// if (!fp_write) { +// fclose(fp_write); +// } +// } +// //debug=============== + + static bool startFlag = false; + if(frametype == GB_VIDEO_FRAME_I){ + startFlag = true; + } + if((data != NULL) && (startFlag == true)){ + pushInfo(data, datalen); + } + +} + +long addCamera(string &rtsp){ + printf("RTSPSTREAM_Open\n"); + long userdata = 1001; + Handle = RTSPSTREAM_Open(rtsp.c_str(), streamCallBack, userdata); + return Handle; +} + +void deleteCamera(void){ + m_rtpQueue.clearAll(); + RTSPSTREAM_Close(Handle); + Handle = 0; +} + + + diff --git a/csrc/thirdparty/gb28181/include/librtsp.h b/csrc/thirdparty/gb28181/include/librtsp.h new file mode 100644 index 0000000..a2d5286 --- /dev/null +++ b/csrc/thirdparty/gb28181/include/librtsp.h @@ -0,0 +1,114 @@ +#if !defined(__LIB_RTSP_H__) +#define __LIB_RTSP_H__ + + +#define RTSP_ERR_OK 0 //成功 +//错误码 +#define RTSP_ERR_PARAM -1001 //参数错误 +#define RTSP_ERR_TIMEOUT -1002 //超时 +#define RTSP_ERR_OPTIONS -1003 //options 请求失败 +#define RTSP_ERR_DESCRIBE -1004 //describe请求失败 +#define RTSP_ERR_SETUP -1005 //setup请求失败 +#define RTSP_ERR_PLAY -1006 //play请求失败 +#define RTSP_ERR_PAUSE -1007 //pause请求失败 +#define RTSP_ERR_TEARDOWN -1008 //teardown请求失败 +#define RTSP_ERR_NO_MEMORY -1009 //申请内存失败 +#define RTSP_ERR_CONNECT -1010 //connect失败 +#define RTSP_ERR_INITPORT -1011 //初始化端口失败 + +//码流传输方式 +typedef enum +{ + E_STREAM_TRANS_UDP = 1, //UDP传输码流 + E_STREAM_TRANS_TCPACTIVE = 2, //GB28181 TCP主动 码流传输方式 TcpClient + E_STREAM_TRANS_TCPPASSIVE = 3, //GB28181 TCP被动 码流传输方式 TcpServer +}StreamTransType_E; + +//视频请求类型 +typedef enum +{ + E_VIDEO_REQUEST_REALPLAY = 1, //请求实时视频 + E_VIDEO_REQUEST_PLAYBACK = 2, //请求历史视频 + E_VIDEO_REQUEST_DOWNLOAD = 3, //历史视频下载 +}VideoRequestType_E; + +#define HIS_VIDEO_CTRL_PLAY 1 //点播播放控制 +#define HIS_VIDEO_CTRL_FAST 2 //点播快放控制 参数范围:1-32倍 +#define HIS_VIDEO_CTRL_SLOW 3 //点播慢放控制 参数范围:1-32倍 +#define HIS_VIDEO_CTRL_PAUSE 4 //点播暂停控制 +#define HIS_VIDEO_CTRL_JUMP 5 //点播跳转控制 参数范围:从开始计算跳转的时间 (时间单位:秒) + +// 码流回调的数据类型 +#define GB_VIDEO_STREAM_H264 0 +#define GB_VIDEO_STREAM_MPEG2 1 // MPEG4 +#define GB_VIDEO_STREAM_MPEG4 2 // MPEG4 +#define GB_VIDEO_STREAM_SVAC 3 // SVAC +#define GB_VIDEO_STREAM_3GP 4 // 3GP +#define GB_VIDEO_STREAM_H265 5 //H265 + +// 码流回调帧数据类型 I帧 P帧 目前只判断是否为I帧 +#define GB_VIDEO_FRAME_I 1 +#define GB_VIDEO_FRAME_P 2 + +//////////////////////////////////////////////////////////////////////////////// +// 函数名:码流回调函数 +// 描述: +// 参数:datatype:码流格式数据类型(H264 H265等) frametype:帧类型(I帧 P帧) +// datalen:长度 data:码流数据 userdata:用户指针 +// +// 返回值:会话句柄 +// 。 +// 说明: +// 保留原模块接口。 +//////////////////////////////////////////////////////////////////////////////// +typedef void (*PlayCallBack2)(int datatype, int frametype, unsigned char *data, unsigned int datalen, long userdata); + +#ifdef __cplusplus +extern "C"{ +#endif + +//////////////////////////////////////////////////////////////////////////////// +// 函数名:RTSPSTREAM_Open +// 描述:设置回调函数。 +// 参数:rtsp地址、 码流回调函数、用户指针 +// +// +// 返回值:会话句柄 +// 。 +// 说明: +// 保留原模块接口。 +//////////////////////////////////////////////////////////////////////////////// +long RTSPSTREAM_Open(const char *rtspurl, PlayCallBack2 streamcallback, long userdata); + +//////////////////////////////////////////////////////////////////////////////// +// 函数名:RTSPSTREAM_Contrl +// 描述:设置回调函数。 +// 参数:会话句柄, 控制类型, 控制参数 +// +// +// 返回值: +// 。 +// 说明: +// 保留原模块接口。 +//////////////////////////////////////////////////////////////////////////////// +long RTSPSTREAM_Contrl(long handle, int ctrltype, double ctrlparam); + +//////////////////////////////////////////////////////////////////////////////// +// 函数名:RTSPSTREAM_Close +// 描述:设置回调函数。 +// 参数:会话句柄 +// +// +// 返回值: +// 。 +// 说明: +// 保留原模块接口。 +//////////////////////////////////////////////////////////////////////////////// +long RTSPSTREAM_Close(long handle); + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/csrc/thirdparty/gb28181/lib/libStreamParse.so b/csrc/thirdparty/gb28181/lib/libStreamParse.so new file mode 100644 index 0000000..76b92b9 --- /dev/null +++ b/csrc/thirdparty/gb28181/lib/libStreamParse.so Binary files differ diff --git a/csrc/thirdparty/gb28181/lib/librtspclient.so b/csrc/thirdparty/gb28181/lib/librtspclient.so new file mode 100644 index 0000000..6757f0f --- /dev/null +++ b/csrc/thirdparty/gb28181/lib/librtspclient.so Binary files differ -- Gitblit v1.8.0