亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? ratecontrol.c

?? H264EncPlayer,H264協(xié)議解碼與播放代碼
?? C
?? 第 1 頁 / 共 2 頁
字號:
/*****************************************************************************
*
*  T264 AVC CODEC
*
*  Copyright(C) 2004-2005 llcc <lcgate1@yahoo.com.cn>
*               2004-2005 visionany <visionany@yahoo.com.cn>
*
*  This program is free software ; you can redistribute it and/or modify
*  it under the terms of the GNU General Public License as published by
*  the Free Software Foundation ; either version 2 of the License, or
*  (at your option) any later version.
*
*  This program is distributed in the hope that it will be useful,
*  but WITHOUT ANY WARRANTY ; without even the implied warranty of
*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
*  GNU General Public License for more details.
*
*  You should have received a copy of the GNU General Public License
*  along with this program ; if not, write to the Free Software
*  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
*
****************************************************************************/

#include "stdio.h"
#include "stdlib.h"
#include "T264.h"
#include "ratecontrol.h"
#include "math.h"
#ifndef CHIP_DM642
#include "memory.h"
#endif

typedef struct
{
    // frame numbers per gop
    int32_t gop;
    int32_t np;
    int32_t nb;
    int32_t qp_sum;
    // the number in current gop, based on 0
    int32_t p_no;
    int32_t b_no;
    // prev qp1, qp2
    int32_t qp_p1;
    int32_t qp_p2;
    double deltap;
    // fluid Flow Traffic Model
    int32_t bc;
    // linear Model
    double a1;
    double a2;
    // model
    double x1;
    double x2;
    double qp[20];
    double rp[20];
    double mad[20];
    int32_t window_p;
    int32_t mad_window_p;
    // remaining bits in gop
    int32_t gop_bits;
    double tbl;
    double gamma;
    double beta;
    double theta;
    double wp;
    double wb;
    double AWp;
    double AWb;
    int32_t ideal_bits;
    double mad_p;
} T264_rc_t;

void rc_init_seq(T264_t* t, T264_rc_t* rc);
void rc_init_gop(T264_t* t, T264_rc_t* rc);
void rc_init_pic(T264_t* t, T264_rc_t* rc);
void rc_update_pic(T264_t* t, T264_rc_t* rc);
// frame level
void rc_update_qp(T264_t* t, T264_rc_t* rc);
// quadratic model
void rc_update_quad_model(T264_t* t, T264_rc_t* rc);

void 
rc_init_seq(T264_t* t, T264_rc_t* rc)
{
    double bpp, L1, L2, L3;

    rc->gop = T264_MIN(t->param.idrframe, t->param.iframe);
    rc->np = rc->gop / (1 + t->param.b_num) - 1;
    rc->nb = rc->gop - rc->np - 1;
    rc->bc = 0;
    rc->a1 = 1.0;
    rc->a2 = 0.0;
    rc->x1 = t->param.bitrate;

    if (rc->nb > 0)
    {
        rc->gamma = 0.25;
        rc->beta = 0.9;
        rc->theta = 1.3636;
    }
    else
    {
        rc->gamma = 0.5;
        rc->beta = 0.75;
    }

    if (t->param.qp == 0)
    {
        bpp = ((double)t->param.bitrate) / (t->param.framerate * t->param.width * t->param.height);
        if (t->param.width == 176)
        {
            L1 = 0.1;
            L2 = 0.3;
            L3 = 0.6;
        }
        else if (t->param.width == 352)
        {
            L1 = 0.2;
            L2 = 0.6;
            L3 = 1.2;
        }
        else
        {
            L1 = 0.6;
            L2 = 1.4;
            L3 = 2.4;
        }

        // first gop first i, p
        if (bpp <= L1)
        {
            t->qp_y = 30;
        }
        else if (bpp <= L2)
        {
            t->qp_y = 25;
        }
        else if (bpp <= L3)
        {
            t->qp_y = 20;
        }
        else
        {
            t->qp_y = 10;
        }
    }
}

