JM代码阅读笔记之一.doc_第1页
JM代码阅读笔记之一.doc_第2页
JM代码阅读笔记之一.doc_第3页
JM代码阅读笔记之一.doc_第4页
JM代码阅读笔记之一.doc_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

2afd3c2fbfb241fd009d8d42e9ceb907.pdfPage 5 of 53/20/20202007-11-6:JM文档描述研究(一)I RC问题是在2.6节中描述的,这些符号的含义是什么?1)有关字母含义的说明jth picture in the ith GOP:表示第i个GOP的第j幅图像。bpp:就是每个像素的bits数。Bits per pixel(?).1) 图像数据以上公式含义说明:若为第1个GOP图像组的第一个图像,那么,此时虚存为0,容易理解;若为某个GOP图像组的第一个图像,那么,此时的虚存为上一个GOP的虚存。对于不是第一个图像的情况,此时的虚存为上一个图像编码时占据的虚存。II请教个问题:对于GOP图像序列,若编码第i个GOP的第j个图像时,此时在虚存中保留着上一个GOP的所有图像数据?解答:IGOP就是第一frame为IDR,然后其余frame按照预设的frame类型序列编码,直到该周期结束;接着开始下一个GOP,但此时第一frame图像不是IDR,因此,它要保留前一个GOP中的信息(至少是部分信息)。2007-11-6:JM文档描述研究(二)I 总体而言,JM模型主要的数据结构、文件内容、函数功能、软件架构和核心算法是怎样的?JM模型主要的描述和说明文档有哪些?JMII 请教:1) jm中InputParameters中成员IntraBottom什么含义?2) 数组存储的数据用作什么?LevelScale4x4LumaLevelScale4x4ChromaLevelScale8x8LumaInvLevelScale4x4LumaInvLevelScale4x4ChromaInvLevelScale8x8Luma3)下面代码来自函数void init_poc()if (input-BRefPictures = 1) img-offset_for_non_ref_pic = 0; img-offset_for_ref_frame0 = 2; else img-offset_for_non_ref_pic = -2*(input-successive_Bframe); img-offset_for_ref_frame0 = 2*(input-successive_Bframe+1); 它的实现原理是什么?解答:当输入参数表明B 参考图像可以用作参考frame时,不存在非参考图像的问题,因此,所谓的偏移为0;否则,就存在偏移。III 请教:怎么会出现数组元素的下标值为负值?解答:只要保证那块内存是可以被合法读写的就可以。因为C语言是不做下标检查的,而且C语言把下标看作是有符号的。所以,只要内存合法就可以。2007-11-11:JM文档描述研究(三)I 在编码文件lencod.c中的主函数中有如下代码:if (input-intra_period = 0) n = input-no_frames + (input-no_frames - 1) * input-successive_Bframe; /* number of P frames */ np = input-no_frames-1; /* number of B frames */ nb = (input-no_frames - 1) * input-successive_Bframe; 从中可以得到什么结论?解答:1)input-no_frames代表编码的frame数(注意,不包括B frame)。连续B frame是针对其他frame而言的,不适用于IDR图像。2)当input-intra_period = 0时,表明只有第一frame图像为IDRframe(还是整个图像序列只有第一frame为I frame?)II 文件lencod.c中主函数里存在如下代码:else if ( input-RCUpdateMode != RC_MODE_1 & input-RCUpdateMode != RC_MODE_3 ) N = input-intra_period*(input-successive_Bframe+1); M = input-successive_Bframe+1; n = (img-number=0) ? N - ( M - 1) : N; . 目前,没有看出其含义;如何解释?2007-11-14:JM代码研究(一)I 请教:frame和slice的类型是什么关系?这里的类型指的是I、P、B、SI和SP.是否完全一致还是满足一定映射关系?解答:(参考,不一定正确)I 帧和 IDR 帧都只有 I 片;P 帧有 I、P 片;B 帧有 I、P、B 片;从标准里的表7-5可以得到一些信息。但关于primary_pic_type,需要做进一步分析。与primary_pic_type概念相关的一个概念是primary coded picture。2007-11-15:JM代码研究(二)I 文件define.h作为头文件,被global.h调用,而global.h作为lencod.c的头文件出现。II 在对量化参数和偏移进行初始化的过程中,是如何处理的?解答:1) 有关数据结构和变量说明:input-BitDepthLuma表示input-BitDepthChroma表示2) 代码段说明:首先,函数Init_Qmatrix( )调用函数allocate_QMatrix ( ),而函数allocate_QMatrix ( )里的代码get_mem4Dint(&LevelScale4x4Luma, 2, 6, 4, 4); get_mem5Dint(&LevelScale4x4Chroma, 2, 2, 6, 4, 4); get_mem4Dint(&LevelScale8x8Luma, 2, 6, 8, 8); get_mem4Dint(&InvLevelScale4x4Luma, 2, 6, 4, 4); get_mem5Dint(&InvLevelScale4x4Chroma, 2, 2, 6, 4, 4); get_mem4Dint(&InvLevelScale8x8Luma, 2, 6, 8, 8);给6个数据结构分配存储单元。再加上两个数组:qp_per_matrix单元数量为(MAX_QP + 1 + bitdepth_qp_scale)*sizeof(int)qp_rem_matrix单元数量为(MAX_QP + 1 + bitdepth_qp_scale)*sizeof(int)对于量化偏移矩阵的初始化,通过函数Init_QOffsetMatrix ( )实现。函数Init_QOffsetMatrix ( )调用allocate_QOffsets( ),而后者的部分代码如下, get_mem4Dint(&LevelOffset4x4Luma, 2, max_qp_per, 4, 4); get_mem5Dint(&LevelOffset4x4Chroma, 2, 2, max_qp_per, 4, 4); get_mem4Dint(&LevelOffset8x8Luma, 2, max_qp_per, 8, 8); get_mem2Dshort(&OffsetList4x4input, 15, 16); get_mem2Dshort(&OffsetList8x8input, 5, 64); get_mem2Dshort(&OffsetList4x4, 15, 16); get_mem2Dshort(&OffsetList8x8, 5, 64);3) 在2)中出现的这些数据结构的含义分别是什么?III 关于分层编码问题,涉及到GOP,这可以通过函数init_gop_structure( )看出。如何理解这个概念?解答:1) 首先,我们分析一个数据结构定义和含义,即input-HierarchicalCoding,详细说明参见JM软件参考手册(JM12.2时,对应为4-13页)。2) GOP这个概念是借鉴MPEG2的概念而引入的,这可以参见JVT文档:VCEG-O53。3) interpret_gop_structure( )中出现了一个局部变量coded_frame,并被初始化为0。那么,该变量的含义是什么?4)create_hierarchy( )函数需要分析。它应该和参考手册的说明相呼应(猜测)。2007-11-15:JM代码研究(三)I 请教:在函数getDpbSize ()中pic_size = (active_sps-pic_width_in_mbs_minus1 + 1) * (active_sps-pic_height_in_map_units_minus1 + 1) * (active_sps-frame_mbs_only_flag?1:2) * 384,这里的图像大小单位是什么?其中出现的数字384代表什么?解答:前者表示图像像素数。384表示256+8x8x2(256个亮度色素值,2个8x8色度像素值,分别为u/v)。II 在函数init_global_buffers(void)中,有如下代码memory_size += get_mem2Dint(&PicPos,img-FrameSizeInMbs + 1,2);for (j=0;jFrameSizeInMbs + 1;j+) PicPosj0 = (j % img-PicWidthInMbs); PicPosj1 = (j / img-PicWidthInMbs); 而PicPos是在global.h中定义的全局变量,为int*结构。在具体的编码过程中,它的作用是什么?解答:从for循环结构中,我们清晰地看到,PicPosj0表示宏块在水平方向的坐标(以MB为单位),另一分量则表示竖直方向的坐标(单位MB)。III 函数create_context_memory()中调用了变量initialized,此变量为int*类型,在文件context_ini.c中定义。IV 通过读取文件*.cfg的数据,对编码环境和参数进行设置。只有对编码参数的意义了解清楚,才能正确地实现编解码过程控制。因此,有必要对参数进行详细研究。cfg文件中参数的含义是怎样的?解答:这些控制参数按类别分主要有:1) Files类:FramesToBeEncoded2) Encoder Control类:IntraPeriodEnableOpenGOPIDRIntraEnableFrameSkipNumberReferenceFrames3)B slice类NumberBFrames该参数表示连续Bframe数?其余略。V 请教:Open GOP什么含义?解答:GDR(也就是Open GOP)。关于其进一步信息,有待研究。VI 在确定rdo模式为low时,此时对应的宏块编码模式函数也就确定了,即encode_one_macroblock_low( )函数。在函数内部,首先,对inter编码模式进行处理;然后,对intra模式进行处理。为讨论方便起见,现把范围局限于I8MB进行分析。其处理过程是怎样的?解答:该

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论