当前位置: 首页 > news >正文

高端建设网站建设了网站要维护吗

高端建设网站,建设了网站要维护吗,抖音seo推荐算法,网站建设陆金手指下拉贰拾H.264标准写得比较繁复#xff0c;所以考虑在浏览完Whitepaper之后就开始研读X264代码。X264代码风格还是比较清晰简洁的。根据对标准得理解#xff0c;Picture Order Count在Slice解码的一开始就被提及#xff1a;I0 B1 B2 P3 B4 B5 P6I0 P3 B1 B2 P6 B4 B5于是I0的POC是0所以考虑在浏览完Whitepaper之后就开始研读X264代码。X264代码风格还是比较清晰简洁的。根据对标准得理解Picture Order Count在Slice解码的一开始就被提及I0 B1 B2 P3 B4 B5 P6I0 P3 B1 B2 P6 B4 B5于是I0的POC是0P3的POC是3B1是1……为了支持H264复杂的帧存机制X264以专门的一个模块frame.c进行处理。common/frame.c中包括一组帧缓冲操作函数。包括对帧进行FILO和FIFO存取空闲帧队列的相应操作等。以下逐个函数分析encoder.c中编码一帧的函数x264_encoder_encode中有关frame的调用x264_reference_update这个函数里最主要的工作的是将上一个参考帧放入参考帧队列并从空闲帧队列中取出一帧作为当前的参考工作帧即解码操作的目的帧即h-fdec。x264_t结构体维护着CODEC的诸多重要信息其中成员frames是一个指示和控制帧编码过程的结构。其中current是已经准备就绪可以编码的帧其类型已经确定next是尚未确定类型的帧unused用于回收不使用的frame结构体以备今后再次使用。frames结构体中i_input指示当前输入的帧的播放顺序序号。i_delay设置为由B帧个数线程个数确定的帧缓冲延迟在多线程情况下为i_delay i_bframe i_threads - 1。而判断B帧缓冲填充是否足够则通过条件判断h-frames.i_input h-frames.i_delay 1 - h-param.i_threads。x264_encoder_encode每次会以参数送入一帧待编码的帧pic_in函数首先会从空闲队列中取出一帧用于承载该新帧而它的i_frame被设定为播放顺序计数如fenc-i_frame h-frames.i_input。x264_encoder_encode在根据上述判据确定B帧缓冲充满的情况下才进行后续编码工作。当当前队列current队列可用帧为0时需要对next队列中的帧进行判决需要进行如下过程1. 调用x264_slicetype_decide这个函数确定当前条带帧的类型其中首先调用x264_ratecontrol_slice_type依据码率控制逐个求出next列表中所有帧的类型虽然在当前并不全部用到见后。随后统计审查并调整next列表保证IDR帧满足有关最大关键帧间隔的要求的正常出现即针对frm-i_frame - h-frames.i_last_idr h-param.i_keyint_max作判断。审查按顺序针对所有被判定为B系或AUTO类型的帧进行这些帧在审核过程中被确认为B帧直到遇到第一个不是这样的帧。如果某个帧被指定为IDR则一个GOP在它之前结束。2. 而后即将next列表中已经判定的一系列帧先后是一些B帧和一个非B帧转移到current列表中。在这个过程中原始序列播放顺序B0, B1, B2, P转移后的顺序为P, B0, B1, B2。在使用bframe_pyramid模式时中间的B帧要前置即上述顺序变为P, B1, B0, B2。此时就可以从current队列中取出一帧进行编码现在记这帧叫h-fenc。首先做几项和帧有关的设置工作1. 如果f_enc是IDR则将最近IDR序号标记h-frames.i_last_idr设置为i_frame。2. 根据f_enc的类型确定NAL和SLICE类型相关参数。 3. 设置POC为2 * (h-fenc-i_frame - h-frames.i_last_idr)。并使得h-fdec和h-fenc的主要帧参数一致。随后进行以下一些过程x264_reference_build_list在这个函数中我们将遇到参考帧列表h-frames.reference和H.264很有特色的双列表h-fref0、h-fref1。前者中放置了所有可用于参考的参考帧。首先将所有reference列表中的帧按照POC和h-fenc的POC的大小关系不同复制到双列表中其中h-fref0放置POC较小的那些。然后对双列表进行排序使得h-fref0中的帧POC按从大到小排列h-fref1按从小到大排列于是这两个列表中靠前的帧的POC比较接近当前帧h-fenc。在这里一个特殊的情况是对于P帧只需要用到列表h-fref0做参考其排序依据是i_frame_num而不是POC因此需要对这种情况的列表h-fref0置位需重排序标记。最后对双列表的长度做限制。x264_ratecontrol_start码率控制初始化在以后专门的话题中论述。在初始化后从码率控制体中获得全局QP值i_global_qp x264_ratecontrol_qp( h )。如果当前是B条带帧则调用x264_macroblock_bipred_init该函数设置一些参考帧关系矩阵关系矩阵以fref0的索引为行坐标以fref1的索引为列坐标。主要包括dist_scale_factorbipred_weight矩阵值主要由相应帧的POC决定。后续讨论。x264_slice_init内部调用x264_slice_header_init它对Header进行配置含义以后讨论。bs_init初始化码流工作上下文。随后将帧类型表现到码流中。接着写SEISPS和PPS。然后就是最关键的写条带即主要的编码工作开始的地方x264_slices_write这里通过x264_stack_align调用x264_slice_write为了将栈做4字节对齐以提高运行效率。x264_slice_write函数是编码一帧的关键函数将在下一章中论述。宏块结构这里主要有一下几个过程1. 初始化h-stat.frame即全部清零。2. 写条带头x264_slice_header_write即把刚才x264_slice_header_init设置的一些参数写入。3. 如果是CABAC编码则初始化CABAC。有关CABAC在后续相关章节讨论。4. 遍历一帧中的所有宏块这是编码的主要部分for( mb_xy h-sh.i_first_mb, i_skip 0; mb_xy h-sh.i_last_mb; )其中sh.i_first_mb和sh.i_last_mb在x264_slice_header_init中赋值分别是0和宏块行列数乘积。5. 最后输出码流尾部。其间穿插一些必要的初始化和配置。本章着重分析编码的主要部分包括一下过程需要注意的是这里讨论的宏块是固定尺寸的即Y分量计为16x16。而运动宏块的尺寸则是多变的1. 首先根据宏块的序号得出宏块的坐标。然后统计当前宏块的码流位置int mb_spos bs_pos(h-out.bs) x264_cabac_pos(h-cabac);2. 然后出现一句if( i_mb_x 0 )x264_fdec_filter_row( h, i_mb_y );这是对行进行去块过程。详细情况专门论述。3. 随后是x264_macroblock_cache_load这里主要进行当前宏块和相关信息的提取。这个函数比较大也在专题中论述。4. 接下去进行解码分析操作x264_macroblock_analyse5. 以及解码实体x264_macroblock_encode6. 而后处理码流输出也分CABAC和CAVLC两种情况。7. 接着出现x264_macroblock_cache_save和x264_macroblock_cache_load对应保存处理完的宏块。8. 更新宏块统计下面首先看编码主体x264_macroblock_encode的结构。该函数按不同宏块类型情况进行不同的处理。包括如下类型P_SKIPB_SKIPI_16x16 - 一次完成一个块h-mb.pic.p_fdec[0]的编码。用函数指针h-predict_16x16[i_mode]进行帧内预测I_8x8   - 分4次完成。h-mb.pic.p_fdec[0][8 * (i1) 8 * (i1) * FDEC_STRIDE]指定了当前位置。即[0][1][2][3]用函数指针完成4个宏块的帧内预测I_4x4 - 分16次完成。h-mb.pic.p_fdec[0][4 * block_idx_x[i] 4 * block_idx_y[i] * FDEC_STRIDE]指定当前位置。根据block_idx_x和block_idx_y的定义其顺序是[0][1][4][5][2][3][6][7][8][9][c][d][a][b][e][f]用函数指针完成4个宏块的帧内预测Inter - 首先进行运动补偿。见后续讨论。然后分多种情形1. 无损压缩情况h-mb.b_lossless TRUE必须采用4x4DCT根据上述I_4x4中描述的顺序遍历16个4x4块。这里调用的函数是zigzag_sub_4x4_field完成残差。无损情况直接发送残差2. 指定采用8x8DCT情况h-mb.b_transform_8x8 TRUE首先是作残差并DCT的函数sub16x16_dct8。然后对4个8x8的DCT系数块进行处理包括可能的去噪x264_denoise_dct量化标量/矢量。有关量化也在专题中论述。量化完成后进行系数扫描对角平衡的普通扫描。3. 一般情况接着处理色差分量如果是Intra的则进行预测。最后写Coded Block Pattern。帧内预测环路内滤波H.264环路内滤波顾名思义在编码侧开启后解码部分必须跟随开启因此是该视频编码方案的不可分割的组成部分。以下整理了Baseline情形下环路滤波的四种情形All cases that may exist for BaselineBs 4: either is intra, MB edgeBs 3: either is intra, block edgeBs 2: both are inter, either is codedBs 1: both are inter neither is coded, different ref pictures, either MV component is no smaller than 4Bs 0: o.w.以T264为例环路滤波入口函数以光栅扫描顺序对所有宏块实施deblock_mb。deblock_mb完成一个宏块的滤波它包含以下步骤1. 水平相邻宏块滤波即对与mb_xy-1宏块的边界滤波以及内部3条纵向块边界滤波2. 垂直相邻宏块滤波即对与mb_xy-mb_stride宏块的边界滤波以及内部3条横向块边界滤波每条边界长度均为16个像素等分成4份每个对应一个最小块大小的边界以此为单元进行滤波。对每条边界调用get_strength获得这4个部分的Bs值。本章讨论的代码主要位于common/predict.c中。x264_macroblock_cache_load函数在每个宏块解码之前初始化某些状态在x264_slice_write函数的宏块处理循环中被调用。i_mb_xy:   当前宏块的索引i_mb_4x4:  当前宏块中第一个4x4块的索引i_mb_8x8:  当前宏块中第一个8x8块的索引i_top_y:   上方宏块的y索引i_top_xy:  上方宏块的索引i_top_4x4: 当前宏块中第一个4x4块上方的4x4块的索引i_top_8x8: 当前宏块中第一个8x8块上方的8x8块的索引这里首先初始化和当前宏块毗邻的已解码块。这里用到x264_scan8它指示如下扫描结构0 1 2 3 4 5 6 701   0 1   0 1 4 52   2 3   2 3 6 73         8 9 C D4   0 1   A B E F5   2 3在空缺部分恰好可以填入相应宏块的毗邻块。以下逐个各种分析预测情况对于16x16的块predict_16x16共7种预测模式H, V, DC, P, LEFT, TOP, 128predict_16x16_h用左侧相邻16x16块的右侧像素沿水平方向覆盖predict_16x16_v用上方相邻16x16块的底行像素沿竖直方向覆盖predict_16x16_p右上左下均值预测覆盖注意均值生成predict_16x16_dc用左侧边沿和上方边沿的均值作为DC预测值进行单一覆盖predict_16x16_dc_left只用左侧边沿进行DC单一覆盖predict_16x16_dc_top只用上方边沿进行DC单一覆盖predict_16x16_dc_128用128进行单一覆盖对于8x8的色差块predict_8x8c_dc_128用128进行单一覆盖predict_8x8c_dc_left上下两个4行分别以对应左边沿4个像素均值单一覆盖predict_8x8c_dc_top左右两个4列分别以对应上边沿4个像素均值单一覆盖predict_8x8c_dcs0 s1s2 b0 b1s3 b2 b3s?是边沿4像素组4个4x4块分别用s0,s2均值s1均值s3均值和s1,s3均值单一覆盖predict_8x8c_h用左侧相邻8x8块的右边沿像素沿水平方向覆盖predict_16x16_v用上方相邻16x16块的底行像素沿竖直方向覆盖predict_8x8c_p右上左下均值预测覆盖注意均值生成对于4x4的块这是H264文档经常拿来作demo的predict_4x4_dc_128用128进行单一覆盖predict_4x4_dc_left用左边沿4个像素均值单一覆盖predict_4x4_dc_top用上边沿4个像素均值单一覆盖predict_4x4_dc用左侧和上方边沿共8个像素均值单一覆盖predict_4x4_h用左侧相邻4x4块的右边沿像素沿水平方向覆盖predict_4x4_v用上方相邻4x4块的底行像素沿竖直方向覆盖predict_4x4_ddl右上至左下预测覆盖注意均值生成predict_4x4_ddr左上至右下预测覆盖注意均值生成predict_4x4_vr左上到右下偏下预测覆盖注意均值生成predict_4x4_hd左上到右下偏右预测覆盖注意均值生成predict_4x4_vl右上到左下偏下预测覆盖注意均值生成predict_4x4_hu左下到右上偏右预测覆盖注意均值生成对于8x8亮度块edge中存放predict_8x8_dc_128用128进行单一覆盖predict_8x8_dc_left用左侧块边沿8个像素均值单一覆盖predict_8x8_dc_top用上方块边沿8个像素均值单一覆盖predict_8x8_dc用左侧块和上方块边沿共16个像素均值单一覆盖predict_8x8_h用左侧边沿预测覆盖predict_8x8_v用上方边沿预测覆盖predict_8x8_ddl右上到左下预测覆盖注意均值生成predict_8x8_ddr左上到右下预测覆盖注意均值生成predict_8x8_vr左上到右下偏下预测覆盖注意均值生成predict_8x8_hd左上到右下偏右预测覆盖注意均值生成predict_8x8_vl右上到左下偏下预测覆盖注意均值生成predict_8x8_hu左下到右上偏右预测覆盖注意均值生成以上“注意均值生成”指预测值一般由起点决定起点由反向延长线确定起点2倍权重和两侧点构成均值。例如45度均值为以起始点对应45度位置的点作为中心2倍权重其两侧点作为补充形成的均值。 H.264标准规定首先由macroblock层的mb_type导出intra块的预测类型macroblock prediction mode其中包含子块尺度信息有4x48x8和16x16三种。4x4和8x8按照标准由变换尺寸区分4x4是最常用的模式。在确定预测类型之后对于含16个子块的4x4模式每个子块的预测模式即上述讨论由标准规定的判决算法给出...
http://www.sadfv.cn/news/331434/

