hc
2023-12-09 b22da3d8526a935aa31e086e63f60ff3246cb61c
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
 
 
/*
 * MessageBus.h
 *
 *  Copyright (c) 2019 Rockchip Corporation
 *
 * 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 _RK_AIQ_ANALYZE_GROUP_MANAGER_
#define _RK_AIQ_ANALYZE_GROUP_MANAGER_
 
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
 
#include <functional>
#include <map>
 
#include "MessageBus.h"
#include "RkAiqCore.h"
#include "RkAiqSharedDataManager.h"
#include "rk_aiq_algo_types_int.h"
#include "rk_aiq_comm.h"
#include "rk_aiq_pool.h"
#include "video_buffer.h"
#include "xcam_std.h"
#include "xcam_thread.h"
 
// using namespace XCam;
namespace RkCam {
 
class RkAiqAnalyzeGroupManager;
class RkAiqCore;
class RkAiqAnalyzeGroupMsgHdlThread;
 
// TODO(Cody): This is just workaround for current implementation
//using MessageHandleWrapper = std::function<XCamReturn(const std::list<SmartPtr<XCamMessage>>&)>;
typedef std::function<XCamReturn(std::list<SmartPtr<XCamMessage>>&, uint32_t&)> MessageHandleWrapper;
 
class RkAiqAnalyzerGroup {
 public:
    struct GroupMessage {
        std::list<SmartPtr<XCamMessage>> msgList;
        uint64_t msg_flags;
    };
 
    RkAiqAnalyzerGroup(RkAiqCore* aiqCore, enum rk_aiq_core_analyze_type_e type,
                       const uint64_t flag, const RkAiqGrpConditions_t* grpConds);
    virtual ~RkAiqAnalyzerGroup() = default;
 
    void setConcreteHandler(const MessageHandleWrapper handler) { mHandler = handler; }
    XCamReturn start();
    bool pushMsg(const SmartPtr<XCamMessage>& msg);
    XCamReturn msgHandle(const SmartPtr<XCamMessage>& msg);
    XCamReturn stop();
 
    const rk_aiq_core_analyze_type_e getType() const { return mGroupType; }
    const uint64_t getDepsFlag() const { return mDepsFlag; }
 
 private:
    void msgReduction(std::map<uint32_t, GroupMessage>& msgMap);
    int8_t getMsgDelayCnt(XCamMessageType &msg_id);
 
    // TODO(Cody): use weak ptr
    RkAiqCore* mAiqCore;
    const rk_aiq_core_analyze_type_e mGroupType;
    const uint64_t mDepsFlag;
    RkAiqGrpConditions_t mGrpConds;
    SmartPtr<RkAiqAnalyzeGroupMsgHdlThread> mRkAiqGroupMsgHdlTh;
    std::map<uint32_t, GroupMessage> mGroupMsgMap;
    MessageHandleWrapper mHandler;
};
 
class RkAiqAnalyzeGroupMsgHdlThread : public Thread {
 public:
    RkAiqAnalyzeGroupMsgHdlThread(const std::string name, RkAiqAnalyzerGroup* group)
        : Thread(name.c_str()), mRkAiqAnalyzerGroup(group){};
    ~RkAiqAnalyzeGroupMsgHdlThread() { mMsgsQueue.clear(); };
 
    void triger_stop() { mMsgsQueue.pause_pop(); };
 
    void triger_start() {
        mMsgsQueue.clear();
        mMsgsQueue.resume_pop();
    };
 
    bool push_msg(const SmartPtr<XCamMessage>& buffer) {
        mMsgsQueue.push(buffer);
        return true;
    };
 
 protected:
    // virtual bool started ();
    virtual void stopped() { mMsgsQueue.clear(); };
 
    virtual bool loop();
 
 private:
    RkAiqAnalyzerGroup* mRkAiqAnalyzerGroup;
    SafeList<XCamMessage> mMsgsQueue;
};
 
class RkAiqAnalyzeGroupManager {
 public:
    RkAiqAnalyzeGroupManager(RkAiqCore* aiqCore);
    virtual ~RkAiqAnalyzeGroupManager(){};
 
    void parseAlgoGroup(const struct RkAiqAlgoDesCommExt* algoDes);
 
    XCamReturn start();
    XCamReturn stop();
 
    XCamReturn handleMessage(const SmartPtr<XCamMessage> &msg);
    std::list<int>& getGroupAlgoList(rk_aiq_core_analyze_type_e group) {
        return mGroupAlgoListMap[group];
    }
 protected:
    XCamReturn measGroupMessageHandler(std::list<SmartPtr<XCamMessage>>& msgs, uint32_t& id);
    XCamReturn otherGroupMessageHandler(std::list<SmartPtr<XCamMessage>>& msgs, uint32_t& id);
    XCamReturn amdGroupMessageHandler(std::list<SmartPtr<XCamMessage>>& msgs, uint32_t& id);
    XCamReturn thumbnailsGroupMessageHandler(std::list<SmartPtr<XCamMessage>>& msgs, uint32_t& id);
    XCamReturn lscGroupMessageHandler(std::list<SmartPtr<XCamMessage>>& msgs, uint32_t& id);
    XCamReturn aeGroupMessageHandler(std::list<SmartPtr<XCamMessage>>& msgs, uint32_t& id);
    XCamReturn awbGroupMessageHandler(std::list<SmartPtr<XCamMessage>>& msgs, uint32_t& id);
    XCamReturn amfnrGroupMessageHandler(std::list<SmartPtr<XCamMessage>>& msgs, uint32_t& id);
    XCamReturn aynrGroupMessageHandler(std::list<SmartPtr<XCamMessage>>& msgs, uint32_t& id);
    XCamReturn grp0MessageHandler(std::list<SmartPtr<XCamMessage>>& msgs, uint32_t& id);
    XCamReturn grp1MessageHandler(std::list<SmartPtr<XCamMessage>>& msgs, uint32_t& id);
    XCamReturn afMessageHandler(std::list<SmartPtr<XCamMessage>>& msgs, uint32_t& id);
    XCamReturn eisGroupMessageHandler(std::list<SmartPtr<XCamMessage>>& msgs, uint32_t& id);
    XCamReturn orbGroupMessageHandler(std::list<SmartPtr<XCamMessage>>& msgs, uint32_t& id);
 
 private:
    RkAiqCore* mAiqCore;
    std::map<uint64_t, SmartPtr<RkAiqAnalyzerGroup>> mGroupMap;
    std::map<uint64_t, std::list<int>> mGroupAlgoListMap;
};
 
}  // namespace RkCam
 
#endif  // _RK_AIQ_ANALYZE_GROUP_MANAGER_