源代码位于“libavcodec/libx264.c”中。正是有了这部分代码,使得FFmpeg可以调用libx264编码H.264视频。
 从图中可以看出,libx264对应的AVCodec结构体ff_libx264_encoder中设定编码器初始化函数是X264_init(),编码一帧数据的函数是X264_frame(),编码器关闭函数是X264_close()。
X264_init()调用了如下函数:
[libx264 API] x264_param_default():设置默认参数。
[libx264 API] x264_param_default_preset():设置默认preset。
convert_pix_fmt():将FFmpeg像素格式转换为libx264像素格式。
[libx264 API] x264_param_apply_profile():设置Profile。
[libx264 API] x264_encoder_open():打开编码器。
[libx264 API] x264_encoder_headers():需要全局头的时候,输出头信息。
X264_frame()调用了如下函数:
[libx264 API] x264_encoder_encode():编码一帧数据。
[libx264 API] x264_encoder_delayed_frames():输出编码器中缓存的数据。
encode_nals():将编码后得到的x264_nal_t转换为AVPacket。
X264_close()调用了如下函数:
[libx264 API] x264_encoder_close():关闭编码器。
  1. //libx264对应的AVCodec结构体
  2. AVCodec ff_libx264_encoder = {
  3. .name             = "libx264",
  4. .long_name        = NULL_IF_CONFIG_SMALL("libx264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10"),
  5. .type             = AVMEDIA_TYPE_VIDEO,
  6. .id               = AV_CODEC_ID_H264,
  7. .priv_data_size   = sizeof(X264Context),
  8. .init             = X264_init,
  9. .encode2          = X264_frame,
  10. .close            = X264_close,
  11. .capabilities     = CODEC_CAP_DELAY | CODEC_CAP_AUTO_THREADS,
  12. .priv_class       = &x264_class,
  13. .defaults         = x264_defaults,
  14. .init_static_data = X264_init_static,
  15. };
priv_class指向一个x264_class静态结构体,该结构体是libx264对应的AVClass,定义如下:
  1. static const AVClass x264_class = {
  2. .class_name = "libx264",
  3. .item_name  = av_default_item_name,
  4. .option     = options,//选项
  5. .version    = LIBAVUTIL_VERSION_INT,
  6. };
option指向一个options[]静态数组,其中包含了libx264支持的AVOption选项
  1. //FFmpeg针对libx264提供的可以通过AVOption设置的选项
x264opts:x264 options
x264-params:Override the x264 configuration using a :-separated list of key=value parameters
X264_init:
主要将各种选项值传递给libx264。这些选项有两个来源:AVCodecContext和X264Context。
AVCodecContext中包含了编码器的一些通用选项,而X264Context包含了一些libx264特有的选项。
X264Context *x4 = avctx->priv_data;  
//把AVCodecContext的值(主要是编码时候的一些通用选项)映射到x264_param_t  :
  1. if (avctx->gop_size >= 0)
  2. x4->params.i_keyint_max         = avctx->gop_size;
//把X264Context中的信息(主要是针对于libx264的一些选项)映射到x264_param_t  
  1. if(x4->x264opts){
  2. const char *p= x4->x264opts;
  3. while(p){
  4. char param[256]={0}, val[256]={0};
  5. if(sscanf(p, "%255[^:=]=%255[^:]", param, val) == 1){
  6. OPT_STR(param, "1");
  7. }else
  8. OPT_STR(param, val);
  9. p= strchr(p, ':');
  10. p+=!!p;
  11. }
  12. }
  13. if (x4->x264_params) {
  14. AVDictionary *dict    = NULL;
  15. AVDictionaryEntry *en = NULL;
  16. if (!av_dict_parse_string(&dict, x4->x264_params, "=", ":", 0)) {
  17. while ((en = av_dict_get(dict, "", en, AV_DICT_IGNORE_SUFFIX))) {
  18. if (x264_param_parse(&x4->params, en->key, en->value) < 0)
  19. av_log(avctx, AV_LOG_WARNING,
  20. "Error parsing option '%s = %s'.\n",
  21. en->key, en->value);
  22. }
  23. av_dict_free(&dict);
  24. }
  25. }
X264_frame:
 AVFrame --> x264_picture_t --> x264_nal_t --> AVPacket  
调用encode_nals()将x264_nal_t转换成了AVPacket(可能有多个NALU,作用就是将多个x264_nal_t合并为一个AVPacket )

