提交 3279f8ba authored 作者: blu's avatar blu

version 0.1: record, upload, smart detection, qr and more

上级 69852f39
No preview for this file type
vendor/x64/lib/libuv.a filter=lfs diff=lfs merge=lfs -text
hi3518/libntp.a filter=lfs diff=lfs merge=lfs -text
vendor/hi3518/lib/libzmq.a filter=lfs diff=lfs merge=lfs -text
vendor/xm/lib/share/libhive_AEC.so filter=lfs diff=lfs merge=lfs -text
vendor/xm/lib/share/libhive_ANR.so filter=lfs diff=lfs merge=lfs -text
vendor/xm/lib/share/libsecurec.so filter=lfs diff=lfs merge=lfs -text
vendor/hi3518/lib/libXmMaQue.a filter=lfs diff=lfs merge=lfs -text
vendor/xm/lib/libXmMaQue.a filter=lfs diff=lfs merge=lfs -text
vendor/libuv/amd64_linux/lib/libuv.a filter=lfs diff=lfs merge=lfs -text
vendor/x64/lib/libavfilter.a filter=lfs diff=lfs merge=lfs -text
vendor/hi3518/lib/libuv.so filter=lfs diff=lfs merge=lfs -text
vendor/hi3518/lib/share/libhive_AEC.so filter=lfs diff=lfs merge=lfs -text
hi3518/libsmart.a filter=lfs diff=lfs merge=lfs -text
vendor/hi3518/lib/libfmt.a filter=lfs diff=lfs merge=lfs -text
vendor/x64/lib/libpostproc.a filter=lfs diff=lfs merge=lfs -text
vendor/xm/lib/libXmSns_50H20AI.a filter=lfs diff=lfs merge=lfs -text
vendor/hi3518/lib/share/libsecurec.so filter=lfs diff=lfs merge=lfs -text
vendor/xm/lib/share/libhive_AGC.so filter=lfs diff=lfs merge=lfs -text
vendor/xm/lib/share/libhive_EQ.so filter=lfs diff=lfs merge=lfs -text
vendor/xm/lib/share/libhive_HPF.so filter=lfs diff=lfs merge=lfs -text
vendor/hi3518/lib/libXmSns_50H20AI.a filter=lfs diff=lfs merge=lfs -text
vendor/x64/lib/libavcodec.a filter=lfs diff=lfs merge=lfs -text
vendor/xm/lib/share/libhive_common.so filter=lfs diff=lfs merge=lfs -text
vendor/x64/lib/libfmt.a filter=lfs diff=lfs merge=lfs -text
vendor/x64/lib/libspdlog.a filter=lfs diff=lfs merge=lfs -text
vendor/x64/lib/libswresample.a filter=lfs diff=lfs merge=lfs -text
vendor/x64/lib/libswscale.a filter=lfs diff=lfs merge=lfs -text
vendor/x64/lib/libx264.a filter=lfs diff=lfs merge=lfs -text
vendor/hi3518/lib/share/libhive_AGC.so filter=lfs diff=lfs merge=lfs -text
vendor/hi3518/lib/librtsp.a filter=lfs diff=lfs merge=lfs -text
vendor/libuv/dist/amd64_linux/lib/libuv.a filter=lfs diff=lfs merge=lfs -text
vendor/xm/lib/share/libhive_RES.so filter=lfs diff=lfs merge=lfs -text
vendor/lib/libuv.a filter=lfs diff=lfs merge=lfs -text
vendor/x64/lib/libavdevice.a filter=lfs diff=lfs merge=lfs -text
vendor/x64/lib/libavutil.a filter=lfs diff=lfs merge=lfs -text
vendor/hi3518/lib/share/libhive_HPF.so filter=lfs diff=lfs merge=lfs -text
vendor/hi3518/lib/share/libhive_common.so filter=lfs diff=lfs merge=lfs -text
vendor/hi3518/lib/libspdlog.a filter=lfs diff=lfs merge=lfs -text
vendor/hi3518/lib/libuv.a filter=lfs diff=lfs merge=lfs -text
vendor/x64/lib/libavformat.a filter=lfs diff=lfs merge=lfs -text
vendor/hi3518/lib/librtsp.so filter=lfs diff=lfs merge=lfs -text
vendor/hi3518/lib/share/libhive_ANR.so filter=lfs diff=lfs merge=lfs -text
vendor/hi3518/lib/share/libhive_EQ.so filter=lfs diff=lfs merge=lfs -text
vendor/hi3518/lib/share/libhive_record.so filter=lfs diff=lfs merge=lfs -text
vendor/xm/lib/share/libhive_record.so filter=lfs diff=lfs merge=lfs -text
hi3518/libtcp_client.a filter=lfs diff=lfs merge=lfs -text
vendor/libuv/build/libuv_a.a filter=lfs diff=lfs merge=lfs -text
vendor/xm/lib/libXmRtsp.a filter=lfs diff=lfs merge=lfs -text
vendor/hi3518/lib/share/libhive_RES.so filter=lfs diff=lfs merge=lfs -text
hi3518/libmotion.a filter=lfs diff=lfs merge=lfs -text
vendor/libuv/dist/hi3518/lib/libuv.a filter=lfs diff=lfs merge=lfs -text
vendor/hi3518/lib/libpaho-mqtt3c.so filter=lfs diff=lfs merge=lfs -text
vendor/hi3518/lib/libpaho-mqtt3a.so filter=lfs diff=lfs merge=lfs -text
vendor/x64/lib/libpaho-mqtt3c.so filter=lfs diff=lfs merge=lfs -text
vendor/x64/lib/libpaho-mqtt3a.so filter=lfs diff=lfs merge=lfs -text
vendor/libuv/amd64_linux/lib/libuv.so.1.0.0 filter=lfs diff=lfs merge=lfs -text
vendor/libuv/dist/amd64_linux/lib/libuv.so.1.0.0 filter=lfs diff=lfs merge=lfs -text
vendor/libuv/dist/hi3518/lib/libuv.so.1.0.0 filter=lfs diff=lfs merge=lfs -text
vendor/x64/lib/libuv.so.1.0.0 filter=lfs diff=lfs merge=lfs -text
vendor/hi3518/lib/libuv.so.1 filter=lfs diff=lfs merge=lfs -text
vendor/hi3518/lib/libuv.so.1.0.0 filter=lfs diff=lfs merge=lfs -text
vendor/lib/libuv.so.1.0.0 filter=lfs diff=lfs merge=lfs -text
...@@ -304,3 +304,14 @@ topic: evcamera/v1.0/response/<SN> ...@@ -304,3 +304,14 @@ topic: evcamera/v1.0/response/<SN>
``` ```
```json
{
"time":1567669674,
"cmd":"qr",
"rid":"001231554A20",
"data":{
"duration":20
}
}
```
# EVCamera 启动过程及运行时行为、接口
## 启动过程概览
```flow
st=>start: PowerOn
loadcfg=>operation: Load Local Configuration
videostream=>operation: Init SDK & Frame Callback
qr=>operation: start QR thread
checktime=>operation: Update NTP Time
gottime=>condition: Yes or No?
mqtt=>operation: Connect MQTT
mqttOK=>condition: OK?
ptz=>operation: relocate PTZ position
pusher=>operation: create pusher svc
record=>operation: create record svc
uploader=>operation: create upload svc
smart=>operation: create smart detection svc
watchdog=>operation: enable watchdog and feeding every 20s forever(33s deadline)
st->loadcfg->videostream->qr->checktime->gottime
mqtt->mqttOK->ptz->pusher->record->uploader->smart->watchdog
gottime(no)->checktime
gottime(yes)->mqtt
mqttOK(no)->mqtt
mqttOK(yes)->ptz
```
## 启动过程的可用的事实
- 在获取到NTP时间及连上MQTT Broker之前, PTZ重定位功能不会启动
安装、操作、维护人员可以根据重新上电后摄像头有没有转动判断是否联网.
* 没有联网之前QR识别功能是启用的
安装、操作、维护人员可以利用此事实进行离线配置WIFI、SN、MQTT
## 运行时行为和接口
### 机制
```mermaid
sequenceDiagram
participant EVCamera
participant Broker
participant CloudSvc
EVCamera ->> Broker: power_on: pub online
EVCamera ->> Broker: sub: /evcamera/v1.0/request/<SN>
CloudSvc ->> Broker: pub: cmd = config|status|upload_video|ptz|get_config|qr
Broker ->> EVCamera: notify: request {"rid":"<RID>", "cmd": "<x>", ...}
EVCamera ->> EVCamera: [Handle cmd]
EVCamera ->> Broker: pub /evcamera/v1.0/response/<RID>
EVCamera ->> Broker: pub /evcamera/v1.0/report
```
#### MQTT Broker topics
- 下发: /evcamera/v1.0/request/<SN>
- 请求响应: /evcamera/v1.0/response/<RID>
- 请求异常响应或主动上报: /evcamera/v1.0/report
#### 问题: 什么时候通过response topic 上报以及通过report topic 上报
#### 回答:
#### 1. 请求消息可能被从response topic 回复, 也可能被从report topic回复
其区别在于: 是否有效识别出来请求的内容及RID, 如果能识别出来则前者, 否则后者.
下面就是一个因请求内容不合法导致的异常, 能且只能响应到report topic上. (因无法识别出RID, 所以无法从response topic 响应)
```json
{
"category":"",
"code":2,
"msg":"exception: Unexpected non-whitespace character after JSON text at line 1 and column 10, \"time\": 1567669674, \"cmd\": \"status\", \"rid\": \"001231554A20\", \"data\": {} }",
"rid":"",
"sn":"012345678901",
"time":1592281836453,
"type":"report"
}
```
#### 2. 所有的主动上报都通过report topic
### 上线消息: 上电启动后(连接MQTT成功)自动发送
```json
topic: /evcamera/v1.0/report
payload:
{
"category":"online",
"code":0,
"data":{
},
"msg":"I'M ONLINE",
"rid":"",
"sn":"<SN>",
"time":1592276971163,
"type":"report"
}
```
### 实时状态查询接口
#### 请求:
```json
topic: /evcamera/v1.0/request/<SN>
payload:
{
"time": 1567669674,
"cmd": "status",
"rid": "<RID>",
"data": {}
}
```
#### 响应:
```
topic: /evcamera/v1.0/response/<RID>
payload:
{
"category":"status",
"code":0,
"data":{
"pusher":{
"msg":[
],
"val":0
},
"record":{
"capacity":4363,
"first":1592200334048,
"last":1592282028135,
"num":448
},
"sd":{
"MBTotal":29604,
"MBfree":27877
}
},
"msg":"OK",
"rid":"001231554A20",
"sn":"012345678901",
"time":1592282131155,
"type":"response"
}
```
##### 响应解读
1. data.pusher.val: pusher状态标志. 0: 正常, 比特0: 内部使用, 比特1置位: 连接视频网关VGW失败, 比特2置位: pusher未启用, 其他比特: 未定义
2. data.puser.msg = []: 当有异常时, 对应的异常可读字符描述
3. data.sd: 为空时说明未检测到SD卡;
4. data.sd.MBTotal: SD卡存储大小
5. data.sd.MBfree: 可用的SD卡存储大小
6. data.record.capacity: 以当前配置估算的可存储视频文件数目
7. data.record.first: 最旧的录像文件时间戳
8. data.record.last:最新的录像文件时间戳
9. data.record.num: 当前录像文件数目
##### 可利用的特性
平台或其他相关者可利用此接口返回超时, 判断摄像头是否在线 (建议超时时间: 2s)
### 配置接口
#### 请求
```
topic: /evcamera/v1.0/request/<SN>
{
"time": 1567669674,
"cmd": "config",
"rid": "<RID>",
"data": {
"sn": "A000000Z",
"vgw": "evcloudsvc.ilabservice.cloud:7123",
"mqtt": "admin:password@evcloudsvc.ilabservice.cloud:11883",
"upload": "evcloudsvc.ilabservice.cloud:10009",
"features": {
"push": 1,
"motion": {
"enabled": 1,
"region": {
"maxX": 1,
"maxY": 1,
"minX": 0,
"minY": 0
},
"level": 3
},
"recordLen": 30,
"ai":{
"enabled": 1,
"faceThresh": 0.75,
"humanThresh": 0.63,
"region": {
"maxX": 1,
"maxY": 1,
"minX": 0,
"minY": 0
}
}
}
}
}
```
#### 响应
- 正常响应:
```
topic: /evcamera/v1.0/response/<RID>
{
"time": ts,
"rid": "<RID>",
"type": "response",
"category": "config",
"sn": "<SN>",
"code": 0,
"msg": "OK",
"data": {
"vgw": "evcloudsvc.ilabservice.cloud:7123",
"mqtt": "admin:password@evcloudsvc.ilabservice.cloud:11883",
"upload": "evcloudsvc.ilabservice.cloud:10009",
"features": {
"push": 0,
"motion": {
"enabled": 1,
"region": {
"maxX": 1,
"maxY": 1,
"minX": 0,
"minY": 0
},
"level": 3 // 1 - 6
},
"recordLen": 30, // seconds of one slice of local recording
"ai":{
"enabled": 1,
"faceThresh": 0.75, // 0 - 1
"humanThresh": 0.63, // 0 - 1
"region": {
"maxX": 1,
"maxY": 1,
"minX": 0,
"minY": 0
}
}
}
}
}
```
- 异常响应:
### 获取视频接口
- 请求
```json
topic: /evcamera/v1.0/request/<SN>
{
"time": 1567669674,
"cmd": "upload_video",
"rid": "<RID>",
"data": {
"start": 1567669674,
"end": 1567668000,
"type": 6
}
}
```
- 响应
```json
topic: /evcamera/v1.0/response/<RID>
{
"time": 1567669674,
"type": "response",
"rid": "<RID>",
"cata": "upload_video",
"sn": "<SN>",
"code": 1,
"msg": "failed to upload video: file not exist",
"data":{
// empty
}
}
```
### 云台移动接口 PTZ
- 请求
```json
topic: /evcamera/v1.0/request/<SN>
{
"time":1567669674,
"cmd":"ptz",
"rid":"<RID>",
"data":{
"action":"left",
"degree":10
}
}
```
- 响应
```json
topic: /evcamera/v1.0/response/<RID>
{
"category": "ptz",
"code": 0,
"data": {
"horizontal": 149,
"vertical": 0
},
"msg": "OK",
"rid": "<RID>",
"sn": "<SN>",
"time": 1592284592684,
"type": "response"
}
```
### QR识别
- 请求
```
topic: /evcamera/v1.0/request/<SN>
{
"time":1567669674,
"cmd":"ptz",
"rid":"<RID>",
"data":{
"duration": 10
}
}
```
##### 解读
data.duration: 启用识别的最大时常, 单位为秒
退出QR识别状态的条件:
1. 识别超时
2. 当在duration时间内有任意一次识别成功
当设置duration = -1时, QR识别一直启动. 不建议开启(会影响其他任务)
当设置duration=0时, QR识别停止.
- 响应
命令本身无响应
../vendor/hi3518/lib/libXmMaQue-1080p.a filter=lfs diff=lfs merge=lfs -text
../vendor/hi3518/lib/libXmMaQue-origin.a filter=lfs diff=lfs merge=lfs -text
...@@ -203,6 +203,9 @@ ntp_LIB_DEPENDS:STATIC= ...@@ -203,6 +203,9 @@ ntp_LIB_DEPENDS:STATIC=
//Dependencies for target //Dependencies for target
ptz_LIB_DEPENDS:STATIC= ptz_LIB_DEPENDS:STATIC=
//Dependencies for target
qr_LIB_DEPENDS:STATIC=
//Dependencies for target //Dependencies for target
record_upload_LIB_DEPENDS:STATIC= record_upload_LIB_DEPENDS:STATIC=
......
...@@ -25,7 +25,14 @@ add_library(motion STATIC motion.cc) ...@@ -25,7 +25,14 @@ add_library(motion STATIC motion.cc)
add_library(smart STATIC smart.cc) add_library(smart STATIC smart.cc)
add_library(ptz STATIC ptz.cc) add_library(ptz STATIC ptz.cc)
add_library(record_upload STATIC record_upload.cc) add_library(record_upload STATIC record_upload.cc)
add_library(qr STATIC qr.cc jpgd.cpp ImageReaderSource.cpp) #jpg
#add_library(qr STATIC qr.cc jpgd.cpp PlanarYUVLuminanceSource.cpp) #yuv
add_executable(evcamera main.cc) add_executable(evcamera main.cc)
target_link_libraries(evcamera PUBLIC ntp paho-mqtt3a mqtthelper tcp_client evutils smart motion record_upload ptz zmq ${COMMON_LIBS} ${XM_LIBS}) target_link_libraries(evcamera PUBLIC ntp paho-mqtt3a mqtthelper tcp_client evutils
add_executable(test_fsm test_fsm.cc) smart motion record_upload ptz zmq qr zxing ${COMMON_LIBS} ${XM_LIBS})
\ No newline at end of file
#add_executable(test_fsm test_fsm.cc)
#add_executable(test_qr test_qr.cc)
#target_link_libraries(test_qr PUBLIC qr zxing ${COMMON_LIBS} ${XM_LIBS})
\ No newline at end of file
/*
* Copyright 2010-2011 ZXing authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "ImageReaderSource.h"
#include <zxing/common/IllegalArgumentException.h>
#include <iostream>
#include <sstream>
#include <cstdlib>
#include <algorithm>
#include "jpgd.h"
using std::string;
using std::ostringstream;
using zxing::Ref;
using zxing::ArrayRef;
using zxing::LuminanceSource;
inline char ImageReaderSource::convertPixel(char const* pixel_) const {
unsigned char const* pixel = (unsigned char const*)pixel_;
if (comps == 1 || comps == 2) {
// Gray or gray+alpha
return pixel[0];
} if (comps == 3 || comps == 4) {
// Red, Green, Blue, (Alpha)
// We assume 16 bit values here
// 0x200 = 1<<9, half an lsb of the result to force rounding
return (char)((306 * (int)pixel[0] + 601 * (int)pixel[1] +
117 * (int)pixel[2] + 0x200) >> 10);
} else {
throw zxing::IllegalArgumentException("Unexpected image depth");
}
}
ImageReaderSource::ImageReaderSource(ArrayRef<char> image_, int width, int height, int comps_)
: Super(width, height), image(image_), comps(comps_) {}
zxing::ArrayRef<char> ImageReaderSource::getRow(int y, zxing::ArrayRef<char> row) const {
const char* pixelRow = &image[0] + y * getWidth() * 4;
if (!row) {
row = zxing::ArrayRef<char>(getWidth());
}
for (int x = 0; x < getWidth(); x++) {
row[x] = convertPixel(pixelRow + (x * 4));
}
return row;
}
/** This is a more efficient implementation. */
zxing::ArrayRef<char> ImageReaderSource::getMatrix() const {
const char* p = &image[0];
zxing::ArrayRef<char> matrix(getWidth() * getHeight());
char* m = &matrix[0];
for (int y = 0; y < getHeight(); y++) {
for (int x = 0; x < getWidth(); x++) {
*m = convertPixel(p);
m++;
p += 4;
}
}
return matrix;
}
// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*-
#ifndef __IMAGE_READER_SOURCE_H_
#define __IMAGE_READER_SOURCE_H_
/*
* Copyright 2010-2011 ZXing authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <zxing/LuminanceSource.h>
class ImageReaderSource : public zxing::LuminanceSource {
private:
typedef LuminanceSource Super;
const zxing::ArrayRef<char> image;
const int comps;
char convertPixel(const char* pixel) const;
public:
static zxing::Ref<LuminanceSource> create(std::string const& filename);
ImageReaderSource(zxing::ArrayRef<char> image, int width, int height, int comps);
zxing::ArrayRef<char> getRow(int y, zxing::ArrayRef<char> row) const;
zxing::ArrayRef<char> getMatrix() const;
};
#endif /* __IMAGE_READER_SOURCE_H_ */
//
// Created by HailongHan on 16/9/15.
//
#include "PlanarYUVLuminanceSource.h"
#include <iostream>
namespace qrviddec {
PlanarYUVLuminanceSource::PlanarYUVLuminanceSource(ArrayRef<char> inYuvData,int inDataWidth,
int inDataHeight,int inLeft,int inTop,int inWidth,int inHeight,bool reverseHorizontals)
: LuminanceSource(inWidth,inHeight){
if (inLeft + inWidth > inDataWidth || inTop + inHeight > inDataHeight) {
throw "Crop rectangle does not fit within image data.";
}
yuvData = inYuvData;
dataWidth = inDataWidth;
dataHeight = inDataHeight;
left = inLeft;
top = inTop;
if (reverseHorizontals) {
reverseHorizontal(inWidth,inHeight);
}
}
PlanarYUVLuminanceSource::~PlanarYUVLuminanceSource(){
}
ArrayRef<char> PlanarYUVLuminanceSource::getRow(int y, ArrayRef<char> row) const {
if (y < 0 || y > getHeight()) {
throw "Requested row is outside the image:"+y;
}
int width = getWidth();
if (row.array_ == nullptr) {
char* p = new char[width];
ArrayRef<char> tmp(p, width);
row = tmp;
}
int offset = (y + top) * dataWidth + left;
//进行拷贝
for (int x = 0 ; x < width ; x ++){
row[x] = yuvData[offset + x];
}
return row;
}
ArrayRef<char> PlanarYUVLuminanceSource::getMatrix() const {
int width = getWidth();
int height = getHeight();
if (width == dataWidth && height == dataHeight) {
return yuvData;
}
int area = width * height;
ArrayRef<char> matrix(new char[area],area);
int inputOffset = top * dataWidth + left;
// If the width matches the full width of the underlying data, perform a single copy.
if (width == dataWidth) {
//进行拷贝
for (int x = 0 ; x < area ; x ++) {
matrix[x] = yuvData[inputOffset + x];
}
return matrix;
}
// Otherwise copy one cropped row at a time.
for (int y = 0; y < height; y++) {
int outputOffset = y * width;
for (int x = 0 ; x < width ; x++) {
matrix[outputOffset+x] = yuvData[inputOffset + x];
}
inputOffset += dataWidth;
}
return matrix;
}
bool PlanarYUVLuminanceSource::isCropSupported() const {
return true;
}
Ref<LuminanceSource> PlanarYUVLuminanceSource::crop(int inLeft, int inTop, int width, int height) const {
Ref<LuminanceSource> source(new PlanarYUVLuminanceSource(yuvData,dataWidth,dataHeight,left + inLeft,top + inTop,width,height,false));
return source;
}
void PlanarYUVLuminanceSource::reverseHorizontal(int width , int height) const {
ArrayRef<char> tempData = yuvData;
for (int y = 0, rowStart = top * dataWidth + left; y < height; y++, rowStart += dataWidth) {
int middle = rowStart + width / 2;
for (int x1 = rowStart, x2 = rowStart + width - 1; x1 < middle; x1++, x2--) {
unsigned char temp = tempData[x1];
tempData[x1] = tempData[x2];
tempData[x2] = temp;
}
}
return;
}
}
//
// Created by HailongHan on 16/9/15.
//
#ifndef ZXINGMAKE_PLANARYUVLUMINANCESOURCE_H
#define ZXINGMAKE_PLANARYUVLUMINANCESOURCE_H
#define THUMBNAIL_SCALE_FACTOR 2
#include <zxing/LuminanceSource.h>
using namespace zxing;
namespace qrviddec {
class PlanarYUVLuminanceSource : public LuminanceSource {
private :
ArrayRef<char> yuvData;
int dataWidth;
int dataHeight;
int left;
int top;
public:
PlanarYUVLuminanceSource(ArrayRef<char> yuvData,int dataWidth,int dataHeight,int left,int top,int width,int height,bool reverseHorizontal);
~PlanarYUVLuminanceSource();
ArrayRef<char> getRow(int y,ArrayRef<char> row) const;
ArrayRef<char> getMatrix() const;
bool isCropSupported() const;
Ref<LuminanceSource> crop(int left, int top, int width, int height) const;
void reverseHorizontal(int width,int height) const;
};
}
#endif //ZXINGMAKE_PLANARYUVLUMINANCESOURCE_H
#include "base_features.h"
#include <stdlib.h>
int ev_stop_record(ev_record_cfg_t **handle)
{
assert(handle != nullptr);
if(*handle != nullptr) {
free(*handle);
handle = nullptr;
}
}
int ev_start_record(const json &config, ev_record_cfg_t **handle)
{
assert(handle != nullptr);
*handle = (ev_record_cfg_t*)malloc(sizeof(ev_record_cfg_t));
//
}
\ No newline at end of file
#ifndef __BASE_FEATURES_H__
#define __BASE_FEATURES_H__
#include <jsoncons/json.hpp>
using namespace jsoncons;
typedef struct ev_record_status_t {
/// TODO:
} ev_record_status_t;
typedef struct ev_mdstatus_t {
/// TODO:
} ev_mdstatus_t;
typedef struct ev_ai_status_t {
/// TODO:
} ev_ai_status_t;
typedef struct ev_record_cfg {
} ev_record_cfg;
typedef struct ev_record_cfg_t {
} ev_record_cfg_t;
typedef struct ev_md_cfg_t {
} ev_md_cfg_t;
typedef struct ev_ai_cfg_t {
} ev_ai_cfg_t;
/// record
int ev_start_record(const json &config, ev_record_cfg_t **handle);
int ev_stop_record(ev_record_cfg_t **handle);
ev_record_status_t ev_get_record_status(ev_record_cfg_t **handle);
/// motion detect
int ev_start_md(const json &config, ev_md_cfg_t **handle);
int ev_stop_md(ev_md_cfg_t *handle);
ev_mdstatus_t ev_get_md_status(ev_md_cfg_t **handle);
/// ai detect
int ev_start_ai(const json &config, ev_ai_cfg_t **handle);
int ev_stop_ai(ev_ai_cfg_t **handle);
ev_ai_status_t ev_get_ai_status(ev_ai_cfg_t **handle);
#endif
\ No newline at end of file
差异被折叠。
...@@ -11,6 +11,8 @@ ...@@ -11,6 +11,8 @@
*/ */
#include "evutils.hpp" #include "evutils.hpp"
#include <sstream>
#include <vector>
using namespace std; using namespace std;
using namespace jsoncons; using namespace jsoncons;
...@@ -51,6 +53,7 @@ const string consts::kMsgCmdUploadVideo = "upload_video"; ...@@ -51,6 +53,7 @@ const string consts::kMsgCmdUploadVideo = "upload_video";
const string consts::kMsgCmdStatus = "status"; const string consts::kMsgCmdStatus = "status";
const string consts::kMsgCmdGetConfig = "get_config"; const string consts::kMsgCmdGetConfig = "get_config";
const string consts::kMsgCmdReboot = "reboot"; const string consts::kMsgCmdReboot = "reboot";
const string consts::kMsgCmdQR = "qr";
const string consts::kMsgCmdPtz = "ptz"; const string consts::kMsgCmdPtz = "ptz";
const string consts::kMsgType = "type"; const string consts::kMsgType = "type";
const string consts::kMsgTypeImage = "image"; const string consts::kMsgTypeImage = "image";
...@@ -256,17 +259,27 @@ int setupDealer(void **ctx, void **s, string ident, string addr, int sndQS, int ...@@ -256,17 +259,27 @@ int setupDealer(void **ctx, void **s, string ident, string addr, int sndQS, int
zmq_setsockopt(*s, ZMQ_RCVTIMEO, &timeoutMs, sizeof(timeoutMs)); zmq_setsockopt(*s, ZMQ_RCVTIMEO, &timeoutMs, sizeof(timeoutMs));
} }
// uint64_t hwm = 12;
// zmq_setsockopt(*s, ZMQ_SNDHWM, &hwm, sizeof(hwm));
// int onlyOne = 1;
// zmq_setsockopt(*s, ZMQ_CONFLATE, &onlyOne, sizeof(onlyOne));
ret = zmq_setsockopt(*s, ZMQ_IDENTITY, ident.c_str(), ident.size()); ret = zmq_setsockopt(*s, ZMQ_IDENTITY, ident.c_str(), ident.size());
if(ret < 0) { if(ret < 0) {
zmq_close(*s); zmq_close(*s);
zmq_ctx_destroy(*ctx); zmq_ctx_destroy(*ctx);
*s = nullptr;
*ctx = nullptr;
spdlog::debug("{} failed setsockopts ZMQ_ROUTING_ID to {}: {}", ident, addr, zmq_strerror(zmq_errno())); spdlog::debug("{} failed setsockopts ZMQ_ROUTING_ID to {}: {}", ident, addr, zmq_strerror(zmq_errno()));
} }
else { else {
ret = zmq_connect(*s, addr.c_str()); ret = zmq_connect(*s, addr.c_str());
if(ret != 0) { if(ret < 0) {
zmq_close(*s); zmq_close(*s);
zmq_ctx_destroy(*ctx); zmq_ctx_destroy(*ctx);
*s = nullptr;
*ctx = nullptr;
spdlog::error("{} failed connect dealer: {}", ident, addr); spdlog::error("{} failed connect dealer: {}", ident, addr);
} }
} }
...@@ -404,4 +417,16 @@ string load_json(json &config, string path, fn_mk_default_json mk) ...@@ -404,4 +417,16 @@ string load_json(json &config, string path, fn_mk_default_json mk)
return rc; return rc;
} }
vector<string> split(const string &s, char delim)
{
vector<string> result;
stringstream ss (s);
string item;
while (getline (ss, item, delim)) {
result.push_back (item);
}
return result;
}
} }
\ No newline at end of file
...@@ -15,6 +15,14 @@ ...@@ -15,6 +15,14 @@
#include <fmt/format.h> #include <fmt/format.h>
#include <jsoncons/json.hpp> #include <jsoncons/json.hpp>
enum EV_MSG_ERROR_CODE {
EV_MSG_ERROR_NONE,
EV_MSG_ERROR_INVALID_PARAM,
EV_MSG_ERROR_EXCEPTION,
EV_MSG_ERROR_UNSUPPORTED_CMD,
EV_MSG_ERROR_CONTENT_SYNTAX,
EV_MSG_ERROR_NUM
};
struct StrException : public std::exception { struct StrException : public std::exception {
std::string s; std::string s;
...@@ -54,6 +62,7 @@ typedef struct consts{ ...@@ -54,6 +62,7 @@ typedef struct consts{
static const string kMsgCmdStatus; static const string kMsgCmdStatus;
static const string kMsgCmdGetConfig; static const string kMsgCmdGetConfig;
static const string kMsgCmdReboot; static const string kMsgCmdReboot;
static const string kMsgCmdQR;
static const string kMsgCmdPtz; static const string kMsgCmdPtz;
static const string kMsgType; static const string kMsgType;
static const string kMsgTypeImage; static const string kMsgTypeImage;
...@@ -98,6 +107,7 @@ extern bool get_sdcard_megabytes(uint64_t &total, uint64_t &free, char* path = n ...@@ -98,6 +107,7 @@ extern bool get_sdcard_megabytes(uint64_t &total, uint64_t &free, char* path = n
extern int setupDealer(void **ctx, void **s, string ident, string addr, int sndQS=0, int timeoutMs = -1); extern int setupDealer(void **ctx, void **s, string ident, string addr, int sndQS=0, int timeoutMs = -1);
extern int setupRouter(void **ctx, void **s, string addr, int rcvQS=0); extern int setupRouter(void **ctx, void **s, string addr, int rcvQS=0);
extern int z_recv_multiple(void *s, vector<uint8_t> &buf, int &frames); extern int z_recv_multiple(void *s, vector<uint8_t> &buf, int &frames);
extern vector<string> split(const string &s, char delim);
template <typename T> template <typename T>
using cb_remove_elem = void(*)(T elem); using cb_remove_elem = void(*)(T elem);
...@@ -110,7 +120,7 @@ private: ...@@ -110,7 +120,7 @@ private:
mutex mut; mutex mut;
TN oldestTs; TN oldestTs;
int freeMB = 0; int freeMB = 0;
const int kReservedMB_ = 300; const int kReservedMB_ = 1000;
cb_remove_elem<TN> fn_remove; cb_remove_elem<TN> fn_remove;
unsigned long cntInsert = 0; unsigned long cntInsert = 0;
public: public:
...@@ -165,18 +175,21 @@ public: ...@@ -165,18 +175,21 @@ public:
list_.insert(itr.base(), elem); list_.insert(itr.base(), elem);
} }
if(list_.size() > maxSize||(freeMB != -1 && freeMB <= kReservedMB_)) { //if(list_.size() > maxSize||(freeMB != -1 && freeMB <= kReservedMB_)) {
if(freeMB <= kReservedMB_) {
lock_guard<mutex> lg(mut); lock_guard<mutex> lg(mut);
auto ts = *(list_.begin()); for(int i = 0; i < 10; i++){
list_.erase(list_.begin()); auto ts = *(list_.begin());
if(fn != nullptr) { list_.erase(list_.begin());
(*fn)(ts); if(fn != nullptr) {
} (*fn)(ts);
else if(fn_remove != nullptr) { }
(*fn_remove)(ts); else if(fn_remove != nullptr) {
} (*fn_remove)(ts);
else { }
// no callback available else {
// no callback available
}
} }
} }
} }
...@@ -220,7 +233,7 @@ public: ...@@ -220,7 +233,7 @@ public:
if(*itr <= tse) { if(*itr <= tse) {
if(found != 1) { if(found != 1) {
spdlog::info("\t matched : {}, s:{}, e:{}", *itr, tss, tse); spdlog::debug("\t matched : {}, s:{}, e:{}", *itr, tss, tse);
found = 1; found = 1;
// check the end offset, not guaranteed // check the end offset, not guaranteed
if( itr != list_.rbegin()) { if( itr != list_.rbegin()) {
......
差异被折叠。
...@@ -18,7 +18,8 @@ typedef struct ev_module_config_t { ...@@ -18,7 +18,8 @@ typedef struct ev_module_config_t {
struct module{ struct module{
struct record{ struct record{
int interval; // in seconds int interval; // in seconds
record(){interval = 120;} bool enabled;
record(){interval = 120; enabled = true;}
} record; } record;
struct ai{ struct ai{
ev_region_t region; ev_region_t region;
......
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
...@@ -74,10 +74,10 @@ void start_md_bd(ev_module_config_t *pArgs) ...@@ -74,10 +74,10 @@ void start_md_bd(ev_module_config_t *pArgs)
// TODO: params setting from args // TODO: params setting from args
mdParam.stMdParam.bEnabled = 1; mdParam.stMdParam.bEnabled = 1;
mdParam.stMdParam.x = 58; mdParam.stMdParam.x = pArgs->module.motion.region.minx * 352;
mdParam.stMdParam.y = 48; mdParam.stMdParam.y = pArgs->module.motion.region.miny * 288;
mdParam.stMdParam.w = 352 - 58*2; mdParam.stMdParam.w = (pArgs->module.motion.region.maxx - pArgs->module.motion.region.minx) * 352;
mdParam.stMdParam.h = 288 - 48*2; mdParam.stMdParam.h = (pArgs->module.motion.region.maxy - pArgs->module.motion.region.miny) * 288;
mdParam.stMdParam.eMdAlarmlevel = (MaQueMdAlarmLevel_e)pArgs->module.motion.level; // [1, 6] mdParam.stMdParam.eMdAlarmlevel = (MaQueMdAlarmLevel_e)pArgs->module.motion.level; // [1, 6]
bdParam.stBdParam.bEnabled = 1; bdParam.stBdParam.bEnabled = 1;
bdParam.stBdParam.eBdAlarmLevel = (MaQueBdAlarmLevel_e)pArgs->module.motion.level; bdParam.stBdParam.eBdAlarmLevel = (MaQueBdAlarmLevel_e)pArgs->module.motion.level;
......
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
#ifndef __EV_QR_H__
#define __EV_QR_H__
#include <string>
std::string qr_analysis(std::string &qr);
#endif
\ No newline at end of file
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
#ifndef __EV_TEST_COMMON_H__
#define __EV_TEST_COMMON_H__
#endif
\ No newline at end of file
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
No preview for this file type
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
qr-code-zxing @ 3e7f31b4
差异被折叠。
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论