Program Listing for File xf_hdrmerge.hpp

Return to documentation for file (/tmp/ws/src/vitis_common/include/imgproc/xf_hdrmerge.hpp)

/*
 * Copyright 2020 Xilinx, Inc.
 *
 * 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 _XF_HDRMERGE_HPP_
#define _XF_HDRMERGE_HPP_

#ifndef __cplusplus
#error C++ is needed to include this header
#endif

typedef unsigned short uint16_t;
typedef unsigned char uchar;

template <typename T>
T xf_satcast_hdr(int in_val){};

template <>
inline ap_uint<8> xf_satcast_hdr<ap_uint<8> >(int v) {
    return (v > 255 ? 255 : v);
};
template <>
inline ap_uint<10> xf_satcast_hdr<ap_uint<10> >(int v) {
    return (v > 1023 ? 1023 : v);
};
template <>
inline ap_uint<12> xf_satcast_hdr<ap_uint<12> >(int v) {
    return (v > 4095 ? 4095 : v);
};
template <>
inline ap_uint<16> xf_satcast_hdr<ap_uint<16> >(int v) {
    return (v > 65535 ? 65535 : v);
};

namespace xf {
namespace cv {

template <int SRC_T, int DST_T, int ROWS, int COLS, int NPC = 1, int NO_EXPS, int W_SIZE>
void Hdrmerge_bayer(xf::cv::Mat<SRC_T, ROWS, COLS, NPC>& _src_mat1,
                    xf::cv::Mat<SRC_T, ROWS, COLS, NPC>& _src_mat2,
                    xf::cv::Mat<SRC_T, ROWS, COLS, NPC>& _dst_mat,
                    short wr_hls[NO_EXPS * NPC * W_SIZE]) {
// clang-format off
    #pragma HLS ARRAY_PARTITION variable=wr_hls dim=1 block factor=NO_EXPS*NPC
// clang-format on
    unsigned short width = _src_mat1.cols >> XF_BITSHIFT(NPC);
    unsigned short height = _src_mat1.rows;

    int rdindex = 0;
    int wrindex = 0;
    const int STEP = XF_DTPIXELDEPTH(SRC_T, NPC);
    XF_TNAME(SRC_T, NPC) val_src1,val_src2;
    XF_TNAME(DST_T, NPC) val_dst;


    //FILE *fp1 = fopen("imagevals_hls.txt","w");
    for(int i = 0;i< height;i++){
// clang-format off
#pragma HLS LOOP_TRIPCOUNT min=ROWS max=ROWS
#pragma HLS LOOP_FLATTEN off
    // clang-format on
        for(int j=0;j< width;j++){
// clang-format off
#pragma HLS LOOP_TRIPCOUNT min=COLS/NPC max=COLS/NPC
#pragma HLS pipeline
            // clang-format on
            val_src1 = (_src_mat1.read(rdindex));
            val_src2 = (_src_mat2.read(rdindex++));

            for (int p = 0, n = 0; p < XF_NPIXPERCYCLE(NPC); p++, n = NO_EXPS * p) {
// clang-format off
#pragma HLS unroll
                // clang-format on
            XF_CTUNAME(SRC_T, NPC) val1 = val_src1.range(p * STEP + STEP - 1, p * STEP);
            XF_CTUNAME(SRC_T, NPC) val2 = val_src2.range(p * STEP + STEP - 1, p * STEP);

            int index1 = (n*W_SIZE)+val1;
            int index2 = ((n+1)*W_SIZE)+val2;

            short final_w1 =  (short)(wr_hls[index1]);
            short final_w2 =  (short)(wr_hls[index2]);

            ap_fixed<STEP+STEP*2,STEP+STEP> val_1 = (ap_fixed<STEP+STEP*2,STEP+STEP>)((float)(final_w1 * val1)/16384);
            ap_fixed<STEP+STEP*2,STEP+STEP> val_2 = (ap_fixed<STEP+STEP*2,STEP+STEP>)((float)(final_w2 * val2)/16384);

            ap_fixed<STEP+STEP*2,STEP+STEP> sum_wei = (ap_fixed<STEP+STEP*2,STEP+STEP>)((float)(final_w1+final_w2)/16384);

            int final_val = (int)((val_1+val_2) / sum_wei);

            XF_CTUNAME(SRC_T, NPC) out_val = xf_satcast_hdr<XF_CTUNAME(SRC_T, NPC)>(final_val);

            val_dst.range(p * STEP + STEP - 1, p * STEP) = out_val;

            }
            _dst_mat.write(wrindex++,(val_dst));
        }
        //fprintf(fp1,"\n");
    }
    //fclose(fp1);
}
} // namespace cv
} // namespace xf

#endif