源代码位于“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设置的选项
如:preset, tune,profile,level,crf,vbr, cbr, qp,
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;
 //把AVCodecContext的值(主要是编码时候的一些通用选项)映射到x264_param_t  
//把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 x264接口源代码简单分析

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

  2. Android系统进程间通信(IPC)机制Binder中的Client获得Server远程接口过程源代码分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6633311 在上一篇文章中,我 们分析了And ...

  3. Android系统进程间通信Binder机制在应用程序框架层的Java接口源代码分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6642463 在前面几篇文章中,我们详细介绍了A ...

  4. Android应用程序进程启动过程的源代码分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址: http://blog.csdn.net/luoshengyang/article/details/6747696 Android 应用程序框架层创 ...

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

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

  6. XBMC源代码分析 6:视频播放器(dvdplayer)-文件头(以ffmpeg为例)

    XBMC分析系列文章: XBMC源代码分析 1:整体结构以及编译方法 XBMC源代码分析 2:Addons(皮肤Skin) XBMC源代码分析 3:核心部分(core)-综述 XBMC源代码分析 4: ...

  7. XBMC源代码分析 4:视频播放器(dvdplayer)-解码器(以ffmpeg为例)

    XBMC分析系列文章: XBMC源代码分析 1:整体结构以及编译方法 XBMC源代码分析 2:Addons(皮肤Skin) XBMC源代码分析 3:核心部分(core)-综述 本文我们分析XBMC中视 ...

  8. LIRe 源代码分析 3:基本接口(ImageSearcher)

    ===================================================== LIRe源代码分析系列文章列表: LIRe 源代码分析 1:整体结构 LIRe 源代码分析 ...

  9. LIRe 源代码分析 2:基本接口(DocumentBuilder)

    ===================================================== LIRe源代码分析系列文章列表: LIRe 源代码分析 1:整体结构 LIRe 源代码分析 ...

随机推荐

  1. 3.1常用类(java学习笔记)包装类及日期类

    一.包装类 java是一门面向对象的语言,秉承一切皆对象的思想. 可java中有一些基本数据类型并不是对象,有时可能需要将它们变为对象. 这时就需要用到我们的包装类了. 基本数据类型 包装类 int ...

  2. 【spring data jpa】spring data jpa的in查询

    如下: List<Dealer> findDealersByTidAndUidIn(String tid,List<String> uidList); 在dao层里面直接写这个 ...

  3. 【Linux】CentOS7 alien命令 转化deb 与 rpm的相互转化

    -d, --to-deb Make debian packages. This is the default. -r, --to-rpm Make rpm packages. -t, --to-tgz ...

  4. VUE -- ejs模板的书写

    1.EJS是一个简单高效的模板语言,通过数据和模板,可以生成HTML标记文本.可以说EJS是一个JavaScript库,EJS可以同时运行在客户端和服务器端,客户端安装直接引入文件即可,服务器端用np ...

  5. Redis的数据类型之String

    Redis主要支持的数据类型有5种:String ,Hash ,List ,Set ,和 Sorted Set. Redis数据类型String string类型在redis中是最常见的类型,valu ...

  6. 转: 通过Servlet生成验证码图片

    孤傲苍狼 只为成功找方法,不为失败找借口! javaweb学习总结(九)—— 通过Servlet生成验证码图片 一.BufferedImage类介绍 生成验证码图片主要用到了一个BufferedIma ...

  7. 3. Spring Boot热部署【从零开始学Spring Boot】

    转载:http://blog.csdn.net/linxingliang/article/details/51584549 在编写代码的时候,你会发现我们只是简单把打印信息改变了下,就需要重新部署,如 ...

  8. Splay树(多操作)——POJ 3580 SuperMemo

    相应POJ题目:点击打开链接 SuperMemo Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 11309   Accept ...

  9. Java 二分法查找

    算法:当数据量很大适宜采用该方法.采用二分法查找时,数据需是有序不重复的. 基本思想:假设数据是按升序排序的,对于给定值 x,从序列的中间位置开始比较,如果当前位置值等于 x,则查找成功:若 x 小于 ...

  10. Python类定义和类继承详解

    类实例化后,可以使用其属性,实际上,创建一个实例之后,可以通过类名访问其属性,如果直接使用类名修改其属性,那么直接影响已经实例化的对象. 类的私有属性: __private_attrs 两个下划线开头 ...