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

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

?? inter.c

?? 經過開源的H.264壓縮算法代碼
?? C
?? 第 1 頁 / 共 4 頁
字號:
/*****************************************************************************
 *
 *  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 "portab.h"
#include "stdio.h"

#include "memory.h"

#include "T264.h"
#include "inter.h"
#include "intra.h"
#include "estimation.h"
#include "utility.h"
#include "interpolate.h"
#include "bitstream.h"

//#define USE_PREV_DETECT

uint32_t
T264_predict_sad(T264_t* t, int32_t list)
{
    return T264_median(t->mb.sad_ref[0], t->mb.sad_ref[1], t->mb.sad_ref[2]);
}

void
T264_predict_mv(T264_t* t, int32_t list, int32_t i, int32_t width, T264_vector_t* vec)
{
    int32_t n;
    int32_t count = 0;
    int32_t idx;
    int32_t row;
    int32_t col;
    int32_t org;
    T264_vector_t vec_n[3];

    n = vec->refno;
    org = i;
    i = luma_index[i];

    col = org % 4;
    row = org / 4;

    vec_n[0] = t->mb.vec_ref[VEC_LUMA - 1 + row * 8 + col].vec[list];
    vec_n[1] = t->mb.vec_ref[VEC_LUMA - 8 + row * 8 + col].vec[list];
    vec_n[2] = t->mb.vec_ref[VEC_LUMA - 8 + row * 8 + col + width].vec[list];
    if (vec_n[2].refno == -2)
    {
        vec_n[2] = t->mb.vec_ref[VEC_LUMA - 8 + row * 8 + col - 1].vec[list];
    }
    if (((i & 3) == 3) || ((i & 3) == 2 && width == 2))
    {
        vec_n[2] = t->mb.vec_ref[VEC_LUMA - 8 + row * 8 + col - 1].vec[list];
    }
    if (t->mb.mb_part == MB_16x8)
    {
        if (i == 0 && n == vec_n[1].refno)
        {
            vec[0].x = vec_n[1].x;
            vec[0].y = vec_n[1].y;
            return;
        }
        else if (i != 0 && n == vec_n[0].refno)
        {
            vec[0].x = vec_n[0].x;
            vec[0].y = vec_n[0].y;
            return;
        }
    }
    else if (t->mb.mb_part == MB_8x16)
    {
        if (i == 0 && n == vec_n[0].refno)
        {
            vec[0].x = vec_n[0].x;
            vec[0].y = vec_n[0].y;
            return;
        }
        else if (i != 0 && n == vec_n[2].refno)
        {
            vec[0].x = vec_n[2].x;
            vec[0].y = vec_n[2].y;
            return;
        }
    }

    if (vec_n[0].refno == n)
    {
        count ++;
        idx = 0;
    }
    if (vec_n[1].refno == n)
    {
        count ++;
        idx = 1;
    }
    if (vec_n[2].refno == n)
    {
        count ++;
        idx = 2;
    }

    if (count > 1)
    {
        vec[0].x = T264_median(vec_n[0].x, vec_n[1].x, vec_n[2].x);
        vec[0].y = T264_median(vec_n[0].y, vec_n[1].y, vec_n[2].y);
        return;
    }
    else if (count == 1)
    {
        vec[0].x = vec_n[idx].x;
        vec[0].y = vec_n[idx].y;
        return;
    }
    else if (vec_n[1].refno == -2 && vec_n[2].refno == -2 && vec_n[0].refno != -2)
    {
        vec[0].x = vec_n[0].x;
        vec[0].y = vec_n[0].y;
    }
    else
    {
        vec[0].x = T264_median(vec_n[0].x, vec_n[1].x, vec_n[2].x);
        vec[0].y = T264_median(vec_n[0].y, vec_n[1].y, vec_n[2].y);
        return;        
    }
}

void
T264_predict_mv_skip(T264_t* t, int32_t list, T264_vector_t* vec)
{
    T264_vector_t vec_n[2];
    int32_t zero_left, zero_top;

    vec_n[0] = t->mb.vec_ref[VEC_LUMA - 1].vec[0];
    vec_n[1] = t->mb.vec_ref[VEC_LUMA - 8].vec[0];
    vec[0].refno = 0;

    zero_left = vec_n[0].refno == -2 ? 1 : vec_n[0].refno == 0 && vec_n[0].x == 0 && vec_n[0].y == 0 ? 1 : 0;
    zero_top  = vec_n[1].refno == -2 ? 1 : vec_n[1].refno == 0 && vec_n[1].x == 0 && vec_n[1].y == 0 ? 1 : 0;

    if (zero_left || zero_top)
    {
        vec[0].x = vec[0].y = 0;
    }
    else
    {
        T264_predict_mv(t, 0, 0, 4, vec);
    }
}

int32_t 
T264_median(int32_t x, int32_t y, int32_t z)
{
    int32_t min, max;
    if (x < y)
    {
        min = x;
        max = y;
    }
    else
    {
        min = y;
        max = x;
    }

    if (z < min)
    {
        min = z;
    }
    else if (z > max)
    {
        max = z;
    }

    return x + y + z - min - max;
}

void
copy_nvec(T264_vector_t* src, T264_vector_t* dst, int32_t width, int32_t height, int32_t stride)
{
    int32_t i, j;

    for(i = 0 ; i < height ; i ++)
    {
        for(j = 0 ; j < width ; j ++)
        {
            dst[j] = src[0];
        }
        dst += stride;
    }
}

void
T264_inter_p16x16_mode_available(T264_t* t, int32_t preds[], int32_t* modes)
{
    if (t->flags & USE_FORCEBLOCKSIZE)
    {
        *modes = 0;
      
        preds[(*modes) ++] = MB_16x16;

        if (t->param.block_size & SEARCH_16x8P)
            preds[(*modes) ++] = MB_16x8;
        if (t->param.block_size & SEARCH_8x16P)
            preds[(*modes) ++] = MB_8x16;

        return ;
    }

    if ((t->mb.mb_neighbour & (MB_LEFT | MB_TOP)) == (MB_LEFT | MB_TOP))
    {
        *modes = 0;

        preds[(*modes) ++] = MB_16x16;
        if (t->mb.vec_ref[VEC_LUMA - 1].part == MB_16x8)
        {
            preds[(*modes) ++] = MB_16x8;
        }
        if (t->mb.vec_ref[VEC_LUMA - 8].part == MB_8x16)
        {
            preds[(*modes) ++] = MB_8x16;
        }
    }
    else
    {
        // try all
        preds[0] = MB_16x16;
        preds[1] = MB_16x8;
        preds[2] = MB_8x16;
        *modes = 3;
    }
}

void
T264_inter_p8x8_mode_available(T264_t* t, int32_t preds[], int32_t* modes, int32_t sub_no)
{
    static const int32_t neighbour[] = 
    {
        0, MB_LEFT, MB_TOP, MB_LEFT| MB_TOP
    };

    int32_t mb_neighbour = t->mb.mb_neighbour| neighbour[sub_no];

    if (t->flags & USE_FORCEBLOCKSIZE)
    {
        *modes = 0;

        if (t->param.block_size & SEARCH_8x8P)
            preds[(*modes) ++] = MB_8x8;
        if (t->param.block_size & SEARCH_8x4P)
            preds[(*modes) ++] = MB_8x4;
        if (t->param.block_size & SEARCH_4x8P)
            preds[(*modes) ++] = MB_4x8;
        if (t->param.block_size & SEARCH_4x4P)
            preds[(*modes) ++] = MB_4x4;

        return ;
    }

    if ((mb_neighbour & (MB_LEFT | MB_TOP)) == (MB_LEFT | MB_TOP))
    {
        *modes = 0;

        preds[*modes ++] = MB_8x8;
        if (t->mb.vec_ref[VEC_LUMA - 8 + sub_no / 2 * 16 + sub_no % 2 * 4].part == MB_8x4)
        {
            preds[*modes ++] = MB_8x4;
        }
        if (t->mb.vec_ref[VEC_LUMA - 1 + sub_no / 2 * 16 + sub_no % 2 * 4].part == MB_4x8)
        {
            preds[*modes ++] = MB_4x8;
        }
        if (t->mb.vec_ref[VEC_LUMA - 8 + sub_no / 2 * 16 + sub_no % 2 * 4].part == MB_4x4 || 
            t->mb.vec_ref[VEC_LUMA - 1 + sub_no / 2 * 16 + sub_no % 2 * 4].part == MB_4x4)
        {
            preds[*modes ++] = MB_4x4;
        }
    }
    else
    {
        // try all
        preds[0] = MB_8x8;
        preds[1] = MB_8x4;
        preds[2] = MB_4x8;
        preds[3] = MB_4x4;
        *modes = 4;
    }
}

int32_t
T264_get_pos_sad(T264_t* t, uint8_t* ref, T264_vector_t* vec)
{
    uint8_t* tmp;
    int32_t x, y;
    int32_t list_index = 0;
    uint32_t sad;

    static const int8_t index[4][4][6] = 
    {
        {{0, 0, 0, 0, 0, 0}, {0, 1, 0, 0, 0, 0}, {1, 1, 0, 0, 0, 0}, {1, 0, 0, 0, 1, 0}},
        {{0, 2, 0, 0, 0, 0}, {1, 2, 0, 0, 0, 0}, {1, 3, 0, 0, 0, 0}, {1, 2, 0, 0, 1, 0}},
        {{2, 2, 0, 0, 0, 0}, {2, 3, 0, 0, 0, 0}, {3, 3, 0, 0, 0, 0}, {3, 2, 0, 0, 1, 0}},
        {{2, 0, 0, 0, 0, 1}, {2, 1, 0, 0, 0, 1}, {3, 1, 0, 0, 0, 1}, {1, 2, 0, 1, 1, 0}}
    };

    // need subpel
    if ((t->flags & (USE_QUARTPEL)) == (USE_QUARTPEL))
    {
        x = (vec->x & 3);
        y = (vec->y & 3);

        if (index[y][x][0] == index[y][x][1])
        {
            tmp = t->ref[list_index][vec->refno]->Y[index[y][x][0]] + ((t->mb.mb_y << 4) + (vec->y >> 2)) * t->edged_stride + 
                ((t->mb.mb_x << 4) + (vec->x >> 2));
            t->memcpy_stride_u(tmp, 16, 16, t->edged_stride, ref, 16);
        }
        else
        {
            t->pia[MB_16x16](t->ref[list_index][vec->refno]->Y[index[y][x][0]] + ((t->mb.mb_y << 4) + (vec->y >> 2) + index[y][x][3]) * t->edged_stride + (t->mb.mb_x << 4) + (vec->x >> 2) + index[y][x][2], 
                t->ref[list_index][vec->refno]->Y[index[y][x][1]] + ((t->mb.mb_y << 4) + (vec->y >> 2) + index[y][x][5]) * t->edged_stride + (t->mb.mb_x << 4) + (vec->x >> 2) + index[y][x][4],
                t->edged_stride, t->edged_stride, ref, 16);
        }

        // rc will use sad value
        sad = t->cmp[MB_16x16](t->mb.src_y, t->stride, ref, 16);

        return sad;
    }

    return -1;
}

int32_t
T264_detect_pskip(T264_t* t, uint32_t sad_t)
{
    // detect p skip has a two-step process. here try to find suitable skip mv
    //  and encode post will decide if use skip mode or not
    DECLARE_ALIGNED_MATRIX(ref, 16, 16, uint8_t, CACHE_SIZE);

    T264_vector_t vec;
    uint8_t* tmp;
    int32_t x, y;
    int32_t i, j;
    int32_t list_index = 0;

    static const int8_t index[4][4][6] = 
    {
        {{0, 0, 0, 0, 0, 0}, {0, 1, 0, 0, 0, 0}, {1, 1, 0, 0, 0, 0}, {1, 0, 0, 0, 1, 0}},
        {{0, 2, 0, 0, 0, 0}, {1, 2, 0, 0, 0, 0}, {1, 3, 0, 0, 0, 0}, {1, 2, 0, 0, 1, 0}},
        {{2, 2, 0, 0, 0, 0}, {2, 3, 0, 0, 0, 0}, {3, 3, 0, 0, 0, 0}, {3, 2, 0, 0, 1, 0}},
        {{2, 0, 0, 0, 0, 1}, {2, 1, 0, 0, 0, 1}, {3, 1, 0, 0, 0, 1}, {1, 2, 0, 1, 1, 0}}
    };

    T264_predict_mv_skip(t, 0, &vec);

    // need subpel
    if ((t->flags & (USE_QUARTPEL)) == (USE_QUARTPEL))
    {
        x = (vec.x & 3);
        y = (vec.y & 3);

        if (index[y][x][0] == index[y][x][1])
        {
            tmp = t->ref[list_index][vec.refno]->Y[index[y][x][0]] + ((t->mb.mb_y << 4) + (vec.y >> 2)) * t->edged_stride + 
                ((t->mb.mb_x << 4) + (vec.x >> 2));
            t->memcpy_stride_u(tmp, 16, 16, t->edged_stride, ref, 16);
        }
        else
        {
            t->pia[MB_16x16](t->ref[list_index][vec.refno]->Y[index[y][x][0]] + ((t->mb.mb_y << 4) + (vec.y >> 2) + index[y][x][3]) * t->edged_stride + (t->mb.mb_x << 4) + (vec.x >> 2) + index[y][x][2], 
                        t->ref[list_index][vec.refno]->Y[index[y][x][1]] + ((t->mb.mb_y << 4) + (vec.y >> 2) + index[y][x][5]) * t->edged_stride + (t->mb.mb_x << 4) + (vec.x >> 2) + index[y][x][4],
                        t->edged_stride, t->edged_stride, ref, 16);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
制服丝袜成人动漫| 精品国产91久久久久久久妲己| 麻豆精品精品国产自在97香蕉| 中文欧美字幕免费| 日韩一区二区三区三四区视频在线观看 | 欧美精品色一区二区三区| 国产精品一二三区在线| 日韩av一二三| 一区二区成人在线| 国产精品无人区| 精品国产三级a在线观看| 欧美色图免费看| a级精品国产片在线观看| 国产精品亚洲一区二区三区妖精 | 91精品一区二区三区在线观看| 波多野结衣91| 国产精品一二三四五| 久久国产综合精品| 日本亚洲最大的色成网站www| 亚洲桃色在线一区| 国产欧美日韩视频在线观看| 久久综合九色欧美综合狠狠| 91精品国产综合久久小美女| 欧美理论片在线| heyzo一本久久综合| 免费在线观看视频一区| 亚洲无人区一区| 亚洲视频每日更新| 中文字幕在线观看不卡视频| 久久精品综合网| 精品动漫一区二区三区在线观看| 91麻豆精品国产91久久久久| 欧美裸体一区二区三区| 欧洲人成人精品| 在线观看视频欧美| 在线观看av不卡| 欧美日韩一区二区三区不卡| 在线免费视频一区二区| 色综合天天综合网天天狠天天| www.亚洲在线| 91免费观看视频| 色拍拍在线精品视频8848| 91激情五月电影| 精品视频一区二区三区免费| 欧美精品日韩精品| 91精品一区二区三区在线观看| 91麻豆精品91久久久久同性| 欧美大白屁股肥臀xxxxxx| 免费日韩伦理电影| 欧美精品自拍偷拍动漫精品| 欧美中文字幕亚洲一区二区va在线 | 国产精品久久毛片| 中文字幕一区不卡| 最新高清无码专区| 亚洲一区二区四区蜜桃| 亚洲成人一区二区在线观看| 蜜桃一区二区三区四区| 国产精品综合一区二区三区| av在线一区二区三区| 欧美午夜免费电影| 日韩欧美成人激情| 中文字幕第一区第二区| 综合在线观看色| 亚洲图片欧美色图| 蓝色福利精品导航| 成人激情小说乱人伦| 欧美在线一区二区| 欧美va亚洲va香蕉在线| 国产精品美女久久久久久久| 亚洲国产精品久久人人爱蜜臀| 色综合视频在线观看| 美女一区二区三区在线观看| 久久国产精品99久久人人澡| 成人精品国产一区二区4080| 色老头久久综合| 精品久久99ma| **欧美大码日韩| 日本麻豆一区二区三区视频| 国产伦精品一区二区三区在线观看| av成人免费在线观看| 欧美日韩免费一区二区三区| 精品国产三级电影在线观看| 亚洲人成亚洲人成在线观看图片| 日韩精品五月天| 不卡一区二区中文字幕| 欧美日韩久久久久久| 国产亚洲一二三区| 亚洲成a人片在线不卡一二三区| 国产美女娇喘av呻吟久久| 色婷婷综合五月| 26uuu成人网一区二区三区| 亚洲人妖av一区二区| 激情成人综合网| 欧美日韩一区三区四区| 日本一区二区三区在线不卡 | 国产一区二区三区精品欧美日韩一区二区三区 | 欧美巨大另类极品videosbest | 国产精品入口麻豆原神| 亚洲国产精品一区二区www| 国产精品正在播放| 欧美一区日韩一区| 一区二区免费视频| 国产a级毛片一区| 日韩一区二区三区高清免费看看| 亚洲蜜臀av乱码久久精品蜜桃| 精品无人码麻豆乱码1区2区| 欧美精品日日鲁夜夜添| 亚洲日本va午夜在线影院| 国产乱人伦偷精品视频免下载| 欧美日韩久久久| 一区二区不卡在线播放 | 韩国中文字幕2020精品| 欧美性色黄大片| 亚洲天堂网中文字| 成人一级黄色片| 久久精品人人做人人爽97| 99re成人在线| 国产精品66部| 欧美变态tickling挠脚心| 亚洲一区二区三区国产| 99精品欧美一区二区三区小说| 久久精品视频一区二区| 国产激情视频一区二区三区欧美 | 欧美精品vⅰdeose4hd| 亚洲激情自拍偷拍| 91丨九色丨尤物| 日韩一区有码在线| 波多野结衣中文字幕一区二区三区| 久久九九国产精品| 国产超碰在线一区| 久久精品一区蜜桃臀影院| 国产在线观看一区二区| 精品国产91洋老外米糕| 国产在线播放一区| 亚洲国产人成综合网站| 欧美做爰猛烈大尺度电影无法无天| 亚洲欧美一区二区三区极速播放| 99re这里只有精品视频首页| 亚洲天堂2016| 欧美揉bbbbb揉bbbbb| 日韩黄色在线观看| 91精品国产手机| 九九视频精品免费| 久久久精品国产免大香伊| 欧美日韩一级黄| 中文字幕一区三区| 色av成人天堂桃色av| 亚洲成人福利片| 91精品黄色片免费大全| 国产一区二三区好的| 久久久91精品国产一区二区三区| 国产mv日韩mv欧美| 亚洲精品欧美综合四区| 欧美日韩国产色站一区二区三区| 日本色综合中文字幕| 欧美成人aa大片| 成人黄色在线网站| 夜夜爽夜夜爽精品视频| 337p亚洲精品色噜噜| 国产精品亚洲成人| 亚洲蜜桃精久久久久久久| 91麻豆精品国产自产在线 | 三级成人在线视频| 精品噜噜噜噜久久久久久久久试看 | 成人午夜激情片| 亚洲成人激情社区| 亚洲精品一区二区三区蜜桃下载| 成人激情小说网站| 偷窥国产亚洲免费视频| 欧美国产精品专区| 欧美日韩亚洲高清一区二区| 国产在线看一区| 一区二区三区中文字幕电影| 日韩视频国产视频| 97精品国产露脸对白| 美女视频免费一区| 亚洲人成7777| 精品国产1区二区| 91成人看片片| 风间由美一区二区三区在线观看| 亚洲另类中文字| 久久久亚洲精品石原莉奈 | 日韩欧美一级在线播放| 懂色av一区二区在线播放| 亚洲综合色噜噜狠狠| 久久久久久久久免费| 欧美私模裸体表演在线观看| 国产白丝精品91爽爽久久| 亚洲h在线观看| 亚洲啪啪综合av一区二区三区| 精品国产一区二区精华| 色综合久久综合网| 美女爽到高潮91| 91麻豆免费在线观看| 亚洲成av人片观看| 欧美国产欧美亚州国产日韩mv天天看完整| 欧美sm极限捆绑bd| 欧美三级韩国三级日本三斤| 成人久久久精品乱码一区二区三区 | 欧美久久久一区|