// VBRビットレートを係数方式で算出
// 詳細は「容量計算ツール_SmartCoding対応データシート_v026_20230609.xlsx」
// シート「計算式_係数_符号量」「ビットレート算出シート」を参照
//
function VbrCalcCoefMethod(model, codec, s_reso, qual, ips, loc, sctype, s_sc, s_sc_face, ill, move) {
    var bitrate = 0;
    var location = vbrScn_In_BuildingEntrance;

    // SmartCoding(GOP Control)と SmartCodingFace(SmartVIQS/AUTO-VIQS) の文字列から該当Indexを取得 
    var sc_idx = getSmartCodingIndex(s_sc);
    var scface_idx = getSmartCodingFaceIndex(sctype, s_sc_face);

    // 各種係数(ref, sviqs, adv)を取得
    var coefidx = getVBRCoefListIdx(sc_idx, scface_idx, move);
    var ref = VBRCoefList[coefidx].ref;
    var sviqs = VBRCoefList[coefidx].sviqs;
    var adv = VBRCoefList[coefidx].adv;

    if ( sviqs == gSviqsExtra) {
        // ④SmartVIQS用係数を使用
        sviqs = vbr_coefficient_SVIQS[move][ips];
    }

    if ( adv == gAdvExtra ) {
        // ⑤OFFに対するAdvanced用係数を使用
        adv = vbr_coefficient_Adv[move][qual][ips];
    }

    location = vbrCamInfTable[model][vbrCamInfTable_SceneList][loc];
    // シーンが「Indoor-fisheye」で、かつ1:1解像度の場合、参照シーンを「Indoor-fisheye_fisheye」に変更する。
    if (( location == vbrScn_In_fisheye ) && (isReso1to1Ratio(s_reso) == 1)) {
        location = vbrScn_In_fisheye_fisheye;
    }

    // 各シーンの1080Pの符号量① を取得
    var ipic = 0;
    var ppic = 0;
    if ( codec == vbr_h265 ) {
        // H.265
        if (ill == 0) {
            // 通常照度
            if (move == 0) {
                // 動きなし
                ipic = vbr_bitratelist_h265[location][IsLowReso(s_reso)][qual].stil_norm_ipic;
                ppic = vbr_bitratelist_h265[location][IsLowReso(s_reso)][qual].stil_norm_ppic;
            } else {
                // 動きあり
                ipic = vbr_bitratelist_h265[location][IsLowReso(s_reso)][qual].move_norm_ipic;
                ppic = vbr_bitratelist_h265[location][IsLowReso(s_reso)][qual].move_norm_ppic;
            }
        } else {
            // 低照度
            if (move == 0) {
                // 動きなし
                ipic = vbr_bitratelist_h265[location][IsLowReso(s_reso)][qual].stil_low_ipic;
                ppic = vbr_bitratelist_h265[location][IsLowReso(s_reso)][qual].stil_low_ppic;
            } else {
                // 動きあり
                ipic = vbr_bitratelist_h265[location][IsLowReso(s_reso)][qual].move_low_ipic;
                ppic = vbr_bitratelist_h265[location][IsLowReso(s_reso)][qual].move_low_ppic;
            }
        }
    } else {
        // H.264
        if (ill == 0) {
            // 通常照度
            if (move == 0) {
                // 動きなし
                ipic = vbr_bitratelist_h264[location][IsLowReso(s_reso)][qual].stil_norm_ipic;
                ppic = vbr_bitratelist_h264[location][IsLowReso(s_reso)][qual].stil_norm_ppic;
            } else {
                // 動きあり
                ipic = vbr_bitratelist_h264[location][IsLowReso(s_reso)][qual].move_norm_ipic;
                ppic = vbr_bitratelist_h264[location][IsLowReso(s_reso)][qual].move_norm_ppic;
            }
        } else {
            // 低照度
            if (move == 0) {
                // 動きなし
                ipic = vbr_bitratelist_h264[location][IsLowReso(s_reso)][qual].stil_low_ipic;
                ppic = vbr_bitratelist_h264[location][IsLowReso(s_reso)][qual].stil_low_ppic;
            } else {
                // 動きあり
                ipic = vbr_bitratelist_h264[location][IsLowReso(s_reso)][qual].move_low_ipic;
                ppic = vbr_bitratelist_h264[location][IsLowReso(s_reso)][qual].move_low_ppic;
            }
        }
    }

    // ②30fpsに対する他フレームレートのPpic符号量の割合(共通)
    var ppic_rate_30fps = 0;
    if ( ref > 1 ) {
        // 1s超
        ppic_rate_30fps = vbr_ppicrate_for_30fps[1][ips];
    } else {
        // 1sec
        ppic_rate_30fps = vbr_ppicrate_for_30fps[0][ips];
    }

    // ③1080Pに対する解像度比
    var rate_1080p = 1;
    if (isReso1to1Ratio(s_reso) == 1) {
        rate_1080p = getPixelNum(s_reso) / getPixelNum('2048x2048');
    } else {
        rate_1080p = getPixelNum(s_reso) / getPixelNum('FHD');
    }

    // 基本ビットレートⒶ：符号量、リフレッシュ周期(ref)、解像度比(③)から算出
    var basic_bitrate = ((ipic + ppic * ppic_rate_30fps * (vbr_ips[ips] * ref - 1)) / ref) * rate_1080p;

    // 条件毎のビットレート
    if ( scface_idx == 2 ) {
        // SmartVIQS = Low

        // Ⓐｘ（3+Sviqs係数）/4ｘAdv係数
        bitrate = basic_bitrate * (3+sviqs) / 4 * adv;

    } else {
        // ⒶｘSviqs係数ｘAdv係数
        bitrate = basic_bitrate * sviqs * adv;
    }

    return Math.round(bitrate/1000);
}


