xref: /OK3568_Linux_fs/external/camera_engine_rkaiq/rkaiq/ipc_server/MessageParser.hpp (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Copyright (c) 2019-2021 Rockchip Eletronics Co., Ltd.
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * Licensed under the Apache License, Version 2.0 (the "License");
5*4882a593Smuzhiyun  * you may not use this file except in compliance with the License.
6*4882a593Smuzhiyun  * You may obtain a copy of the License at
7*4882a593Smuzhiyun  *
8*4882a593Smuzhiyun  *      http://www.apache.org/licenses/LICENSE-2.0
9*4882a593Smuzhiyun  *
10*4882a593Smuzhiyun  * Unless required by applicable law or agreed to in writing, software
11*4882a593Smuzhiyun  * distributed under the License is distributed on an "AS IS" BASIS,
12*4882a593Smuzhiyun  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*4882a593Smuzhiyun  * See the License for the specific language governing permissions and
14*4882a593Smuzhiyun  * limitations under the License.
15*4882a593Smuzhiyun  */
16*4882a593Smuzhiyun 
17*4882a593Smuzhiyun #ifndef ___MESSAGE_PARSER_H__
18*4882a593Smuzhiyun #define ___MESSAGE_PARSER_H__
19*4882a593Smuzhiyun 
20*4882a593Smuzhiyun #include <stdlib.h>
21*4882a593Smuzhiyun #include <string.h>
22*4882a593Smuzhiyun 
23*4882a593Smuzhiyun #include <condition_variable>
24*4882a593Smuzhiyun #include <memory>
25*4882a593Smuzhiyun #include <mutex>
26*4882a593Smuzhiyun #include <thread>
27*4882a593Smuzhiyun #include <vector>
28*4882a593Smuzhiyun #include <atomic>
29*4882a593Smuzhiyun 
30*4882a593Smuzhiyun #define RKAIQ_SOCKET_DATA_EXTRA_SIZE 28
31*4882a593Smuzhiyun #define RKAIQ_SOCKET_DATA_OFFSET 24
32*4882a593Smuzhiyun #define RKAIQ_SOCKET_OLD_HEADER_LEN 2
33*4882a593Smuzhiyun #define RKAIQ_SOCKET_DATA_HEADER_LEN 4
34*4882a593Smuzhiyun #define RKAIQ_RAW_STREAM_MAX_SIZE (1024 * 512)
35*4882a593Smuzhiyun 
36*4882a593Smuzhiyun static const uint8_t RKAIQ_SOCKET_OLD_HEADER[2] = {'R', 'K'};
37*4882a593Smuzhiyun static const uint8_t RKAIQ_SOCKET_DATA_HEADER[4] = {'R', 0xAA, 0xFF, 'K'};
38*4882a593Smuzhiyun 
39*4882a593Smuzhiyun typedef enum __aiq_ipc_cmd_id {
40*4882a593Smuzhiyun   AIQ_IPC_CMD_UNKNOWN = -1,
41*4882a593Smuzhiyun   AIQ_IPC_CMD_WRITE = 0,
42*4882a593Smuzhiyun   AIQ_IPC_CMD_READ = 1,
43*4882a593Smuzhiyun } aiq_ipc_cmd_id;
44*4882a593Smuzhiyun 
45*4882a593Smuzhiyun typedef struct __RkAiqSocketPacket_s {
46*4882a593Smuzhiyun   unsigned char magic[2] = {'R', 'K'};
47*4882a593Smuzhiyun   unsigned char packetSize[4];
48*4882a593Smuzhiyun   int commandID;
49*4882a593Smuzhiyun   int commandResult;
50*4882a593Smuzhiyun   unsigned int dataSize;
51*4882a593Smuzhiyun   char *data;
52*4882a593Smuzhiyun   unsigned int dataHash;
53*4882a593Smuzhiyun } __attribute__((packed)) RkAiqSocketPacket;
54*4882a593Smuzhiyun 
55*4882a593Smuzhiyun typedef struct __RkAiqSocketPacket {
56*4882a593Smuzhiyun   uint8_t magic[4] = {'R', 0xAA, 0xFF, 'K'};
57*4882a593Smuzhiyun   int32_t cmd_id;
58*4882a593Smuzhiyun   int32_t cmd_ret;
59*4882a593Smuzhiyun   uint32_t sequence;
60*4882a593Smuzhiyun   uint32_t payload_size;
61*4882a593Smuzhiyun   uint32_t packet_size;
62*4882a593Smuzhiyun   uint8_t *data;
63*4882a593Smuzhiyun   uint32_t data_hash; // different offset in data stream
64*4882a593Smuzhiyun } __attribute__((packed)) RkAiqSocketPacket_t;
65*4882a593Smuzhiyun 
66*4882a593Smuzhiyun typedef enum __MessageType {
67*4882a593Smuzhiyun   RKAIQ_MESSAGE_UNKNOWN = -1,
68*4882a593Smuzhiyun   RKAIQ_MESSAGE_OLD,
69*4882a593Smuzhiyun   RKAIQ_MESSAGE_NEW,
70*4882a593Smuzhiyun } MessageType;
71*4882a593Smuzhiyun 
72*4882a593Smuzhiyun typedef int (*MessageCallBack)(void *, void *, MessageType type);
73*4882a593Smuzhiyun 
74*4882a593Smuzhiyun namespace RkMSG {
75*4882a593Smuzhiyun 
76*4882a593Smuzhiyun class MessageParser {
77*4882a593Smuzhiyun public:
78*4882a593Smuzhiyun   explicit MessageParser(void *ptr);
79*4882a593Smuzhiyun   ~MessageParser();
80*4882a593Smuzhiyun 
81*4882a593Smuzhiyun public:
82*4882a593Smuzhiyun   int pushRawData(const uint8_t *data, size_t size);
83*4882a593Smuzhiyun   size_t remainData();
84*4882a593Smuzhiyun   int reset();
85*4882a593Smuzhiyun   int start();
86*4882a593Smuzhiyun   int stop();
setMsgCallBack(MessageCallBack cbf)87*4882a593Smuzhiyun   int setMsgCallBack(MessageCallBack cbf) {
88*4882a593Smuzhiyun     mCallBackFunc = cbf;
89*4882a593Smuzhiyun     return 0;
90*4882a593Smuzhiyun   };
91*4882a593Smuzhiyun 
92*4882a593Smuzhiyun   static int freePacket(void *packet, MessageType type);
93*4882a593Smuzhiyun   static unsigned int MurMurHash(const void *key, int len);
94*4882a593Smuzhiyun 
95*4882a593Smuzhiyun private:
96*4882a593Smuzhiyun   void *pri;
97*4882a593Smuzhiyun   std::vector<uint8_t> raw_stream;
98*4882a593Smuzhiyun   std::mutex proc_mutex;
99*4882a593Smuzhiyun   std::condition_variable proc_cond;
100*4882a593Smuzhiyun   std::shared_ptr<std::thread> proc_thread;
101*4882a593Smuzhiyun   std::atomic<bool> is_running;
102*4882a593Smuzhiyun   MessageCallBack mCallBackFunc;
103*4882a593Smuzhiyun 
104*4882a593Smuzhiyun   int notify_wakeup();
105*4882a593Smuzhiyun   void process();
106*4882a593Smuzhiyun 
107*4882a593Smuzhiyun   uint8_t *bit_stream_find(uint8_t *data, int size, const uint8_t *dst,
108*4882a593Smuzhiyun                            int len);
109*4882a593Smuzhiyun 
110*4882a593Smuzhiyun   void *clonePacket(void *from, MessageType type);
111*4882a593Smuzhiyun   RkAiqSocketPacket_t *findValidSection(uint8_t *buffer, int len,
112*4882a593Smuzhiyun                                         size_t *start_of, size_t *end_of);
113*4882a593Smuzhiyun   RkAiqSocketPacket *findValidSection2(uint8_t *buffer, int len,
114*4882a593Smuzhiyun                                        size_t *start_of, size_t *end_of);
115*4882a593Smuzhiyun };
116*4882a593Smuzhiyun 
117*4882a593Smuzhiyun } // namespace RkMSG
118*4882a593Smuzhiyun 
119*4882a593Smuzhiyun #endif /*___MESSAGE_PARSER_H__*/
120