• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * cl_image_360_stitch.h - CL Image 360 stitch
3  *
4  *  Copyright (c) 2016 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  */
20 
21 #ifndef XCAM_CL_IMAGE_360_STITCH_H
22 #define XCAM_CL_IMAGE_360_STITCH_H
23 
24 #include <xcam_std.h>
25 #include <interface/stitcher.h>
26 #include <interface/feature_match.h>
27 #include <ocl/cl_multi_image_handler.h>
28 #include <ocl/cl_fisheye_handler.h>
29 #include <ocl/cl_blender.h>
30 
31 namespace XCam {
32 
33 struct CLFisheyeParams {
34     SmartPtr<CLFisheyeHandler>  handler;
35     SmartPtr<BufferPool>        pool;
36     SmartPtr<VideoBuffer>       buf;
37 
38     uint32_t                    width;
39     uint32_t                    height;
40 
CLFisheyeParamsCLFisheyeParams41     CLFisheyeParams () : width (0), height (0) {}
42 };
43 
44 class CLImage360Stitch;
45 class CLBlenderGlobalScaleKernel
46     : public CLBlenderScaleKernel
47 {
48 public:
49     explicit CLBlenderGlobalScaleKernel (
50         const SmartPtr<CLContext> &context, SmartPtr<CLImage360Stitch> &stitch, bool is_uv);
51 
52 protected:
53     virtual SmartPtr<CLImage> get_input_image ();
54     virtual SmartPtr<CLImage> get_output_image ();
55     virtual bool get_output_info (uint32_t &out_width, uint32_t &out_height, int &out_offset_x);
56 
57 private:
58     SmartPtr<CLImage360Stitch>  _stitch;
59 };
60 
61 class CLImage360Stitch
62     : public CLMultiImageHandler
63 {
64 public:
65     explicit CLImage360Stitch (
66         const SmartPtr<CLContext> &context, CLBlenderScaleMode scale_mode, SurroundMode surround_mode,
67         StitchResMode res_mode, int fisheye_num, bool all_in_one_img);
68 
69     bool set_stitch_info (StitchInfo stitch_info);
70     StitchInfo get_stitch_info ();
set_output_size(uint32_t width,uint32_t height)71     void set_output_size (uint32_t width, uint32_t height) {
72         _output_width = width; //XCAM_ALIGN_UP (width, XCAM_BLENDER_ALIGNED_WIDTH);
73         _output_height = height;
74     }
75 
76     bool set_fisheye_handler (SmartPtr<CLFisheyeHandler> fisheye, int index);
77     bool set_blender (SmartPtr<CLBlender> blender, int idx);
78 
79     void set_fisheye_intrinsic (IntrinsicParameter intrinsic_param, int index);
80     void set_fisheye_extrinsic (ExtrinsicParameter extrinsic_param, int index);
81 
82     const BowlDataConfig &get_fisheye_bowl_config (int index = 0);
83 
84     bool set_image_overlap (const int idx, const Rect &overlap0, const Rect &overlap1);
get_image_overlap(int img_idx,int num)85     const Rect &get_image_overlap (int img_idx, int num) {
86         XCAM_ASSERT (img_idx < _fisheye_num && num < 2);
87         return _overlaps[img_idx][num];
88     }
89 
get_global_scale_input()90     SmartPtr<VideoBuffer> &get_global_scale_input () {
91         return _scale_global_input;
92     }
get_global_scale_output()93     SmartPtr<VideoBuffer> &get_global_scale_output () {
94         return _scale_global_output;
95     }
96 
97     void set_feature_match_ocl (bool use_ocl);
98 #if HAVE_OPENCV
99     void set_feature_match_config (const int idx, CVFMConfig config);
100     CVFMConfig get_feature_match_config (const int idx);
101 #endif
102 
103 protected:
104     virtual XCamReturn prepare_buffer_pool_video_info (const VideoBufferInfo &input, VideoBufferInfo &output);
105     virtual XCamReturn prepare_parameters (SmartPtr<VideoBuffer> &input, SmartPtr<VideoBuffer> &output);
106     virtual XCamReturn execute_done (SmartPtr<VideoBuffer> &output);
107 
108     XCamReturn ensure_fisheye_parameters (SmartPtr<VideoBuffer> &input, SmartPtr<VideoBuffer> &output);
109     XCamReturn prepare_local_scale_blender_parameters (
110         SmartPtr<VideoBuffer> &input0, SmartPtr<VideoBuffer> &input1, SmartPtr<VideoBuffer> &output, int idx, int idx_next);
111     XCamReturn prepare_global_scale_blender_parameters (
112         SmartPtr<VideoBuffer> &input0, SmartPtr<VideoBuffer> &input1, SmartPtr<VideoBuffer> &output,
113         int idx, int idx_next, int &cur_start_pos);
114 
115     bool create_buffer_pool (SmartPtr<BufferPool> &buf_pool, uint32_t width, uint32_t height);
116     XCamReturn reset_buffer_info (SmartPtr<VideoBuffer> &input);
117 
118     virtual XCamReturn sub_handler_execute_done (SmartPtr<CLImageHandler> &handler);
119 
120     void calc_fisheye_initial_info (SmartPtr<VideoBuffer> &output);
121     void update_image_overlap ();
122 
123 private:
124     XCAM_DEAD_COPY (CLImage360Stitch);
125 
126 private:
127     SmartPtr<CLContext>         _context;
128     CLFisheyeParams             _fisheye[XCAM_STITCH_FISHEYE_MAX_NUM];
129     SmartPtr<CLBlender>         _blender[XCAM_STITCH_FISHEYE_MAX_NUM];
130     SmartPtr<FeatureMatch>      _feature_match[XCAM_STITCH_FISHEYE_MAX_NUM];
131 
132     uint32_t                    _output_width;
133     uint32_t                    _output_height;
134     ImageMergeInfo              _img_merge_info[XCAM_STITCH_FISHEYE_MAX_NUM];
135     Rect                        _overlaps[XCAM_STITCH_FISHEYE_MAX_NUM][2];   // 2=>Overlap0 and overlap1
136 
137     CLBlenderScaleMode          _scale_mode;
138     SmartPtr<BufferPool>        _scale_buf_pool;
139     SmartPtr<VideoBuffer>       _scale_global_input;
140     SmartPtr<VideoBuffer>       _scale_global_output;
141 
142     SurroundMode                _surround_mode;
143     StitchResMode               _res_mode;
144 
145     bool                        _is_stitch_inited;
146     int                         _fisheye_num;
147     bool                        _all_in_one_img;
148     StitchInfo                  _stitch_info;
149 };
150 
151 SmartPtr<CLImageHandler>
152 create_image_360_stitch (
153     const SmartPtr<CLContext> &context,
154     bool need_seam = false,
155     CLBlenderScaleMode scale_mode = CLBlenderScaleLocal,
156     bool fisheye_map = false,
157     bool need_lsc = false,
158     SurroundMode surround_mode = SphereView,
159     StitchResMode res_mode = StitchRes1080P,
160     int fisheye_num = 2,
161     bool all_in_one_img = true);
162 
163 }
164 
165 #endif //XCAM_CL_IMAGE_360_STITCH_H
166