// VBRCoefList の Index を返す。
function getVBRCoefListIdx(sc_idx, scface_idx, move) {
    return scface_idx * 8 + sc_idx * 2 + move * 1;
}

// 低解像度(1)かそうでないか(0)を返す
function IsLowReso(s_reso) {
    var ret = 0;
    
    if ((s_reso == 'HVGAW') || (s_reso == 'VGA') || (s_reso == 'SVGA')) {
        ret = 1;
    }

    return ret;
}

// 解像度の比率が1:1の場合1, そうでない場合 0 を返す。
function isReso1to1Ratio(s_reso) {
    var ret = 0;

    if (s_reso == '2992x2992') {
        ret = 1;
    } else if (s_reso == '2816x2816') {
        ret = 1;
    } else if (s_reso == '2048x2048') {
        ret = 1;
    } else if (s_reso == '1280x1280') {
        ret = 1;
    } else if (s_reso == '640x640') {
        ret = 1;
    } else if (s_reso == '320x320') {
        ret = 1;
    } else if (s_reso == '2192x2192') {
        ret = 1;
    }

    return ret;
}


// 指定解像度のピクセル数を返す
function getPixelNum(s_reso) {
    var ret = 0;

    if (s_reso == 'SXVGA') {
        ret = 1280*1024;
    } else if (s_reso == 'VGA') {
        ret = 640*480;
    } else if (s_reso == 'QVGA') {
        ret = 320*240;
    } else if (s_reso == 'FHD') {
        ret = 1920*1080;
    } else if (s_reso == 'HD') {
        ret = 1280*720;
    } else if (s_reso == 'HVGAW') {
        ret = 640*360;
    } else if (s_reso == '180P') {
        ret = 320*180;
    } else if (s_reso == 'SVGA') {
        ret = 800*600;
    } else if (s_reso == 'QXGA') {
        ret = 2048*1536;
    } else if (s_reso == 'UXGA') {
        ret = 1600*1200;
    } else if (s_reso == '400x300') {
        ret = 400*300;
    } else if (s_reso == 'QQVGA') {
        ret = 160*120;
    } else if (s_reso == '160x90') {
        ret = 160*90;
    } else if (s_reso == 'WQHD') {
        ret = 2560*1440;
    } else if (s_reso == '2992x2992') {
        ret = 2992*2992;
    } else if (s_reso == '2816x2816') {
        ret = 2816*2816;
    } else if (s_reso == '2048x2048') {
        ret = 2048*2048;
    } else if (s_reso == '1280x1280') {
        ret = 1280*1280;
    } else if (s_reso == '640x640') {
        ret = 640*640;
    } else if (s_reso == '320x320') {
        ret = 320*320;
    } else if (s_reso == '2560x1920') {
        ret = 2560*1920;
    } else if (s_reso == '4000x3000') {
        ret = 4000*3000;
    } else if (s_reso == '3840x2160') {
        ret = 2840*2160;
    } else if (s_reso == '2560x1440') {
        ret = 2560*1440;
    } else if (s_reso == '2192x2192') {
        ret = 2192*2192;
    } else if (s_reso == '3072x2304') {
        ret = 3072*2304;
    } else if (s_reso == '3072x1728') {
        ret = 3072*1728;
    } else if (s_reso == '3328x1872') {
        ret = 3328*1872;
    } else if (s_reso == '2688x1520') {
        ret = 2688*1520;
    }

    return ret;
}


//
// SmartCoding の現在値から、該当する下記のいずれを返す。
// 0: Off
// 1: Low
// 2: Middle
// 3: Advanced
function getSmartCodingIndex(s_sc) {
    var idx = 0;

    if ( s_sc == s_scene_smartcoding_off ) {
        idx = 0;
    } else if ( s_sc == s_scene_smartcoding_low ) {
        idx = 1;
    } else if ( s_sc == s_scene_smartcoding_middle ) {
        idx = 2;
    } else if ( s_sc == s_scene_smartcoding_advanced ) {
        idx = 3;
    }

    return idx;
}

//
// SmartCodingFace の現在値から、該当する下記のいずれを返す。
// 0: Off
// 1: High (AUTO-VIQS On の場合はここ)
// 2: Low
function getSmartCodingFaceIndex(sctype, s_sc) {
    var idx = 0;

    if ( sctype == vbrSmartCoding_SmartVIQS) {
        if ( s_sc == s_scene_smartcodingface_off ) {
            idx = 0;
        } else if ( s_sc == s_scene_smartcoding_high ) {
            idx = 1;
        } else if ( s_sc == s_scene_smartcoding_low ) {
            idx = 2;
        }
    } else if ( sctype == vbrSmartCoding_AUTOVIQS) {
        if ( s_sc == s_scene_smartcodingface_off ) {
            idx = 0;
        } else if ( s_sc == s_scene_smartcodingface_face ) {
            idx = 1;    // AUTO-VIQS は SmartVIQS(High) として扱う
        }
    }

    return idx;
}

