H.264编码系统比较复杂,这里是它的几个比较重要的算法:

1. Configure()函数,用于解析命令行参数,读取配置文件,其中,ac表示命令行参数数量,av表示命令行参数。void Configure(int ac, char *av[ ]){……}

2. AllocNalPayloadBuffer()函数,用于初始化NAL模块,即分配NAL_Payload_buffer缓冲区。AllocNalPayloadBuffer(){……}

3. init_poc()函数的作用是用适合的参数初始化进程结构。init_poc(){……}

4. init_img()函数的作用是用合适的参数初始化图像结构,其中输入参数结构为inp_par *inp;输出参数结构为img_par *img。

5. malloc_picture()函数用于按照数据结构分配图像结构,其返回值为一个指向图像的指针。Picture *malloc_picture(){……}

6. init_rdopt()函数产生用于RD_最优化模式判断结构。void init_rdopt(){……}

7. init_dpb()函数分配用于解码图像所需的缓冲区并初始化值。void init_dpb(){……}

8. init_out_buffuer()函数用于初始化输出缓冲区以便直接输出。

9. init_global_buffers()函数为Global.h文件中定义的全局缓冲区分配动态内存,分配的内存必须在free_global_buffers()函数中释放。其中,输入参数为inp_par *inp和图像参数结构img_par *img;输出参数为分配的内存字节数。

10.create_context_memory()函数用于创建关联内存。

11.Init_Motion_Search_Module()函数用于初始化运动搜索。

12.rc_init_seq()函数用于初始化速率控制参数。

13.encode_one_frame()函数为帧编码函数。

关于encode_one_frame ()中的几个主要函数的简单说明

encode_one_frame ()
从这个函数开始才开始真正进入编码阶段,在次之前都是做的一些准备工作,但是这个函数不是核心函数,这个函数的主要功能是通过调用其他的函数对一帧数据进行编码,每调用该函数一次,处理完一帧数据。
刚进入encode_one_frame (),前面几个函数如put_buffer_frame();CalculateFrameNumber(); init_frame ();等都比较简单。
frame_picture (frame_pic)函数是encode_one_frame ()这个函数中的主要函数!完成一帧数据的编码是通过这个函数来实现的。下面来看看这个函数具体做了那些事情。
进入函数,首先为要编码的图像申请空间并进行初始化,比较简单,没什么好说的。看看这个函数code_a_picture(frame);看函数名就知道它是这个函数中的最重要的函数。继续跟踪下去,看看code_a_picture(frame)这个函数的内容。进入这个函数体,
直接看FmoInit()这个函数,这个函数与片组相关,确定宏块到片组的映射关系。主要调用
FmoGenerateMapUnitToSliceGroupMap(img, pps);
  FmoGenerateMBAmap(img, sps);
这两个函数,前面一个函数主要根据slice_group_map_type这个变量决定片到片组的映射关系,既确定那些片属于同一个片组。FmoGenerateMBAmap()确定宏块到片的映射,既那些宏块属于一个片。
FmoStartPicture ()得到每一个片中的第一个宏块地址。
看看下面这个循环

while (NumberOfCodedMBs < img->total_number_mb)       // loop over slices
  {
    while (!FmoSliceGroupCompletelyCoded (SliceGroup))
    {
      NumberOfCodedMBs += encode_one_slice (SliceGroup, pic);
      FmoSetLastMacroblockInSlice (img->current_mb_nr);
      // Proceed to next slice
      img->current_slice_nr++;
      stat->bit_slice = 0;
    }
  }
可以说是编码器的核心地方,外层循环以片为单位循环编码所有片,内层循环以片组为单位循环处理每个片组中的所有片数据。
顺便说一下,若想一个frame中有多个slice,配置文件中设置如下的参数可以实现
##########################################################################################
# Error Resilience / Slices
##########################################################################################
SliceMode             =  0   # Slice mode (0=off 1=fixed #mb in slice 2=fixed #bytes in slice 3=use callback)
SliceArgument         = 50   # Slice argument (Arguments to modes 1 and 2 above)
num_slice_groups_minus1 = 0  # Number of Slice Groups Minus 1, 0 == no FMO, 1 == two slice groups, etc.
slice_group_map_type    = 6  # 0:  Interleave, 1: Dispersed,    2: Foreground with left-over,
                             # 3:  Box-out,    4: Raster Scan   5: Wipe
                             # 6:  Explicit, slice_group_id read from SliceGroupConfigFileName
slice_group_change_direction_flag = 0    # 0: box-out clockwise, raster scan or wipe right,
                                         # 1: box-out counter clockwise, reverse raster scan or wipe left
slice_group_change_rate_minus1    = 85   #
SliceGroupConfigFileName          = "sg6conf.cfg"   # Used for slice_group_map_type 0, 2, 6
UseRedundantSlice     = 0    # 0: not used, 1: one redundant slice used for each slice (other modes not supported yet)

SliceMode             =  0  为默认值,既不使用分组,也就是一帧为一个slice。
具体的可以参照相应资料。
下面看看这个函数中的核心函数encode_one_slice();
看名字也知道是对一个slice进行编码!下面进入这个函数体:
CurrentMbAddr = FmoGetFirstMacroblockInSlice (SliceGroupId); 取得当前片的第一个宏块,init_slice(),为当前要编码的slice申请一个Slice类型结构体,并进行初始化。
len = start_slice ()函数,写slice_header.
while (end_of_slice == FALSE)
{
...............
........................
}
这个循环对每个slice进行编码,用帧或场方式。不管是哪种编码方式,核心函数是encode_one_macroblock ();可以说这才是整个编码器的核心部分!关于这个函数的结构可以参照firsttime 的 encode_one_macroblock()的程序结构——Wisting
(说明:由于本人主要研究的不是jm代码,要是有写的不对的地方,请指教共同学习,关于其中涉及的各个函数,哪位熟悉的话,如果愿意,可以跟帖补充具体的内容)

