源代码位于“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. Java for LeetCode 227 Basic Calculator II

    Implement a basic calculator to evaluate a simple expression string. The expression string contains ...

  2. SQL触发器中若取到null值可能引发的问题

    declare @code varchar(20), @cs varchar(20),@zc varchar(20)set @cs='('+@cs+'*'+@zc+')'print '字符'+@csi ...

  3. 解决eclipse中maven web工程打包成war(发布到tomcar)时lib中没有jar包的解决方法

    可能有两个原因:1.maven中某些jar包下载不下来 从其他地方下载jar文件放到相应maven本地库的.m2里2..classpath文件中缺少(下面代码的作用是制定maven的jar发布路径)& ...

  4. JS_ECMA基本语法中的几种封装的小函数-1

    今天给大家介绍js ECMA中几个封装的小函数以及一些常用的函数小案例: 1,找重复的函数 <script> //在数组里面找重复: function findInArr(n,arr){ ...

  5. Mysql 数据库无法删除 41 错误

    今天删除Mysql 数据库时候,没法删除,直接报错 41: 方法,进入 mysql的安装目录 我的是:D:\tools\Mysql\V76384-01\mysql-advanced-5.6.25-wi ...

  6. Swift - 简单封装一个工具类模板

    创建模板类(封装一个类) 例1:新建一个名字叫做 Product 的类 Product.swift File 的内容 class Product { var name: String var desc ...

  7. Cocoapods的使用教程

    前言 对于iOS App的开发,几乎都采用了Cocoapods来管理第三方库,那么对于我们开发人员来说,这是必备技能,必须要掌握如何使用.这篇文章就是介绍如何安装和使用CocoaPods的. 这篇文章 ...

  8. Tomcat在Linux上的安装与配置

    以下使用的Linux版本为: Redhat Enterprise Linux 6.5 x86_64,Tomcat版本为tomcat-7.0.54. 1.下载JDK与Tomcat.    jdk下载地址 ...

  9. JavaScript的内置对象和浏览器对象

    在javascript中对象通常包括两种类型:内置对象和浏览器对象,此外,用户还可以自定义对象. 对象包含两个要素:1.用来描述对象特性的一组数据,也就是若干变量,通常称为属性.2.用来操作对象特性的 ...

  10. jQuery - 9.Ajax

    9.1 Ajax 的 XMLHttpRequest 对象 9.2 JQuery中的Ajax 9.2.1 load()方法 9.2.2 $.get() 9.2.3 $.post() 9.2.4 $.ge ...