源代码位于“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. java的几个特性

    前言 本文主要介绍java语言的三个特性:类型协变和逆变,动态代理和静态代理,注解. 协变和逆变 借用Treant的博文,逆变与协变用来描述类型转换(type transformation)后的继承关 ...

  2. ZoomControls控件是一个可以缩放控件,可以实现两个按钮控制图片的大小

    <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ...

  3. 【mybatis】时间范围 处理时间格式问题 + 查询当天 本月 本年 + 按当天 当月 范围 查询 分组

    1.mybatis中查询时间范围处理: 例如2018-05-22 ~2018-05-23 则查出来的数据仅能查到2018-05-22的,查不到2018-05-23的数据! 为什么会这样? 明明时间字段 ...

  4. 针对访问uri 限制ip

    在虚拟主机配置文件中加入如下字段: <filesmatch "(.*)admin(.*)">            Order deny,allow           ...

  5. http://bbs.51cto.com/thread-1070029-1-1.html

    http://bbs.51cto.com/thread-1070029-1-1.html

  6. 新人补钙系列教程之:AS3 与 PHP 简单通信基础

    package { import flash.display.Loader; import flash.events.Event; import flash.net.URLLoader; import ...

  7. idea 搭建spring boot

    打开IntelliJ IDEA,在菜单栏选择File菜单-->New-->Project...-->Spring Initializr,Project SDK即选择JDK的版本,Ch ...

  8. [WCF菜鸟]什么是WCF

    一.概述 Windows Communication Foundation(WCF)是由微软发展的一组数据通信的应用程序开发接口,可以翻译为Windows通讯接口,它是.NET框架的一部分.由 .NE ...

  9. EffectiveJava(19)导出常量的几种方式 - - 接口只用于定义类型

    package com.classinteface.finalinterface; /** * 常量接口模式 java.io.ObjectStreamConstants * 这种模式会导致实现其的类将 ...

  10. 使用Java取得本机IP和机器名

    try { InetAddress addr = InetAddress.getLocalHost(); String ip=addr.getHostAddress().toString();//获得 ...