相关文章:

  • dedecms 门户网站制作wordpress go.php
  • 建站平台是给谁用的培训网站计时怎么破
  • 上海建设网站便宜的广东响应式网站建设平台
  • 做网站在手机显示怎么很乱网站策划专员所需知识
  • 哪些网站是jsp做的服装外贸行业发展趋势
  • 哪些网站做推广效果好网站的优化外包
  • 惠州网站建设选惠州邦电脑网站转换手机网站怎么做
  • 贵州建设局网站怎么找企业做网站
  • 安卓网站开发视频大连模板网站制作公司
  • 东莞专业做淘宝网站推广重庆建站程序
  • 西樵网站建设管理咨询公司网站
  • google站长工具傻瓜式搭建网站
  • 网站建设如何选择良好的服务器网站开通告知书
  • 中国建设银行网站太慢了建设自己的网站
  • 厦门网站建设公司闽icpjcms内容管理系统
  • 网站做微信支付宝支付网站logo显示
  • 呼和浩特建设网站广东重工建设监理有限公司官方网站
  • 微信推广和网站推广哪个好南京发布最新通报
  • 简单做动画的网站好听的域名取名
  • 建立一个网站需要什么网站开发会计分录
  • 元做网站江苏省交通运输厅门户网站建设管理中心
  • 信息技术教案 建设我们的网站wordpress 管理 主题
  • 企业网站会员功能专做水果店加盟的网站
  • 漯河网站seowordpress 图集插件
  • 大连模板网站制作wordpress获取菜单链接
  • 北京建网站 优帮云关于旅行的网站怎样做
  • 阳谷网站建设网络推广品牌便宜网站建设
  • 山东烟台城乡建设学校官方网站软件下载网站开发 论文
  • 建设银行360网站登录不了深圳手机网站设计
  • 视觉营销网站建设规划分析深圳做网站比较好