/*
 *  Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

#ifndef WEBRTC_MODULES_RTP_RTCP_SOURCE_TMMBR_HELP_H_
#define WEBRTC_MODULES_RTP_RTCP_SOURCE_TMMBR_HELP_H_

#include "typedefs.h"

#include "critical_section_wrapper.h"

#ifndef NULL
    #define NULL    0
#endif

namespace webrtc {
class TMMBRSet
{
public:
    TMMBRSet();
    ~TMMBRSet();

    void VerifyAndAllocateSet(WebRtc_UWord32 minimumSize);

    WebRtc_UWord32*   ptrTmmbrSet;
    WebRtc_UWord32*   ptrPacketOHSet;
    WebRtc_UWord32*   ptrSsrcSet;
    WebRtc_UWord32    sizeOfSet;
    WebRtc_UWord32    lengthOfSet;
};

class TMMBRHelp
{
public:
    TMMBRHelp(const bool audio);
    virtual ~TMMBRHelp();

    TMMBRSet* BoundingSet(); // used for debuging
    TMMBRSet* CandidateSet();
    TMMBRSet* BoundingSetToSend();

    TMMBRSet* VerifyAndAllocateCandidateSet(const WebRtc_UWord32 minimumSize);
    WebRtc_Word32 FindTMMBRBoundingSet(TMMBRSet*& boundingSet);
    WebRtc_Word32 SetTMMBRBoundingSetToSend(const TMMBRSet* boundingSetToSend,
                                          const WebRtc_UWord32 maxBitrateKbit);

    bool        IsOwner(const WebRtc_UWord32 ssrc,
                        const WebRtc_UWord32 length) const;

    WebRtc_Word32 CalcMinMaxBitRate(const WebRtc_UWord32 totalPacketRate,
                                  const WebRtc_UWord32 lengthOfBoundingSet,
                                  WebRtc_UWord32& minBitrateKbit,
                                  WebRtc_UWord32& maxBitrateKbit) const;

protected:
    TMMBRSet*   VerifyAndAllocateBoundingSet(WebRtc_UWord32 minimumSize);
    WebRtc_Word32 VerifyAndAllocateBoundingSetToSend(WebRtc_UWord32 minimumSize);

    WebRtc_Word32 FindTMMBRBoundingSet(WebRtc_Word32 numCandidates, TMMBRSet& candidateSet);

private:
    CriticalSectionWrapper* _criticalSection;
    const bool              _audio;
    TMMBRSet                _candidateSet;
    TMMBRSet                _boundingSet;
    TMMBRSet                _boundingSetToSend;

    float*                  _ptrIntersectionBoundingSet;
    float*                  _ptrMaxPRBoundingSet;
};
} // namespace webrtc

#endif // WEBRTC_MODULES_RTP_RTCP_SOURCE_TMMBR_HELP_H_
