博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
x265-1.7版本-common/lowres.cpp注释
阅读量:2189 次
发布时间:2019-05-02

本文共 7457 字,大约阅读时间需要 24 分钟。

注:问号以及未注释部分 会在x265-1.8版本内更新 

/***************************************************************************** * Copyright (C) 2013 x265 project * * Authors: Gopu Govindaswamy 
* * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111, USA. * * This program is also available under a commercial proprietary license. * For more information, contact us at license @ x265.com. *****************************************************************************/#include "picyuv.h"#include "lowres.h"#include "mv.h"using namespace x265;//本文件提供关于视频图像下采样的一个功能接口//Lowres 申请空间、释放内存、初始化、下采样图像及扩边等/** 函数功能 : 初始化数据,并申请空间内存/* 调用范围 : 只Frame::create函数中被调用* \参数 origPic: Frame.m_fencPic 原始帧YUV数据* \返回 : 是否申请内存成功 */bool Lowres::create(PicYuv *origPic, int _bframes, bool bAQEnabled){ isLowres = true; //告知父类ReferencePlanes 当前是lowresolution bframes = _bframes; width = origPic->m_picWidth / 2; //1/2下采样宽度 lines = origPic->m_picHeight / 2;//1/2下采样高度 lumaStride = width + 2 * origPic->m_lumaMarginX; if (lumaStride & 31) lumaStride += 32 - (lumaStride & 31); //保证当前下采样视频步长时32的整数倍 int cuWidth = (width + X265_LOWRES_CU_SIZE - 1) >> X265_LOWRES_CU_BITS; int cuHeight = (lines + X265_LOWRES_CU_SIZE - 1) >> X265_LOWRES_CU_BITS; int cuCount = cuWidth * cuHeight; /* rounding the width to multiple of lowres CU size */ width = cuWidth * X265_LOWRES_CU_SIZE; lines = cuHeight * X265_LOWRES_CU_SIZE; size_t planesize = lumaStride * (lines + 2 * origPic->m_lumaMarginY); size_t padoffset = lumaStride * origPic->m_lumaMarginY + origPic->m_lumaMarginX; if (bAQEnabled) { CHECKED_MALLOC(qpAqOffset, double, cuCount); CHECKED_MALLOC(invQscaleFactor, int, cuCount); CHECKED_MALLOC(qpCuTreeOffset, double, cuCount); } CHECKED_MALLOC(propagateCost, uint16_t, cuCount); /* allocate lowres buffers */ CHECKED_MALLOC_ZERO(buffer[0], pixel, 4 * planesize); //这里需要申请4个buffer ,因为将要通过4 hpel下采样得到4份1/2亮度 buffer[1] = buffer[0] + planesize; buffer[2] = buffer[1] + planesize; buffer[3] = buffer[2] + planesize; lowresPlane[0] = buffer[0] + padoffset; lowresPlane[1] = buffer[1] + padoffset; lowresPlane[2] = buffer[2] + padoffset; lowresPlane[3] = buffer[3] + padoffset; CHECKED_MALLOC(intraCost, int32_t, cuCount); CHECKED_MALLOC(intraMode, uint8_t, cuCount); for (int i = 0; i < bframes + 2; i++) { for (int j = 0; j < bframes + 2; j++) { CHECKED_MALLOC(rowSatds[i][j], int32_t, cuHeight); CHECKED_MALLOC(lowresCosts[i][j], uint16_t, cuCount); } } for (int i = 0; i < bframes + 1; i++) { CHECKED_MALLOC(lowresMvs[0][i], MV, cuCount); CHECKED_MALLOC(lowresMvs[1][i], MV, cuCount); CHECKED_MALLOC(lowresMvCosts[0][i], int32_t, cuCount); CHECKED_MALLOC(lowresMvCosts[1][i], int32_t, cuCount); } return true;fail: return false;}/** 函数功能 : 释放空间内存/* 调用范围 : 只Frame::destroy函数中被调用* \返回 : null */void Lowres::destroy(){ X265_FREE(buffer[0]); X265_FREE(intraCost); X265_FREE(intraMode); for (int i = 0; i < bframes + 2; i++) { for (int j = 0; j < bframes + 2; j++) { X265_FREE(rowSatds[i][j]); X265_FREE(lowresCosts[i][j]); } } for (int i = 0; i < bframes + 1; i++) { X265_FREE(lowresMvs[0][i]); X265_FREE(lowresMvs[1][i]); X265_FREE(lowresMvCosts[0][i]); X265_FREE(lowresMvCosts[1][i]); } X265_FREE(qpAqOffset); X265_FREE(invQscaleFactor); X265_FREE(qpCuTreeOffset); X265_FREE(propagateCost);}/** 函数功能 : 初始化信息,并进行下采样和扩边/* 调用范围 : 只void PreLookaheadGroup::processTasks函数中被调用* \返回 : null */// (re) initialize lowres statevoid Lowres::init(PicYuv *origPic, int poc){ bLastMiniGopBFrame = false; bScenecut = true; // could be a scene-cut, until ruled out by flash detection bKeyframe = false; // Not a keyframe unless identified by lookahead frameNum = poc; leadingBframes = 0; indB = 0; satdCost = (int64_t)-1; memset(costEst, -1, sizeof(costEst)); memset(weightedCostDelta, 0, sizeof(weightedCostDelta)); if (qpAqOffset && invQscaleFactor) memset(costEstAq, -1, sizeof(costEstAq)); for (int y = 0; y < bframes + 2; y++) for (int x = 0; x < bframes + 2; x++) rowSatds[y][x][0] = -1; for (int i = 0; i < bframes + 1; i++) { lowresMvs[0][i][0].x = 0x7FFF; lowresMvs[1][i][0].x = 0x7FFF; } for (int i = 0; i < bframes + 2; i++) intraMbs[i] = 0; /* downscale and generate 4 hpel planes for lookahead */ /* 查看 非asm函数frame_init_lowres_core 这样做的目的是更好的通过1/2下采样视频的编码估计原始视频编码状态 将亮度分四种方法进行1/2下采样 原始点: 82 89 86 86 93 85 89 99 101 113 96 97 97 100 104 106 108 107 111 109 127 156 133 139 137 0: 在行列选择偶数像素点为基准并选择相邻的右边、下边、右下机本身4个点作平均 * * + + * * + + - - # # - - # # 87 94 102 104 87 = ((((82 + 85 + 1) >> 1) + ((89 + 89 + 1) >> 1) + 1) >> 1) 94 = ((((86 + 99 + 1) >> 1) + ((86 + 101 + 1) >> 1) + 1) >> 1) 102= ((((96 + 106 + 1) >> 1) + ((97 + 108 + 1) >> 1) + 1) >> 1) 104 = ((((97 + 107 + 1) >> 1) + ((100 + 111 + 1) >> 1) + 1) >> 1) h: 在行选择偶数像素点,在列选择奇数像素点为基准并选择相邻的右边、下边、右下机本身4个点作平均 = * * = + + = * * = + + = - - = # # = - - = # # 91 99 103 107 91 = ((((89 + 89 + 1) >> 1) + ((86 + 99 + 1) >> 1) + 1) >> 1) 99 = ((((86 + 101 + 1) >> 1) + ((93 + 113 + 1) >> 1) + 1) >> 1) v: 在行选择奇数像素点,在列选择偶数像素点为基准并选择相邻的右边、下边、右下机本身4个点作平均 = = = = * * + + * * + + = = = = - - # # - - # # 92 100 125 123 92 = ((((85 + 96 + 1) >> 1) + ((89 + 97 + 1) >> 1) + 1) >> 1) 在行列选择奇数像素点为基准并选择相邻的右边、下边、右下机本身4个点作平均 = = = = = = = * * = + + = * * = + + = = = = = = = - - = # # = - - = # # 96 105 126 124 96 = ((((89 + 97 + 1) >> 1) + ((99 + 97 + 1) >> 1) + 1) >> 1) **/ primitives.frameInitLowres(origPic->m_picOrg[0], lowresPlane[0], lowresPlane[1], lowresPlane[2], lowresPlane[3], origPic->m_stride, lumaStride, width, lines); /* extend hpel planes for motion search */ extendPicBorder(lowresPlane[0], lumaStride, width, lines, origPic->m_lumaMarginX, origPic->m_lumaMarginY);//扩边 extendPicBorder(lowresPlane[1], lumaStride, width, lines, origPic->m_lumaMarginX, origPic->m_lumaMarginY); extendPicBorder(lowresPlane[2], lumaStride, width, lines, origPic->m_lumaMarginX, origPic->m_lumaMarginY); extendPicBorder(lowresPlane[3], lumaStride, width, lines, origPic->m_lumaMarginX, origPic->m_lumaMarginY); fpelPlane[0] = lowresPlane[0];}

转载地址:http://rauub.baihongyu.com/

你可能感兴趣的文章
【LEETCODE】82- Remove Duplicates from Sorted List II [Python]
查看>>
【LEETCODE】86- Partition List [Python]
查看>>
【LEETCODE】147- Insertion Sort List [Python]
查看>>
【算法】- 动态规划的编织艺术
查看>>
用 TensorFlow 让你的机器人唱首原创给你听
查看>>
对比学习用 Keras 搭建 CNN RNN 等常用神经网络
查看>>
深度学习的主要应用举例
查看>>
word2vec 模型思想和代码实现
查看>>
怎样做情感分析
查看>>
用深度神经网络处理NER命名实体识别问题
查看>>
用 RNN 训练语言模型生成文本
查看>>
RNN与机器翻译
查看>>
用 Recursive Neural Networks 得到分析树
查看>>
RNN的高级应用
查看>>
TensorFlow-7-TensorBoard Embedding可视化
查看>>
轻松看懂机器学习十大常用算法
查看>>
一个框架解决几乎所有机器学习问题
查看>>
特征工程怎么做
查看>>
机器学习算法应用中常用技巧-1
查看>>
机器学习算法应用中常用技巧-2
查看>>