FFmpeg与libx264 x264接口源代码简单分析的更多相关文章

  1. FFmpeg与libx264接口源代码简单分析

    ===================================================== H.264源代码分析文章列表: [编码 - x264] x264源代码简单分析:概述 x26 ...

  2. FFmpeg的H.264解码器源代码简单分析:环路滤波(Loop Filter)部分

    ===================================================== H.264源代码分析文章列表: [编码 - x264] x264源代码简单分析:概述 x26 ...

  3. FFmpeg的H.264解码器源代码简单分析:宏块解码(Decode)部分-帧间宏块(Inter)

    ===================================================== H.264源代码分析文章列表: [编码 - x264] x264源代码简单分析:概述 x26 ...

  4. FFmpeg的H.264解码器源代码简单分析:熵解码(Entropy Decoding)部分

    ===================================================== H.264源代码分析文章列表: [编码 - x264] x264源代码简单分析:概述 x26 ...

  5. FFmpeg的H.264解码器源代码简单分析:解码器主干部分

    ===================================================== H.264源代码分析文章列表: [编码 - x264] x264源代码简单分析:概述 x26 ...

  6. FFmpeg的H.264解码器源代码简单分析:解析器(Parser)部分

    ===================================================== H.264源代码分析文章列表: [编码 - x264] x264源代码简单分析:概述 x26 ...

  7. FFmpeg的H.264解码器源代码简单分析:概述

    ===================================================== H.264源代码分析文章列表: [编码 - x264] x264源代码简单分析:概述 x26 ...

  8. FFmpeg与libx264 x264接口对应关系源代码分析

    源代码位于“libavcodec/libx264.c”中.正是有了这部分代码,使得FFmpeg可以调用libx264编码H.264视频.  从图中可以看出,libx264对应的AVCodec结构体ff ...

  9. FFmpeg的H.264解码器源代码简单分析

    本文简单记录FFmpeg中libavcodec的H.264解码器(H.264 Decoder)的源代码.这个H.264解码器十分重要,可以说FFmpeg项目今天可以几乎“垄断”视音频编解码技术,很大一 ...

随机推荐

  1. bootstrap 重写JS的alert、comfirm函数

    原理是使用bootstrap的Modal插件实现. 一.在前端模板合适的地方,加入Modal展现div元素. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 ...

  2. winrt 页面进入动画

    private async void DoAnimistion(){Storyboard storyboard = new Storyboard(); using (IEnumerator<De ...

  3. BestCoder22 1003.NPY and shot 解题报告

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5144 题目意思:有个人抛物体,已知抛的速度和高度,问可以抛到的最远距离是多少.即水平距离. 做的时候是 ...

  4. oracle触发器,一个表新增、修改的同时同步另一张表

    oracle创建触发器,把本地新增.修改数据过程同步到另一个服务器上去. 如果是本地,加数据库名即可.如果是远程服务器,不是一台机器,做一个db_link操作即可. ----------------- ...

  5. 【leetcode】Wildcard Matching(hard) ★ 大神太牛了

    Implement wildcard pattern matching with support for '?' and '*'. '?' Matches any single character. ...

  6. WIN7 64位系统下,右下角的声音和电源图标不见的解决办法

    近日,电脑突然出现任务栏右下角的声音和电源图标消失不见的问题,重启仍旧没有修复,后来找到了解决办法 解决办法: 1.Ctrl+Shift+Esc键调出windows资源管理器. 2.找到进程中的exp ...

  7. volatile和const

    volatile可理解为“编译器警告指示字” volatile用于告诉编译器必须每次去内存中取变量值 volatile主要修饰可能被多个线程访问的变量 volatile也可以修饰可能被未知因数更改的变 ...

  8. PHP之MVC学习

    代码架构进货过程 one,混编 嵌入式脚本语言PHP html与php混编的编码方式 two,显示和逻辑相分离 最后,需要将显示和逻辑的结果放在一起! 需要在 php页面,将html代码 载入才可以! ...

  9. 使用 Laravel 框架:成为微信公众平台开发者

    转: http://ninghao.net/blog/1441 作者:王皓发布于:2014-05-30 13:16更新于:2014-05-31 12:05 我们可以使用Laravel 框架为微信公众平 ...

  10. ytu 1064: 输入三个字符串,按由小到大的顺序输出(水题,字符串处理)

    1064: 输入三个字符串,按由小到大的顺序输出 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 471  Solved: 188[Submit][Sta ...