⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 typedecision.c

📁 T264是中国的视频编码自由组织合力开发的264编解码程序
💻 C
字号:
/*****************************************************************************
*
*  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 <assert.h>
#include "T264.h"
#include "bitstream.h"
#include "typedecision.h"
#include "estimation.h"

#define INTRA_THRESH 2000
#define SEARCH_THRESH 1000

static uint32_t
MBAnalysis(T264_t* t, int32_t y, int32_t x)
{
    uint32_t sad;
    T264_vector_t vec;
    uint8_t* src;
    uint8_t* dst;
    // 1, we try the previous frame vector
    // Attention: we rely that the buffer management method is the simplest one
    vec = t->refn[1].mb[y * t->mb_stride + x].vec[0][0];
    
    src = t->cur.Y[0]  + (y << 4) * t->stride + (x << 4);
    dst = t->refn[1].Y[0] + ((vec.y >> 2) + (y << 4)) * t->edged_stride + (x << 4) + (vec.x >> 2);

    sad = t->sad[MB_16x16](src, t->stride, dst, t->edged_stride);

    // 2, if sad is great than thresh, we try small_diamond_search
    if (sad > SEARCH_THRESH)
    {
        // diamond maybe enough
        T264_search_context_t context;
        context.limit_x = 16;
        context.limit_y = 16;
        context.vec_best = vec;
        context.vec = &vec;
        context.mb_part = MB_16x16;

        sad = small_diamond_search(t, src, dst, &context, t->stride, t->edged_stride, sad);
    }

    return sad;
}

static int32_t
MEAnalysis(T264_t* t)
{
    int32_t i, j;
    uint32_t sad = 0;
    uint32_t intra_thresh = INTRA_THRESH * t->mb_height * t->mb_width;

    if ((t->frame_id - t->last_i_frame_id) % t->param.idrframe == 0)
        return SLICE_IDR;

    if ((t->frame_id - t->last_i_frame_id) % t->param.iframe == 0)
        return SLICE_I;
    
    // we believe that only 2 gop per second at least
    if ((int32_t)(t->frame_id - t->last_i_frame_id) > (int32_t)(t->param.framerate / 2))
    {
        // previous has set a keyframe
        for (i = 0 ; i < t->mb_height ; i ++)
        {
            for (j = 0 ; j < t->mb_width ; j ++)
            {
                sad += MBAnalysis(t, i, j);
            }
        }

        t->emms();
    }
    else
    {
        sad = 0;
    }

    if (sad > intra_thresh)
        return SLICE_I;

    // p, b we just only use the 
    if (t->pending_bframes_num < t->param.b_num)
        return SLICE_B;

    return SLICE_P;
}

int32_t
decision_slice_type(T264_t* t)
{
    if ((t->flags & USE_SCENEDETECT) == 0)
    {
        if (t->frame_no % t->param.idrframe == 0)
        {
            return SLICE_IDR;
        }
        if (t->frame_no % t->param.iframe == 0)
        {
            return SLICE_I;
        }
        else    // P or B pic
        {
            if (t->frame_no % (t->param.b_num + 1) == 0)
            {
                return SLICE_P;
            }
            else
            {
                return SLICE_B;
            }
        }
    }
    else
    {
        return MEAnalysis(t);
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -