1 /*
2  * stitcher.h - stitcher interface
3  *
4  *  Copyright (c) 2017 Intel Corporation
5  *
6  * Licensed under the Apache License, Version 2.0 (the "License");
7  * you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at
9  *
10  *      http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  *
18  * Author: Wind Yuan <feng.yuan@intel.com>
19  * Author: Yinhang Liu <yinhangx.liu@intel.com>
20  */
21 
22 #ifndef XCAM_INTERFACE_STITCHER_H
23 #define XCAM_INTERFACE_STITCHER_H
24 
25 #include <xcam_std.h>
26 #include <interface/data_types.h>
27 #include <vector>
28 #include <video_buffer.h>
29 
30 #define XCAM_STITCH_FISHEYE_MAX_NUM    6
31 #define XCAM_STITCH_MAX_CAMERAS XCAM_STITCH_FISHEYE_MAX_NUM
32 #define XCAM_STITCH_MIN_SEAM_WIDTH 56
33 
34 #define INVALID_INDEX (uint32_t)(-1)
35 
36 namespace XCam {
37 
38 enum StitchResMode {
39     StitchRes1080P,
40     StitchRes1080P4,
41     StitchRes4K
42 };
43 
44 struct StitchInfo {
45     uint32_t merge_width[XCAM_STITCH_FISHEYE_MAX_NUM];
46 
47     ImageCropInfo crop[XCAM_STITCH_FISHEYE_MAX_NUM];
48     FisheyeInfo fisheye_info[XCAM_STITCH_FISHEYE_MAX_NUM];
49 
StitchInfoStitchInfo50     StitchInfo () {
51         xcam_mem_clear (merge_width);
52     }
53 };
54 
55 struct ImageMergeInfo {
56     Rect left;
57     Rect right;
58 };
59 
60 class Stitcher;
61 
62 struct CalibrationInfo {
63     ExtrinsicParameter extrinsic;
64     IntrinsicParameter intrinsic;
65 };
66 
67 struct CameraInfo {
68     CalibrationInfo   calibration;
69     float             round_angle_start;
70     float             angle_range;;
71 };
72 
73 class Stitcher
74 {
75 public:
76     struct RoundViewSlice {
77         float          hori_angle_start;
78         float          hori_angle_range;
79         uint32_t       width;
80         uint32_t       height;
81 
RoundViewSliceRoundViewSlice82         RoundViewSlice ()
83             : hori_angle_start (0.0f), hori_angle_range (0.0f)
84             , width (0), height (0)
85         {}
86     };
87 
88     struct CenterMark {
89         uint32_t slice_center_x;
90         uint32_t out_center_x;
CenterMarkCenterMark91         CenterMark ()
92             : slice_center_x (0)
93             , out_center_x (0)
94         {}
95     };
96 
97     struct ScaleFactor {
98         float left_scale;
99         float right_scale;
100 
ScaleFactorScaleFactor101         ScaleFactor ()
102             : left_scale (1.0f)
103             , right_scale (1.0f)
104         {}
105     };
106 
107     struct ImageOverlapInfo {
108         Rect left;
109         Rect right;
110         Rect out_area;
111     };
112 
113     struct CopyArea {
114         uint32_t in_idx;
115         Rect     in_area;
116         Rect     out_area;
117 
CopyAreaCopyArea118         CopyArea ()
119             : in_idx (INVALID_INDEX)
120         {}
121     };
122     typedef std::vector<CopyArea>  CopyAreaArray;
123 
124 public:
125     explicit Stitcher (uint32_t align_x, uint32_t align_y = 1);
126     virtual ~Stitcher ();
127     static SmartPtr<Stitcher> create_ocl_stitcher ();
128     static SmartPtr<Stitcher> create_soft_stitcher ();
129 
130     bool set_bowl_config (const BowlDataConfig &config);
get_bowl_config()131     const BowlDataConfig &get_bowl_config () {
132         return _bowl_config;
133     }
134     bool set_camera_num (uint32_t num);
get_camera_num()135     uint32_t get_camera_num () const {
136         return _camera_num;
137     }
138     bool set_camera_info (uint32_t index, const CameraInfo &info);
139     bool get_camera_info (uint32_t index, CameraInfo &info) const;
140 
141     bool set_crop_info (uint32_t index, const ImageCropInfo &info);
142     bool get_crop_info (uint32_t index, ImageCropInfo &info) const;
is_crop_info_set()143     bool is_crop_info_set () const {
144         return _is_crop_set;
145     }
146     //bool set_overlap_info (uint32_t index, const ImageOverlapInfo &info);
is_overlap_info_set()147     bool is_overlap_info_set () const {
148         return _is_overlap_set;
149     }
150 
151     //bool set_stitch_info (const StitchInfo &stitch_info);
set_output_size(uint32_t width,uint32_t height)152     void set_output_size (uint32_t width, uint32_t height) {
153         _output_width = width; //XCAM_ALIGN_UP (width, XCAM_BLENDER_ALIGNED_WIDTH);
154         _output_height = height;
155     }
156 
get_output_size(uint32_t & width,uint32_t & height)157     void get_output_size (uint32_t &width, uint32_t &height) const {
158         width = _output_width;
159         height = _output_height;
160     }
161     virtual XCamReturn stitch_buffers (const VideoBufferList &in_bufs, SmartPtr<VideoBuffer> &out_buf) = 0;
162 
163 protected:
164     XCamReturn estimate_round_slices ();
165     virtual XCamReturn estimate_coarse_crops ();
166     XCamReturn mark_centers ();
167     XCamReturn estimate_overlap ();
168     XCamReturn update_copy_areas ();
169 
get_center(uint32_t idx)170     const CenterMark &get_center (uint32_t idx) const {
171         return _center_marks[idx];
172     }
get_round_view_slice(uint32_t idx)173     const RoundViewSlice &get_round_view_slice (uint32_t idx) const {
174         return _round_view_slices[idx];
175     }
get_overlap(uint32_t idx)176     const ImageOverlapInfo &get_overlap (uint32_t idx) const {
177         return _overlap_info[idx];
178     }
get_crop(uint32_t idx)179     const ImageCropInfo &get_crop (uint32_t idx) const {
180         return _crop_info[idx];
181     }
get_copy_area()182     const CopyAreaArray &get_copy_area () const {
183         return _copy_areas;
184     }
185 
186 private:
187     XCAM_DEAD_COPY (Stitcher);
188 
189 protected:
190     ImageCropInfo               _crop_info[XCAM_STITCH_MAX_CAMERAS];
191     bool                        _is_crop_set;
192     //update after each feature match
193     ScaleFactor                 _scale_factors[XCAM_STITCH_MAX_CAMERAS];
194 
195 private:
196     uint32_t                    _alignment_x, _alignment_y;
197     uint32_t                    _output_width, _output_height;
198     float                       _out_start_angle;
199     uint32_t                    _camera_num;
200     CameraInfo                  _camera_info[XCAM_STITCH_MAX_CAMERAS];
201     RoundViewSlice              _round_view_slices[XCAM_STITCH_MAX_CAMERAS];
202     bool                        _is_round_view_set;
203 
204     ImageOverlapInfo            _overlap_info[XCAM_STITCH_MAX_CAMERAS];
205     BowlDataConfig              _bowl_config;
206     bool                        _is_overlap_set;
207 
208     //auto calculation
209     CenterMark                  _center_marks[XCAM_STITCH_MAX_CAMERAS];
210     bool                        _is_center_marked;
211     CopyAreaArray               _copy_areas;
212 };
213 
214 class BowlModel {
215 public:
216     typedef std::vector<PointFloat3> VertexMap;
217     typedef std::vector<PointFloat2> PointMap;
218     typedef std::vector<int32_t> IndexVector;
219 
220 public:
221     BowlModel (const BowlDataConfig &config, const uint32_t image_width, const uint32_t image_height);
222     bool get_max_topview_area_mm (float &length_mm, float &width_mm);
223     bool get_topview_rect_map (
224         PointMap &texture_points,
225         uint32_t res_width, uint32_t res_height,
226         float length_mm = 0.0f, float width_mm = 0.0f);
227 
228     bool get_stitch_image_vertex_model (
229         VertexMap &vertices, PointMap &texture_points, IndexVector &indeices,
230         uint32_t res_width, uint32_t res_height, float vertex_height);
231 
232     bool get_bowlview_vertex_model (
233         VertexMap &vertices, PointMap &texture_points, IndexVector &indeices,
234         uint32_t res_width, uint32_t res_height);
235 
236     bool get_topview_vertex_model (
237         VertexMap &vertices, PointMap &texture_points, IndexVector &indeices,
238         uint32_t res_width, uint32_t res_height);
239 
240 private:
241     BowlDataConfig    _config;
242     uint32_t          _bowl_img_width, _bowl_img_height;
243     float             _max_topview_width_mm;
244     float             _max_topview_length_mm;
245 };
246 
247 }
248 
249 #endif //XCAM_INTERFACE_STITCHER_H
250