| /* |
| * soft_blender_tasks_priv.h - soft blender tasks private class |
| * |
| * Copyright (c) 2017 Intel 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. |
| * |
| * Author: Wind Yuan <[email protected]> |
| */ |
| |
| #ifndef XCAM_SOFT_BLENDER_TASKS_PRIV_H |
| #define XCAM_SOFT_BLENDER_TASKS_PRIV_H |
| |
| #include <xcam_std.h> |
| #include <soft/soft_worker.h> |
| #include <soft/soft_image.h> |
| #include <soft/soft_blender.h> |
| |
| #define SOFT_BLENDER_ALIGNMENT_X 8 |
| #define SOFT_BLENDER_ALIGNMENT_Y 4 |
| |
| #define GAUSS_DOWN_SCALE_RADIUS 2 |
| #define GAUSS_DOWN_SCALE_SIZE ((GAUSS_DOWN_SCALE_RADIUS)*2+1) |
| |
| namespace XCam { |
| |
| namespace XCamSoftTasks { |
| |
| class GaussScaleGray |
| : public SoftWorker |
| { |
| public: |
| struct Args : SoftArgs { |
| SmartPtr<UcharImage> in_luma, out_luma; |
| }; |
| |
| public: |
| explicit GaussScaleGray (const char *name = "GaussScaleGray", const SmartPtr<Worker::Callback> &cb = NULL) |
| : SoftWorker (name, cb) |
| { |
| set_work_uint (2, 2); |
| } |
| |
| private: |
| virtual XCamReturn work_range (const SmartPtr<Arguments> &args, const WorkRange &range); |
| |
| protected: |
| void gauss_luma_2x2 ( |
| UcharImage *in_luma, UcharImage *out_luma, uint32_t x, uint32_t y); |
| |
| inline void multiply_coeff_y (float *out, const float *in, float coef) { |
| out[0] += in[0] * coef; |
| out[1] += in[1] * coef; |
| out[2] += in[2] * coef; |
| out[3] += in[3] * coef; |
| out[4] += in[4] * coef; |
| out[5] += in[5] * coef; |
| out[6] += in[6] * coef; |
| out[7] += in[7] * coef; |
| } |
| |
| template<typename T> |
| inline T gauss_sum (const T *input) { |
| return (input[0] * coeffs[0] + input[1] * coeffs[1] + input[2] * coeffs[2] + |
| input[3] * coeffs[3] + input[4] * coeffs[4]); |
| } |
| |
| protected: |
| static const float coeffs[GAUSS_DOWN_SCALE_SIZE]; |
| }; |
| |
| class GaussDownScale |
| : public GaussScaleGray |
| { |
| public: |
| struct Args : GaussScaleGray::Args { |
| SmartPtr<Uchar2Image> in_uv, out_uv; |
| const uint32_t level; |
| const SoftBlender::BufIdx idx; |
| |
| SmartPtr<VideoBuffer> in_buf; |
| SmartPtr<VideoBuffer> out_buf; |
| |
| Args ( |
| const SmartPtr<ImageHandler::Parameters> ¶m, |
| const uint32_t l, const SoftBlender::BufIdx i, |
| const SmartPtr<VideoBuffer> &in, |
| const SmartPtr<VideoBuffer> &out) |
| : level (l) |
| , idx (i) |
| , in_buf (in) |
| , out_buf (out) |
| { |
| set_param (param); |
| } |
| }; |
| |
| public: |
| explicit GaussDownScale (const SmartPtr<Worker::Callback> &cb) |
| : GaussScaleGray ("GaussDownScale", cb) |
| {} |
| |
| private: |
| virtual XCamReturn work_range (const SmartPtr<Arguments> &args, const WorkRange &range); |
| |
| inline void multiply_coeff_uv (Float2 *out, Float2 *in, float coef) { |
| out[0] += in[0] * coef; |
| out[1] += in[1] * coef; |
| out[2] += in[2] * coef; |
| out[3] += in[3] * coef; |
| out[4] += in[4] * coef; |
| } |
| }; |
| |
| class BlendTask |
| : public SoftWorker |
| { |
| public: |
| struct Args : SoftArgs { |
| SmartPtr<UcharImage> in_luma[2], out_luma; |
| SmartPtr<Uchar2Image> in_uv[2], out_uv; |
| SmartPtr<UcharImage> mask; |
| |
| SmartPtr<VideoBuffer> out_buf; |
| |
| Args ( |
| const SmartPtr<ImageHandler::Parameters> ¶m, |
| const SmartPtr<UcharImage> &m, |
| const SmartPtr<VideoBuffer> &out = NULL) |
| : SoftArgs (param) |
| , mask (m) |
| , out_buf (out) |
| {} |
| }; |
| |
| public: |
| explicit BlendTask (const SmartPtr<Worker::Callback> &cb) |
| : SoftWorker ("SoftBlendTask", cb) |
| { |
| set_work_uint (8, 2); |
| } |
| |
| private: |
| virtual XCamReturn work_range (const SmartPtr<Arguments> &args, const WorkRange &range); |
| }; |
| |
| class LaplaceTask |
| : public SoftWorker |
| { |
| public: |
| struct Args : SoftArgs { |
| SmartPtr<UcharImage> orig_luma, gauss_luma, out_luma; |
| SmartPtr<Uchar2Image> orig_uv, gauss_uv, out_uv; |
| const uint32_t level; |
| const SoftBlender::BufIdx idx; |
| |
| SmartPtr<VideoBuffer> out_buf; |
| |
| Args ( |
| const SmartPtr<ImageHandler::Parameters> ¶m, |
| const uint32_t l, const SoftBlender::BufIdx i, |
| const SmartPtr<VideoBuffer> &out = NULL) |
| : SoftArgs (param) |
| , level(l) |
| , idx (i) |
| , out_buf (out) |
| {} |
| }; |
| |
| public: |
| explicit LaplaceTask (const SmartPtr<Worker::Callback> &cb) |
| : SoftWorker ("SoftLaplaceTask", cb) |
| { |
| set_work_uint (8, 4); |
| } |
| |
| private: |
| virtual XCamReturn work_range (const SmartPtr<Arguments> &args, const WorkRange &range); |
| |
| void interplate_luma_8x2 ( |
| UcharImage *orig_luma, UcharImage *gauss_luma, UcharImage *out_luma, |
| uint32_t out_x, uint32_t out_y); |
| }; |
| |
| class ReconstructTask |
| : public SoftWorker |
| { |
| public: |
| struct Args : SoftArgs { |
| SmartPtr<UcharImage> gauss_luma, lap_luma[2], out_luma; |
| SmartPtr<Uchar2Image> gauss_uv, lap_uv[2], out_uv; |
| SmartPtr<UcharImage> mask; |
| const uint32_t level; |
| |
| SmartPtr<VideoBuffer> out_buf; |
| |
| Args ( |
| const SmartPtr<ImageHandler::Parameters> ¶m, |
| const uint32_t l, |
| const SmartPtr<VideoBuffer> &out = NULL) |
| : SoftArgs (param) |
| , level(l) |
| , out_buf (out) |
| {} |
| }; |
| |
| public: |
| explicit ReconstructTask (const SmartPtr<Worker::Callback> &cb) |
| : SoftWorker ("SoftReconstructTask", cb) |
| { |
| set_work_uint (8, 4); |
| } |
| |
| private: |
| virtual XCamReturn work_range (const SmartPtr<Arguments> &args, const WorkRange &range); |
| }; |
| |
| } |
| |
| } |
| |
| #endif //XCAM_SOFT_BLENDER_TASKS_PRIV_H |