//
// Copyright © 2020 Arm Ltd and Contributors. All rights reserved.
// SPDX-License-Identifier: MIT
//
#pragma once

#include "Types.hpp"
#include "ArmnnNetworkExecutor.hpp"
#include "DetectedObject.hpp"
#include "IDetectionResultDecoder.hpp"
#include "NonMaxSuppression.hpp"

namespace od
{

class YoloResultDecoder : public IDetectionResultDecoder
{

public:
    /**
     * Constructs Yolo V3  inference reuslts decoder.
     *
     * @param NMSThreshold non max suppression threshold
     * @param ClsThreshold class probability threshold
     * @param ObjectThreshold detected object score threshold
     */
    YoloResultDecoder(float NMSThreshold, float ClsThreshold, float ObjectThreshold);

    DetectedObjects Decode(const InferenceResults& results,
                           const Size& outputFrameSize,
                           const Size& resizedFrameSize,
                           const std::vector <std::string>& labels) override;
private:
    float m_NmsThreshold;
    float m_ClsThreshold;
    float m_objectThreshold;

    unsigned int m_boxElements = 4U;
    unsigned int m_confidenceElements = 1U;
    unsigned int m_numClasses = 80U;
    unsigned int m_numBoxes = 2535U;
};
}// namespace od