分类: 嵌入式
2009-12-05 21:22:14
Q:PSNR
峰值信噪比
是根据它来取qp是不是?
A:不是
和QP没有直接关系但是QP的选择会影响到PSNR
Q:如果不用率失真最优化, 为什么选择SATD+delta×r(mv,mode)作为模式选择的依据?为什么运动估计中,整象素搜索用SAD,而亚象素用SATD?为什么帧内模式选择要用SATD?
A:
SAD即绝对误差和,仅反映残差时域差异,影响PSNR值,不能有效反映码流的大小。SATD即将残差经哈德曼变换的4×4块的预测残差绝对值总和,可以将其看作简单的时频变换,其值在一定程度上可以反映生成码流的大小。因此,不用率失真最优化时,可将其作为模式选择的依据。
一般帧内要对所有的模式进行检测,帧内预测选用SATD的原因同上。
在做运动估计时,一般而言,离最优匹配点越远,匹配误差值SAD越大,这就是有名的单一平面假设,现有的运动估计快速算法大都利用该特性。但是,转换后SATD值并不满足该条件,如果在整象素中运用SATD搜索,容易陷入局部最优点。而在亚象素中,待搜索点不多,各点处的SAD差异相对不大,可以用SATD选择码流较少的匹配位置。
============================================================
Q:下面代码的功能是什么? Q:编解码是以什么为单位进行的? Q:为何在cavlc编码的时候,第一个负数要加1? A:如果拖尾小于3,说明第一个level的绝对值值肯定大于1。因此,level为正时,减1;为负时加1。可降低码流 Q: YCrCb 4:2:0是什么?像4:4:4和4:2:2一样表示 Y:Cr:Cb是4:2:0吗? A: 不要让它骗了,我觉得它所表达意思应该是4:1:1,还有如果你看得是像 里面这样的对4:2:0的说明的烂图的话,可能看半天也不明白,建议看 Q:H.264中,术语IDR的意思是什么,有什么用? Q:CABAC中开始时各字符出现的概率是怎么得到的? Q:我们可以从一幅图像的自相关函数图中得到不同图像之间的相似程度.在中点处的最顶点表示图像未经移动时的图像.当空域移动拷贝被从原始图像的任一个方向移除的时候,这个函数值就会急骤下降,就这说明了一个图像采样值的邻域内是高度相关的. 我想问一下,空域移动拷贝被从原始图像的任一个方向移除的时候,这是一个什么过程 A:空域移动就表示平移,求自相关函数就包含平移这个过程.你看一维的 R(t,delta)=E[X(t)*X(t+delta)] ,二维不过平移多个方向而已 A:only the central decoder is standardized什么意思Q:意思是说264标准只定义了码流的格式 编码器实现是各公司自己的事,只要形成的码流符合标准就行 解码器必须按照这个格式来,这样任何符合标准的码流都可以解出来 Q:What is RVLC? Q:如果不用率失真最优化, 为什么选择SATD+delta×r(mv,mode)作为模式选择的依据?为什么运动估计中,整象素搜索用SAD,而亚象素用SATD?为什么帧内模式选择要用SATD? Q:RDO模型用来干什么?RQ模型又用来干什么? Q:帧,场,图像的联系与区别是什么? A:在分析标准时要分清帧(frame)、场(field)、图像(picture)很关键。 Q:如何在VC下编译JM Q:关于H264 ASIC设计的难点。 A: IDR帧与I帧的区别Q:因为264采用了多帧预测,就有可能在display order下I帧后的P会参考I帧前的帧,这样在random access时如果只找I帧,随后的帧的参考帧可能unavailable,IDR就是这样一种特殊 Q:对于帧间编码,在一个宏块内,可以同时存在的模式? Q: A: MV:运动向量,参考帧中相对于当前帧的偏移 Q: I帧和P帧的概念比较好懂,B帧的概念有些模糊,只知道加了B帧图像质量会更好,请问对B帧该怎么理解? Golomb 用于运动矢量,模式类型,头信息等编码 Q:rdp(user data packet protocol) 和 (rtp)real-time transport protocol有什么区别? A:RTP是为了实时传输而在源数据上加了一些时间控制信息 UDP只是为了传输数据,udp的包可以加上rtp的头,成为一个rtp的数据包 rtp3984 拆分3种包: Q:相对PAFF,MBAFF的作用大不大? Q: Q: Q:white paper中给出帧内预测9种模式,vertical和horizontal容易理解,不知其他模式是依据怎样的算法来进行预测的。 Q:关于对除开拖尾系数以外的非零系数Level编码 Q:h264在网络上以udp方式传输问题 在mpeg4标准中,都是通过rtp协议把视频帧分成一个个的包加上rtp头再发送,在h264中,是由nal直接分片成包的还是要通过rtp分呢?要不要加rtp头 Q:FMO的优处和劣处? Q:block的类型包括几种? Q:在进行运动估计和运动补偿时,所用的块匹配快速算法有哪些?匹配准则又有哪几种? Q:jm各个版本之间的代码做了些什么改动,有没有说明这些的文档啊? A:每个版本源代码的根目录下都有一个 change.txt 文件,里面详细记录了所有版本的更新。 补充:为何已经有了 JM 10.2,大家仍偏好用 8.6 呢 ? 风轻回答:针对对象不同,jm90以上全部是针对高保真的视频的。86基本上可以满足一般处理的所有要求。 Q: PicAFF和MbAFF的区别是什么? Q:用h264设计的解码器是不是可以解任意编码器编的码?是根据档次设计解码器吗? Q:在VC环境下是如何读入*.yuv序列的?
fp= fopen("input.yuv","rb"); if(fp == NULL)
for(i = 0; i<1; i++) fclose(fp); Q:SODB,RBSP,EBSP的区别 Q:码流的读取位置 如果码流是按RTP协议传输,则调用GetRTPNALU(nalu)。并对RTP包进行拆封。在H.264中,对RTP包头的各段的值进行了限制,这些被限制的值必须满足条件,否则认为出错。 A:MBAFF的问题 Q;CAVLC,Exp-Golomb的区别 Q:CAVLC的过程 Q:哪位能讲一下标准里面的坐标的问题,分不清到底指的是块,宏块,尤其是MBAFF时?比如第6章逆扫描时的这两个公式:y = yO + ( mbAddr % 2 ) * 16(帧), Q:为什么要在计算桢内DC预测模式时要+2,+4? Q: 为什么量化系数的数组是取[6][4][4]呢? 我们可以看到位于p00、p02、p20、p22位置的系数需要乘aa,p11、p13、p31、p33的系数需要乘bb/4,其余的系数需要乘ab/2,这里a = 0.5,b = sqrt(0.4),c = 0.5。然而整数变换中的乘法运算可以与量化过程的除法运算糅合起来,这样就产生了你所提到的quant_coef[6][4][4]。第一个分量取6,是因为量化阶每隔6就增加一倍,因此只需要记录下量化阶为0-5时的各个系数的大小,而后两个分量取4则是为了与整数变换的大小相匹配 Q: int cof[4][6][4][4]; //!< correction coefficients from predicted Q:IDR picture指什么?
PartitionMotionSearch函数里面static int bx0[5][4] = {{0,0,0,0}, {0,0,0,0}, {0,0,0,0}, {0,2,0,0}, {0,2,0,2}},[5]是模式,[4]是子块的坐标 。0模式就是指skip或direct模式 ChromaResidualCoding (&dummy)中dummy是计算色度CBP的值,然后在亮度CBP上叠加,构成率失真函数的重要部分
为什么帧内预测要用未滤波的图像而不是滤波后的图像呢? 帧内预测只能用滤波前的值,因为帧内预测的时候边界滤波还不能进行,帧内预测所需要的象素点的边界的滤波不能进行,因为需要等到当前宏块解完后才开始,但是你现在就在解当前宏块,所以为了避免预测和滤波的耦合 应该分开来单独做,prediction的时候保存一个line buffer就解决问题了 h->param.analyse.inter &= X264_ANALYSE_PSUB16x16|X264_ANALYSE_PSUB8x8|X264_ANALYSE_BSUB16x16| X264_ANALYSE_I4x4|X264_ANALYSE_I8x8; 为什么这么做啊? 帧间要遍历所有模块,可以去掉一下选项,就是说,你可以不搜索一些模式,他默认是都要搜索的,比如你编码P帧的时候,不想搜索的那么精细,可以去掉ANALYSE_PSUB8x8
|
Q:CQM_4IY,CQM_4IC,CQM_4PY,CQM_4PC,CQM_8IY,CQM_8PY的含义?
A:cqm_4iy->INTRA4X4_LUMA,cqm_4ic->INTRA4X4_CHROMA
cqm_4py->INTER4X4_LUMA,cqm_4ic->INTER4X4_CHROMA
cqm_4py->INTER8X8_LUMA,cqm_4ic->INTER8X8_CHROMA
Q:在x264的x264_cqm_init( x264_t *h )函数中:
for( i = 0; i < 16; i++ )
{
h->dequant4_mf[i_list][q][0] = def_dequant4[q] * h->pps->scaling_list[i_list];
h-> quant4_mf[i_list][q][0] = def_quant4[q] * 16 / h->pps->scaling_list[i_list];
}
第二个式子为什么*16?
A:你不要管这个16,这个16是约定成俗的,要和量化,凡量化一直考虑
Q:unquant4_mf[4][52][16]这个矩阵也是量化里面的,你看量化矩阵和反量化矩阵都是4维的,而这个是3维的
A:unquant4_mf[i_list][q],是0~15,是线性排列,quant4_mf[i_list][q%6][0],是[][]矩阵排列
Q:在上面的程序中量化和反量化矩阵为什么第三维只为0呢?
A:为0才对,因为本来定义[4][4],现在要线性访问16个成员,就必须[0]了
以上问题
Q:关于skip模式的问题
A:When a Skipped macroblock is signalled in the bitstream, no further data is sent for that macroblock. The decoder calculates a vector for the skipped macroblock and reconstructs the macroblock using motion-compensated prediction from the first reference picture in list 0.
p_skip 就是说只计算参考桢中的mv,传输的是0数据,直接把参考中的匹配宏块拿过来就行了,skip模式只传送mb_type,其他信息都是从参考桢中获取,在解码端计算MV及恢复残差数据,MV不是从参考帧获得的,是在解码端计算,mv是根据周围的相邻块的mv进行计算,好像是取中间值,有点像MV在运动估计时候的预测,是只传送mb_type,其他信息都可以计算出来 ,这就是skip。
To have a SKIP mode in H.264, a macroblock should meet following conditions all together [5]:
(i) the best motion compensation block size is 16x16,
(ii) reference frame is just one previous one,
(iii) motion vector is (0,0) or the same as its PMV, and(iv) its transform coefficients are all quantized to zero.
(iv) its transform coefficients are all quantized to zero
由城里汉子回答,特此感谢!
为什么帧内预测要用未滤波的图像而不是滤波后的图像呢?
帧内预测只能用滤波前的值,因为帧内预测的时候边界滤波还不能进行,帧内预测所需要的象素点的边界的滤波不能进行,因为需要等到当前宏块解完后才开始,但是你现在就在解当前宏块,所以为了避免预测和滤波的耦合 应该分开来单独做,prediction的时候保存一个line buffer就解决问题了
----这样的解释对吗
FrameSkip,该参数是对原始YUV帧丢弃数,就是说每隔一帧(I或者P,不包括B)丢弃FrameSkip帧。
NumberBFrames,就是两个编码帧中间B帧的数目,该数必须小于FrameSkip
FramesToBeEncoded,总共要编码的帧数,不包括B帧.因为在编码过程中 b帧对其他帧并不产生影响,而且在实时编码中,如果负担过重;或带宽有限,可以有选择的丢弃b帧
IntraPeriod,每IntraPeriod帧(I/P帧)有一个I帧编码
如果你选择的frameskip>=1,numberbframes=0,intraperiod>1,序列类型:ipp...ipp...
如果你选择的frameskip>=1,numberbframes=1,intraperiod>1,序列类型:ipbpb...ipbpb...
如果你选择的frameskip>=2,numberbframes=2,intraperiod>1,序列类型:ipbbpbb...ipbbpbb...
h264标准里为什么有PAFF和MBAFF两种编码模式,都是出于编码效率的考虑吗?
还是PAFF编码还考虑了逐行隔行显示的问题
P_Skip的特别之处在于码流中不传输MVD数据,预测块的大小肯定史16*16。当下面四个条件满足任意一个时,当前宏块的MV预测值直接置为(0,0),不满足时当作普通P宏块处理
– mbAddrA is not available
– mbAddrB is not available
– refIdxL0A is equal to 0 and both components of mvL0A are equal to 0
– refIdxL0B is equal to 0 and both components of mvL0B are equal to 0
#define SADFUNC(w, h, base) \
uint32_t \
T264_##base##_u_##w##x##h##_c(uint8_t* src, int32_t src_stride, uint8_t* data, int32_t dst_stride) \
{ \
return T264_##base##_u_c(src, src_stride, data, w, h, dst_stride); \
}
这种宏定义无论是在t264,x264或是jm代码中都比较常见
使用这样的宏定义后,函数名字可以根据宏定义进行改变,也就是说,函数名也有宏定义。
相邻两个##之间的内容用调用时的()内的相应的内容进行代替,例如:
SADFUNC(16, 16, sad)就用sad代替base,16代替x,16代替h
这样实际调用函数就为T264_sad_u_16x16(.........)了