/* * Copyright (c) 2019-2021 Rockchip Eletronics Co., Ltd. * * 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. */ #ifndef ___MESSAGE_PARSER_H__ #define ___MESSAGE_PARSER_H__ #include #include #include #include #include #include #include #include #define RKAIQ_SOCKET_DATA_EXTRA_SIZE 28 #define RKAIQ_SOCKET_DATA_OFFSET 24 #define RKAIQ_SOCKET_OLD_HEADER_LEN 2 #define RKAIQ_SOCKET_DATA_HEADER_LEN 4 #define RKAIQ_RAW_STREAM_MAX_SIZE (1024 * 512) static const uint8_t RKAIQ_SOCKET_OLD_HEADER[2] = {'R', 'K'}; static const uint8_t RKAIQ_SOCKET_DATA_HEADER[4] = {'R', 0xAA, 0xFF, 'K'}; typedef enum __aiq_ipc_cmd_id { AIQ_IPC_CMD_UNKNOWN = -1, AIQ_IPC_CMD_WRITE = 0, AIQ_IPC_CMD_READ = 1, } aiq_ipc_cmd_id; typedef struct __RkAiqSocketPacket_s { unsigned char magic[2] = {'R', 'K'}; unsigned char packetSize[4]; int commandID; int commandResult; unsigned int dataSize; char *data; unsigned int dataHash; } RkAiqSocketPacket; #pragma pack() typedef struct __RkAiqSocketPacket { uint8_t magic[4] = {'R', 0xAA, 0xFF, 'K'}; int32_t cmd_id; int32_t cmd_ret; uint32_t sequence; uint32_t payload_size; uint32_t packet_size; uint8_t *data; uint32_t data_hash; // different offset in data stream } RkAiqSocketPacket_t; #pragma pack() typedef enum __MessageType { RKAIQ_MESSAGE_UNKNOWN = -1, RKAIQ_MESSAGE_OLD, RKAIQ_MESSAGE_NEW, } MessageType; typedef int (*MessageCallBack)(void *, void *, MessageType type); namespace RkMSG { class MessageParser { public: explicit MessageParser(); explicit MessageParser(void *ptr) { pri = ptr; }; ~MessageParser(); public: int pushRawData(const uint8_t *data, size_t size); size_t remainData(); int reset(); int start(); int stop(); int setMsgCallBack(MessageCallBack cbf) { mCallBackFunc = cbf; return 0; }; static int freePacket(void *packet, MessageType type); static unsigned int MurMurHash(const void *key, int len); private: void *pri; std::vector raw_stream; std::mutex proc_mutex; std::condition_variable proc_cond; std::shared_ptr proc_thread; std::atomic is_running; MessageCallBack mCallBackFunc; int notify_wakeup(); void process(); uint8_t *bit_stream_find(uint8_t *data, int size, const uint8_t *dst, int len); void *clonePacket(void *from, MessageType type); RkAiqSocketPacket_t *findValidSection(uint8_t *buffer, int len, size_t *start_of, size_t *end_of); RkAiqSocketPacket *findValidSection2(uint8_t *buffer, int len, size_t *start_of, size_t *end_of); }; } // namespace RkMSG #endif /*___MESSAGE_PARSER_H__*/