H.264编码系统几个比较重要的算法相关推荐

  1. H.264编码的介绍

    H.264编码的介绍 关键技术 1.帧内预测编码 帧内编码用来缩减图像的空间冗余.为了提高H.264帧内编码的效率,在给定帧中充分利用相邻宏块的空间相关性,相邻的宏块通常含有相似的属性.因此,在对一给 ...

  2. C++实现RTMP协议发送H.264编码及AAC编码的音视频

    C++实现RTMP协议发送H.264编码及AAC编码的音视频 RTMP(Real Time Messaging Protocol)是专门用来传输音视频数据的流媒体协议,最初由Macromedia 公司 ...

  3. 开发直播APP软件一定要了解的H.264编码,即时通讯中的战斗机

    开发直播APP软件一定会涉及即时通讯,即时通讯系统在直播系统中的主要作用是实现观众与主播.观众与观众之间的文字.音频.视频互动,现在比较火的主播连麦PK等功能的背后都显现着即时通讯的影子,而在即时通讯 ...

  4. RTMP协议发送H.264编码及AAC编码的音视频,实现摄像头直播

    RTMP协议发送H.264编码及AAC编码的音视频,实现摄像头直播 摘要: RTMP协议发送H.264编码及AAC编码的音视频,实现摄像头直播 RTMP(Real Time Messaging Pro ...

  5. 视频基础知识:浅谈视频会议中H.264编码标准的技术发展

    浅谈视频会议中H.264编码标准的技术发展 浅谈视频会议中H.264编码标准的技术发展 数字视频技术广泛应用于通信.计算机.广播电视等领域,带来了会议电视.可视电话及数字电视.媒体存储等一系列应用,促 ...

  6. MediaCoder的CUDA H.264编码技术预览及测试报告

    MediaCoder的CUDA H.264编码技术预览及测试报告 近两年NVIDIA的CUDA技术似乎成为业界新宠,其优良的科学运算加速能力确实首屈一指,引领着并行运算潮流,各行业都纷纷采用它来加速, ...

  7. H.265编码和H.264编码的区别

    目前很多摄像机采用了H.265的编码标准,H.264编码的摄像机逐渐减少,为什么H.265会流行?H.264和H.265有何不同? 一.什么是H.265 H.265是ITU-TVCEG继H.264之后 ...

  8. 开发那些事儿:在Flv.js前端播放器中解析并绘制H.264编码中的SEI信息

    流媒体中的SEI是指补充增强信息(Supplemental Enhancement Information),它提供了向视频码流中加入信息的办法,是H.264/H.265视频压缩标准的特性之一.SEI ...

  9. 利用FFmpeg编码器将JPG图片进行H.264编码原理

    利用FFmpeg编码器将JPG图片进行H.264编码原理 文章目录 利用FFmpeg编码器将JPG图片进行H.264编码原理 整体的编码流程 将JPG或BMP编码为YUV 利用FFmpeg将YUV格式 ...

最新文章

  1. ruby生成C++头文件引用关系图
  2. C#导入Excel2010出现加载DLL失败或者类库未注册的问题,0x8002801D或者0x80029C4A .
  3. python代码翻译-用python实现百度翻译的示例代码
  4. LiquidCrystal库函数
  5. SQL group by 和 order by 、where、having
  6. 【数据竞赛】Kaggle实战之特征工程篇-20大文本特征(下)
  7. python单元测试工具_Python的单元测试工具——unittest小结
  8. javascript模版引擎-tmpl的bug修复与性能优化
  9. [2021.1.13多校省选模拟2]T1(动态规划/轮廓线dp)
  10. Matlab将数字数组转换为字符数组(用于标明点号)
  11. swift Tablview中cell 的用withtag方法绑定里面的button
  12. 黑马程序员全套Java教程_Java基础入门视频教程零基础自学Java必备教程视频讲义(3)
  13. 基于JavaWeb的物流管理系统的设计与实现
  14. IV值区间与预测能力关系
  15. 联通智能城域网,到底有什么特别?
  16. dell服务器u盘启动找不到硬盘,dell台式机u盘装系统启动找不到硬盘怎么办?dell找不到硬盘原因...
  17. Adafruit GFX字体制作
  18. 电路原理笔记整理_【盛世清北】2021清华大学827电路原理考研笔记-清华考研辅导班...
  19. HEXO+ICARUS主题配置安装经验分享
  20. 我的世界java刷雪机_我的世界自动造/刷雪机制作图文教程

热门文章

  1. 重装IDEA再也不愁了,一招搞定同步个人配置!
  2. 紧随Java 16,Spring Framework 5.3.5 发布:涵盖JDK 16的支持!
  3. 一条关于互联网创业公司健康与否的判断法则
  4. 进阶:秒杀系统是如何设计的?
  5. Spring Boot整合 Sentry 监控项目日志
  6. 月薪8k 和 月薪28K的程序员差距在哪里?
  7. 命令行编译_新鲜货:C++ Build Insights告诉你为啥你的代码编译这么慢
  8. mnn op name is empty or dup
  9. module ‘tensorflow‘ has no attribute ‘Tensor‘
  10. YOLOv3在OpenCV4.0.0/OpenCV3.4.2上的C++ demo实现