void 
rc_init_gop(T264_t* t, T264_rc_t* rc)
{
    rc->gop_bits = (int32_t)(rc->gop * t->param.bitrate / (t->param.framerate) - rc->bc);
    if (t->frame_id != 0)
    {
        // JVTH0014 say to do so
        // t->qp_y = rc->qp_sum / rc->np + 8 * rc->bc / rc->gop_bits - T264_MIN(2, rc->gop / 15);
        // JM does this way
        t->qp_y = rc->qp_sum / rc->np - T264_MIN(2, rc->gop / 15);
        if (rc->gop != 1)
        {
            if (t->qp_y > rc->qp_p2 - 2)
                t->qp_y --;
            t->qp_y = clip3(t->qp_y, rc->qp_p2 - 2, rc->qp_p2 + 2);
        }
        t->qp_y = clip3(t->qp_y, t->param.min_qp, t->param.max_qp);
    }

    rc->qp_sum = 0;
    rc->p_no = 0;
    rc->b_no = 0;
    rc->qp_p2 = t->qp_y;
}

void 
rc_init_pic(T264_t* t, T264_rc_t* rc)
{
    int32_t f1, f2, f;

    if (t->slice_type == SLICE_P)
    {
        if (rc->p_no > 0)
        {
            // Step 1.1 Determination of target buffer occupancy
            if (rc->p_no == 1)
            {
                rc->deltap = ((double)rc->bc) / (double)(rc->np - 1);
                rc->tbl = rc->bc;
                rc->AWp = rc->wp;
                rc->AWb = rc->wb;
            }
            else if (rc->p_no < 8)
            {
                rc->AWp = rc->wp * (rc->p_no - 1) / (rc->p_no) + rc->AWp/ (rc->p_no);
            }
            else
            {
                rc->AWp = rc->wp / 8 + 7 * rc->AWp / 8;
            }
            
            rc->tbl -= rc->deltap;
            if (t->param.b_num > 0)
            {
                rc->tbl += rc->AWp * (t->param.b_num + 1) * t->param.bitrate / (t->param.framerate * (rc->AWp + rc->AWb * t->param.b_num))
                    - t->param.bitrate / t->param.framerate;
            }

            // Step 1.2 Microscopic control (target bit rate computation).
            f1 = (int32_t)(t->param.bitrate / t->param.framerate + rc->gamma * (rc->tbl - rc->bc));
            f1 = T264_MAX(0, f1);
            f2 = (int32_t)(rc->wp * rc->gop_bits / (rc->wp * (rc->np - rc->p_no) + rc->wb * (rc->nb - rc->b_no)));
            //f2 = rc->gop_bits / (rc->np - rc->p_no);
            f = (int32_t)(rc->beta * f1 + (1 - rc->beta) * f2);

            rc->ideal_bits = (int32_t)(f * (1 - t->param.b_num * 0.05));
            // HRD consideration ??
        }
    }
    else if (t->slice_type == SLICE_B)
    {
        if (rc->b_no > 0)
        {
            if (rc->b_no == 1)
            {
                rc->AWb = rc->wb;
            }
            else if (rc->b_no < 8)
            {
                rc->AWb = rc->wb * (rc->b_no - 1) / rc->b_no + rc->AWb/ rc->b_no;
            }
            else
            {
                rc->AWb = rc->wb / 8 + 7 * rc->AWb / 8;
            }
        }
    }
    rc_update_qp(t, rc);
}

static void 
rc_update_pic(T264_t* t, T264_rc_t* rc)
{
    int32_t X;

    rc_update_quad_model(t, rc);
    rc->gop_bits -= t->frame_bits;
    rc->bc += (int32_t)(t->frame_bits - t->param.bitrate / t->param.framerate);

    X = (int32_t)t->qp_y * t->frame_bits;
    
    if (t->slice_type == SLICE_P)
    {
        rc->qp_sum += t->qp_y;
        rc->p_no ++;
        rc->wp = X;
        // compute mad
    }
    else if (t->slice_type == SLICE_B)
    {
        rc->b_no ++;
        rc->wb = X / rc->theta;
    }
}

double
qp2qstep( int32_t qp)
{
    int32_t i; 
    double qstep;
    static const double QP2QSTEP[6] = 
    {0.625, 0.6875, 0.8125, 0.875, 1.0, 1.125};

    qstep = QP2QSTEP[qp % 6];
    for(i = 0; i< (qp/6) ; i ++)
        qstep *= 2;

    return qstep;
}

