xuxiuxi
2017-04-20 d2f697fa887e28b86d38332e2fbde930c54fb43f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
#include <MaterialBuffer.h>
#include <logger.h>
 
#include "ev_server.h" 
#include "ev_proto.h"
#include "face_daemon_proto.h"
 
#include <PbFaceList.pb.h>
 
#include <signal.h>
 
#include <sstream>
#include <iostream>
 
Logger g_logger(std::cout);
 
evclient_proc_t evclient_proc;
 
void _sigint(int sign_no)
{
    server_stop();
}
 
bool send_SensetimeFaceDetectResultJson(EVClientStub& client, const fdr_vec_t& result)
{
    std::stringstream ss;
    ss << "{" << std::endl;
    ss << "\"ret\":" << 0 << "," << std::endl;
    ss << "\"count\":" << result.size() << "," << std::endl;
    ss << "\"result\":[";
    for(fdr_vec_t::const_iterator iter = result.begin(); iter != result.end(); ++iter)
    {
        ss << "[" << iter->db_id << "," << iter->st_id << "]";
        if (iter != std::prev(result.end()))
            ss << ",";
    }
    ss << "]" << std::endl;
    ss << "}";
 
    std::string output(ss.str());//#todo avoid copy
    client.sendBuffSize = output.size() + 1;
    client.sendBuff = new uint8_t[client.sendBuffSize];
    strcpy((char*)client.sendBuff, output.c_str());
    client.deleteSendBuff = true;
    
    LOG_DEBUG << (char*)client.sendBuff << LOG_ENDL;
 
    return true;
}
 
bool ev_proc_SensetimeFaceDetectPB(EVClientStub& client)
{
    //#test send //00038300FE4B0000+pb
    //EVPHeader* evpHeader = (EVPHeader*)client.recvBuff;
    //LOG_DEBUG << "cmd=" << evpHeader->cmd << ", size=" << evpHeader->size << ", \t" << (char*)(evpHeader + sizeof(EVPHeader)) << std::endl;
    //return true;
    
    EVPHeader* evpHeader = (EVPHeader*)client.recvBuff;
    
    PbFaceList pbFaceList;
    pbFaceList.ParseFromArray(client.recvBuff + sizeof(EVPHeader), evpHeader->size - sizeof(EVPHeader));
    LOGP(DEBUG, "pbFaceList: magic=%u, image_count=%u, src_width=%u, src_height=%u", 
        pbFaceList.magic(), pbFaceList.image_count(), pbFaceList.src_width(), pbFaceList.src_height());
 
    for(int i = 0; i < pbFaceList.image_count(); i++)
    {
        const PbFaceList_FaceListImage& pbFaceListImage = pbFaceList.images(i);
        LOGP(DEBUG, "\tpbFaceList %d: idx=%u, size=%u, type=%u, width=%u, height=%u, top_left_x=%u, top_left_y=%u", 
            i, pbFaceListImage.idx(), pbFaceListImage.size(), pbFaceListImage.type(), pbFaceListImage.width(), pbFaceListImage.height(), pbFaceListImage.top_left_x(), pbFaceListImage.top_left_y());
            
        char imgfn[100 * 1024];
        sprintf(imgfn, "PB_%d_%d.yuv", 0, i);
 
        FILE * pFile = fopen(imgfn, "wb");
        fwrite(*(pbFaceListImage.img().data()), sizeof(char), pbFaceListImage.size(), pFile);
        fclose(pFile);
        pFile = nullptr;
    }
        
        
    fdr_vec_t result;
    
    //do detect(client)
    result.push_back(FDP_FaceDetectResult(-1,123));
    result.push_back(FDP_FaceDetectResult(2,456));
    result.push_back(FDP_FaceDetectResult(0,0));
    
    send_SensetimeFaceDetectResultJson(client, result);
 
    return false;
}
 
bool ev_dispatcher_proto_pb(EVClientStub& client)
{
    LOG_DEBUG << "ev_dispatcher_proto_pb" << LOG_ENDL;
    
    EVPHeader* evpHeader = (EVPHeader*)client.recvBuff;
    if (evpHeader->size != client.recvBuffSize)
    {
        LOG_WARN << "Truncated buffer " << (evpHeader->size - client.recvBuffSize) << " bytes" << std::endl;
        return false;
    }
 
    switch(evpHeader->cmd)
    {
    case FaceDaemonCommand::FDC_SENSETIMEFACEDETECT_PB:
        //000383000800000001
        return ev_proc_SensetimeFaceDetectPB(client);
    break;
    default:
        LOG_WARN << "Unknown command" << std::endl;
        ev_send_status_packet(client, EVPStatus::EVPS_COMMAND_ERROR);
        return false;
    break;
    }
    
    // return false to disconnect
    return false;
}
 
bool ev_dispatcher_proto(EVClientStub& client)
{
    LOG_DEBUG << "ev_dispatcher_proto" << LOG_ENDL;
    
    EVPHeader* evpHeader = (EVPHeader*)client.recvBuff;
    if (evpHeader->size != client.recvBuffSize)
    {
        LOG_WARN << "Truncated buffer " << (evpHeader->size - client.recvBuffSize) << " bytes" << std::endl;
        return false;
    }
 
    switch(evpHeader->proto)
    {
    case EVPProto::EVPP_PROTOBUF:
        return ev_dispatcher_proto_pb(client);
    break;
    default:
        LOG_WARN << "Unknown proto" << std::endl;
        ev_send_status_packet(client, EVPStatus::EVPS_PROTO_ERROR);
        return false;
    break;
    }
    
    // return false to disconnect
    return false;
}
 
int main(int argc, char** argv)
{
    g_logger.set_level(VERBOSE);
    
    signal(SIGINT, _sigint);
 
    evclient_proc = ev_dispatcher_proto;
    return server_main(argc, argv);
}