int32_t
qstep2qp(double qstep)
{
    int32_t q_per = 0, q_rem = 0;

    if( qstep < qp2qstep(0))
        return 0;
    else if (qstep > qp2qstep(51))
        return 51;

    while( qstep > qp2qstep(5))
    {
        qstep /= 2;
        q_per += 1;
    }

    if (qstep <= (0.625+0.6875)/2) 
    {
        qstep = 0.625;
        q_rem = 0;
    }
    else if (qstep <= (0.6875+0.8125)/2)
    {
        qstep = 0.6875;
        q_rem = 1;
    }
    else if (qstep <= (0.8125+0.875)/2)
    {
        qstep = 0.8125;
        q_rem = 2;
    }
    else if (qstep <= (0.875+1.0)/2)
    {
        qstep = 0.875;
        q_rem = 3;
    }
    else if (qstep <= (1.0+1.125)/2)
    {
        qstep = 1.0;  
        q_rem = 4;
    }
    else 
    {
        qstep = 1.125;
        q_rem = 5;
    }

    return (q_per * 6 + q_rem);
}

void 
rc_update_qp(T264_t* t, T264_rc_t* rc)
{
    if (t->slice_type == SLICE_P)
    {
        if (rc->p_no != 0)
        {
            if (rc->ideal_bits < 0)
            {
                t->qp_y += 2;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
香蕉久久一区二区不卡无毒影院 | 亚洲精品视频在线观看网站| 1区2区3区精品视频| 亚洲欧美激情一区二区| 午夜精品一区二区三区三上悠亚 | 国产午夜精品一区二区三区四区| 自拍偷拍欧美激情| 五月综合激情日本mⅴ| 国产精品一区二区免费不卡| 日本二三区不卡| 精品乱人伦小说| 亚洲欧美日韩国产成人精品影院| 日韩av在线播放中文字幕| 国产主播一区二区三区| 一本大道久久a久久精二百| 欧美成人一区二区三区在线观看| 国产精品久久一级| 免费不卡在线观看| 色婷婷久久一区二区三区麻豆| 日韩精品中文字幕一区| 一区二区三区蜜桃| 国产精品69久久久久水密桃| 欧美三级中文字幕| 国产精品视频一二三区 | 欧美一级午夜免费电影| 国产精品三级视频| 欧美aaa在线| 色综合欧美在线| 精品国产99国产精品| 亚洲一区二区在线视频| 国产98色在线|日韩| 91精品婷婷国产综合久久| 亚洲欧洲日韩综合一区二区| 久久精品久久久精品美女| 91亚洲男人天堂| 国产拍揄自揄精品视频麻豆| 免播放器亚洲一区| 欧美日韩免费在线视频| 国产精品国产三级国产aⅴ中文| 久久99久久久久久久久久久| 欧美午夜一区二区| 中文字幕在线不卡一区| 激情六月婷婷综合| 欧美一区二区三区视频免费| 亚洲精品国产a久久久久久 | 亚洲免费电影在线| 国产一区二区成人久久免费影院| 欧美一区午夜视频在线观看| 一区二区视频免费在线观看| 成人精品视频一区二区三区尤物| 欧美精品一区二区三区很污很色的 | 无吗不卡中文字幕| 色天使色偷偷av一区二区| 中文字幕的久久| 国产高清久久久久| 久久久久99精品一区| 精油按摩中文字幕久久| 91精品国产乱| 奇米888四色在线精品| 欧美精品v日韩精品v韩国精品v| 一区二区免费在线| 色综合久久综合网| 一区二区三区精品视频| 色哟哟欧美精品| 一卡二卡三卡日韩欧美| 欧美亚洲一区二区三区四区| 亚洲综合清纯丝袜自拍| 在线欧美日韩精品| 亚洲午夜影视影院在线观看| 欧美日韩日日骚| 日本女优在线视频一区二区| 欧美一二三四在线| 美女国产一区二区三区| 欧美一级久久久| 久久不见久久见免费视频7| 日韩欧美一区中文| 精品亚洲成a人在线观看| 精品sm在线观看| 国产精品1区2区| 亚洲欧美自拍偷拍色图| 91在线播放网址| 亚洲福利一区二区三区| 日韩视频一区二区三区| 国产在线不卡一卡二卡三卡四卡| 精品欧美久久久| 丁香婷婷深情五月亚洲| 亚洲视频小说图片| 91精品1区2区| 日日摸夜夜添夜夜添精品视频| 91精品国产品国语在线不卡 | 国产午夜亚洲精品午夜鲁丝片| 国产.欧美.日韩| 亚洲私人影院在线观看| 欧美日韩aaaaaa| 久久超碰97中文字幕| 中文一区一区三区高中清不卡| 色88888久久久久久影院野外| 婷婷综合另类小说色区| 久久午夜电影网| jlzzjlzz欧美大全| 午夜成人免费视频| 久久精品一区二区三区不卡| 色综合天天狠狠| 奇米色777欧美一区二区| 国产亚洲欧美日韩俺去了| 色欧美乱欧美15图片| 美女www一区二区| 国产精品不卡在线| 欧美丰满高潮xxxx喷水动漫| 国产成人精品三级麻豆| 亚洲综合男人的天堂| 精品久久久久久无| 91免费视频网| 美国十次综合导航| 国产精品国产三级国产有无不卡| 精品视频1区2区| 国产盗摄女厕一区二区三区| 亚洲一区二区影院| 久久久久国产一区二区三区四区 | 亚洲一区二区三区四区在线| 日韩三级高清在线| 91免费版pro下载短视频| 日本美女一区二区三区视频| 国产精品美女久久久久aⅴ国产馆 国产精品美女久久久久av爽李琼 国产精品美女久久久久高潮 | 综合av第一页| 日韩一区二区三区视频在线| aaa欧美大片| 久久国产乱子精品免费女| 国产精品久久毛片a| 91精品久久久久久久久99蜜臂| 成人国产免费视频| 日韩av不卡一区二区| 国产精品伦一区二区三级视频| 欧美日本免费一区二区三区| 成人丝袜视频网| 日韩影院在线观看| 中文字幕一区二区三区精华液| 这里只有精品电影| 91丝袜美腿高跟国产极品老师 | 久久九九久精品国产免费直播| 欧美午夜影院一区| proumb性欧美在线观看| 精品午夜久久福利影院| 亚洲第一二三四区| 亚洲人一二三区| xnxx国产精品| 6080yy午夜一二三区久久| 色综合久久精品| 国产99一区视频免费| 美女网站色91| 视频一区二区中文字幕| 亚洲欧美一区二区久久| 国产午夜精品福利| 精品美女在线观看| 91精品国产91久久综合桃花| 欧美吞精做爰啪啪高潮| 97精品国产露脸对白| 国产精品系列在线观看| 捆绑变态av一区二区三区| 亚洲成人动漫在线观看| 夜夜嗨av一区二区三区网页| 国产精品国产三级国产普通话三级 | 亚洲国产精品久久久久秋霞影院| 中文字幕日韩一区| 亚洲国产精品激情在线观看| 久久久久国产免费免费| 欧美精品一区男女天堂| 精品久久一区二区| 欧美大肚乱孕交hd孕妇| 91精品国产一区二区三区香蕉| 在线观看免费亚洲| 色婷婷国产精品| 91蝌蚪porny九色| 不卡av免费在线观看| 成人高清免费在线播放| 丰满少妇久久久久久久| 国产精品自拍在线| 国产精品 日产精品 欧美精品| 国内精品伊人久久久久av影院| 韩国女主播一区| 国产剧情一区二区三区| 激情久久五月天| 国产乱一区二区| 成人性生交大片免费| 成人av小说网| 91尤物视频在线观看| 色欧美88888久久久久久影院| 日本高清免费不卡视频| 欧美色图免费看| 欧美无砖砖区免费| 欧美日韩国产首页| 欧美日本一区二区| 欧美一级视频精品观看| 欧美xxxxx裸体时装秀| 欧美精品一区男女天堂| 亚洲国产高清在线| 亚洲另类中文字| 日韩成人午夜电影| 美脚の诱脚舐め脚责91 | 国产精品久久精品日日|