IC验证——perl脚本ccode_standard——c代码寄存器配置标准化

news2024/11/16 3:36:19

目录

1 脚本名称

2 脚本路径

3 脚本参数说明

4 脚本操作说明

5 脚本代码


1 脚本名称

ccode_standard

2 脚本路径

/scripts/bin/ccode_standard

3 脚本参数说明

次序

参数名

说明

1

address

(./rfdig;.;..;./boot)

指定脚本执行路径(可以为脚本所在路径的任意相对路径)

help

脚本使用帮助,打印说明信息

2

all

运行脚本后,脚本会解析全部rbus.cfg,并对参数1指定的目录中的.c文件进行寄存器配置代码标准化修改

module_name_seca.cfg

运行脚本后,脚本会解析参数2指定的rbus.cfg,并对参数1指定的目录中的.c文件进行寄存器配置代码标准化修改

示例

命令:ccode_standard  help

输出ccode_standard使用帮助信息

命令:ccode_standard  ./rfdig  rfdig_seca.cfg

对当前路径下的rfdig文件夹及其子文件夹下所有的.c文件中,有关rfdig_seca.cfg中的寄存器配置代码进行标准化修改;

命令:ccode_standard  .  crg_seca.cfg

对当前路径下的所有文件夹及其子文件夹下的所有.c文件中,所有有关crg_seca.cfg中的寄存器配置代码进行标准化修改;

命令:ccode_standard  .  all

对当前路径下的所有文件夹及其子文件夹下的所有.c文件中,所有模块的寄存器配置代码进行标准化修改;

说明

配置文件module_name_seca.cfg是被验模块寄存器的详细配置文件;脚本索引该文件的具体路径为:

$PROJ_SRC/design/scripts/rbus_scripts/rbus_cfg/

使用该脚本前请先gen_rbus;

4 脚本操作说明

        该脚本用于将如下所示的代码标准化,加速ST用例调整,该脚本可以反复多次调用,不会产生异常问题:

  1. 使用脚本前,首先gen_rbus,source,产生脚本需要解析的rbus.cfg文件,以及环境变量$ENV{PROJ_SRC};
  2. 根据脚本存放路径,指定脚本工作目录,如下例所示,脚本存放于case目录,我想修改rfdig文件夹下的.c文件,参考rfdig_seca.cfg;执行:ccode_standard  ./rfdig  rfdig_seca.cfg  >  1.log
  3. 如图所示,脚本只替换了有关rfdig的寄存器,iomux,crg等没有替换:

  4. 如下例所示,脚本存放于case目录,我想修改rfdig/rfdig_tc017文件夹下的.c文件,参考所有rbus.cfg文件;
  5. 执行:ccode_standard  ./rfdig/rfdig_m33_tc017  all  >  1.log

  6. 如图所示,脚本不仅替换了有关rfdig的寄存器,iomux,crg等都有替换:

  7.  

5 脚本代码

#! /usr/bin/perl -w

#==========================================================
# PERL MODULE 
#==========================================================

use Cwd;
use File::Path;
use File::Find;

#==========================================================
# PERL FUNCTION GetOptions (get command parameters)
#==========================================================
$g_work_dir  = $ARGV[0];
$g_seca_fl   = $ARGV[1];

#our $work_dir  = 'rfdig_m33_tc017';

#==========================================================
# SCRIPT MAIN  
#==========================================================

our @seca_fl_list;
our @seca_name;
our @seca_type;
our @seca_width;
our @seca_init_value;
our @seca_with_field;
our @seca_field_list_bgn;
our @seca_field_list_end;
our @seca_field_name;
our @seca_field_width;
our @seca_field_bgn_idx;
our @seca_field_end_idx;

our $ccode_standard_mark = 0;

Main();

sub RegMem{
    @seca_name           = ();
    @seca_type           = ();
    @seca_width          = ();
    @seca_init_value     = ();
    @seca_with_field     = ();
    @seca_field_list_bgn = ();
    @seca_field_list_end = ();
    @seca_field_name     = ();
    @seca_field_width    = ();
    @seca_field_bgn_idx  = ();
    @seca_field_end_idx  = ();
    if (open(SECA_ID,"$g_seca_fl") or die "cannot open $g_seca_fl, no such file") {
        @seca_array = <SECA_ID>;
        my $i       = 0;
        my $j       = 0;
        my $rbus_ok = 0;
    
        foreach $seca_line (@seca_array) {
            $seca_line =~ s/[\n\r]*//g;
            if ($seca_line =~ m/^\s*field_(\S+)\s+\[(\S+)\]\s*$/) {
                if($rbus_ok eq 1) {
                    $seca_with_field[$i-1]     = 1 ;
                    $seca_field_list_bgn[$i-1] = $j;
                    $rbus_ok                   = 0 ;
                }
                $seca_field_list_end[$i-1] = $j;
                my $field_name_tmp   = "\L$1";
                my $field_name_size  = push(@seca_field_name ,$field_name_tmp);
                my $field_port_tmp   = $2;
                if ($field_port_tmp =~ m/(\d+):(\d+)/) {
                    push(@seca_field_bgn_idx,int($2));
                    push(@seca_field_end_idx,int($1));
                    push(@seca_field_width,(int($1)-int($2)+1));
                } else {
                    push(@seca_field_bgn_idx,int($field_port_tmp));
                    push(@seca_field_end_idx,int($field_port_tmp));
                    push(@seca_field_width,1);
                }
                #print ("seca_with_field[",$i-1,"]     = ",$seca_with_field[$i-1]     ,"\n");
                #print ("seca_field_list_bgn[",$i-1,"] = ",$seca_field_list_bgn[$i-1] ,"\n");
                #print ("seca_field_list_end[",$i-1,"] = ",$seca_field_list_end[$i-1] ,"\n");
                #print ("seca_field_name[",$j,"]       = ",$seca_field_name[$j]       ,"\n");
                #print ("seca_field_width[",$j,"]      = ",$seca_field_width[$j]      ,"\n");
                #print ("seca_field_bgn_idx[",$j,"]    = ",$seca_field_bgn_idx[$j]    ,"\n");
                #print ("seca_field_end_idx[",$j,"]    = ",$seca_field_end_idx[$j]    ,"\n");
                $j = $j + 1;
            }
            if ($seca_line =~ m/^\s*rbus_(\S+)\s+(\S+)\s+(\w+)\s+(\d+)('\w+)\s+(\S+)\s*$/) {
                #print ("before match string: ",$`,     "\n");
                #print ("match string       : ",$&,     "\n");
                #print ("after  match string: ",$',     "\n");
                #print ("seca_postfix       : ",$1,     "\n");
                #print ("seca_type          : ",$2,     "\n");
                #print ("seca_scope         : ",$3,     "\n");
                #print ("seca_width         : ",int($4),"\n");
                #print ("seca_init_value    : ",$5,     "\n");
                #print ("seca_prefix        : ",$6,     "\n");
                #print ("seca_name          : ","$6_$1","\n");
                $seca_name[$i]             = "\L$6_$1";
                $seca_type[$i]             = $2;
                $seca_width[$i]            = int($4);
                $seca_init_value[$i]       = $5;

                $seca_with_field[$i] = 0;
                $i = $i+1;
                $rbus_ok = 1;
            }
        }
    }
}

sub GenMacroDefine{
    #print "c file is              : $_[0]\n";
    #print "c macro_define file is : $_[1]\n";
    $ccode_standard_mark = 0;
    open(ORIEN_FILE,">>$_[1]");
        if (open(SOURCE_FILE,"$_[0]")) {
            @context = <SOURCE_FILE>;
            foreach $line (@context) {
                for ( $i = 0; $i < @seca_name; $i = $i +1) {
                    if ($seca_with_field[$i] eq 1) {
                        if ($line =~ m/^\s*(\w+)\[($seca_name[$i])\]\s*=\s*0x(\w+)\s*;.*$/) {
                            $ccode_standard_mark = 1;
                            print ORIEN_FILE "\n"."//"."$line";
                            my $seca_field_list_num  = $seca_field_list_end[$i] - $seca_field_list_bgn[$i] + 1;
                            for ($j = 0; $j < $seca_field_list_num; $j = $j+1) {
                                my $seca_field_width_tmp = $seca_field_width[$seca_field_list_bgn[$i]+$j];
                                my $seca_field_name_tmp  = "$seca_name[$i]"."_"."$seca_field_name[$seca_field_list_bgn[$i]+$j]";
                                my $seca_field_mask_tmp  = "$seca_field_name_tmp"."_mask ((1<<$seca_field_width[$seca_field_list_bgn[$i]+$j])-1)";
                                my $seca_field_shift_tmp = "$seca_field_name_tmp"."_shift $seca_field_bgn_idx[$seca_field_list_bgn[$i]+$j]";
                                my $seca_field_bit_tmp   = "$seca_field_name_tmp"."_bit (1<<$seca_field_bgn_idx[$seca_field_list_bgn[$i]+$j])";
                                if($seca_field_width_tmp eq 1){
                                    print ORIEN_FILE "#define $seca_field_bit_tmp\n";
                                } else {
                                    print ORIEN_FILE "#define $seca_field_mask_tmp\n";
                                    print ORIEN_FILE "#define $seca_field_shift_tmp\n";
                                }
                            }
                        }
                    }
                }
            }
            close SOURCE_FILE;
        }
    close ORIEN_FILE;
    system ("awk '!a[\$0]++' $_[1] > $_[1]_tmp \&\& mv -f $_[1]_tmp $_[1]");
}

sub AddMacroDefine{
    #print "old c file is : $_[0]\n";
    #print "new c file is : $_[1]\n";
    #print "add   file is : $_[2]\n";
    my $add_ready = 0;
    open(ORIEN_FILE,">$_[1]");
        if (open(SOURCE_FILE,"$_[0]")) {
            @context = <SOURCE_FILE>;
            foreach $line (@context) {
                if($line =~ m/^#include \"$_[2]\"$/) {

                } else {
                    print ORIEN_FILE "$line";
                }
                if ($add_ready eq 0) {
                    if ($line =~ m/^\s*\#include\s*\"\S+_define.c\"\s*$/) {
                        print ORIEN_FILE "\#include "."\"$_[2]\"\n";
                        $add_ready = 1;
                    }
                }
            }
            close SOURCE_FILE;
        }
    close ORIEN_FILE;
}

sub GenSubContent{
    #print "old c file is : $_[0]\n";
    #print "new c file is : $_[1]\n";
    open(ORIEN_FILE,">>$_[1]");
        if (open(SOURCE_FILE,"$_[0]")) {
            @context = <SOURCE_FILE>;
            foreach $line (@context) {
                my $line_match = 0;
                for ( $i = 0; $i < @seca_name; $i = $i + 1) {
                    if ($seca_with_field[$i] eq 1) {
                        if ($line =~ m/^(\s*)(\w+\[$seca_name[$i]\])\s*=\s*0x(\w+)\s*;.*$/) {
                            my $reg_value = hex($3);
                            if ($reg_value != 0) {
                                $line_match = 1;
                                print ORIEN_FILE "//"."$line";
                                my $seca_field_list_num = $seca_field_list_end[$i] - $seca_field_list_bgn[$i] + 1;
                                for ($j = 0; $j < $seca_field_list_num; $j = $j+1) {
                                    my $seca_field_name_tmp    = "$seca_name[$i]"."_"."$seca_field_name[$seca_field_list_bgn[$i]+$j]";
                                    my $seca_field_mask_tmp    = "$seca_field_name_tmp"."_mask";
                                    my $seca_field_value       = (($reg_value) >> ($seca_field_bgn_idx[$seca_field_list_bgn[$i]+$j])) & 
                                                                 ((1<<$seca_field_width[$seca_field_list_bgn[$i]+$j])-1);
                                    my $seca_field_width_tmp   = $seca_field_width[$seca_field_list_bgn[$i]+$j];
                                    my $seca_field_shift_tmp   = "$seca_field_name_tmp"."_shift";
                                    my $seca_field_bit_tmp     = "$seca_field_name_tmp"."_bit";
                                    #print ("seca_field_mask_value = ",((1<<$seca_field_width[$seca_field_list_bgn[$i]+$j])-1),";");
                                    #print ("reg_value = ",$reg_value,";");
                                    #print ("seca_field_value = $seca_field_value\n");
                                    if($j eq 0){
                                      if ($j eq ($seca_field_list_num - 1)) {
                                        if($seca_field_width_tmp eq 1) {
                                          printf ORIEN_FILE ("%s%-40s ((%-50s * 0x%-8x)    %-51s) ;\n","$1","$2 =","$seca_field_bit_tmp",$seca_field_value,"                     ");
                                        } else {
                                          printf ORIEN_FILE ("%s%-40s ((%-50s & 0x%-8x) << %-51s) ;\n","$1","$2 =","$seca_field_mask_tmp",$seca_field_value,"$seca_field_shift_tmp");
                                        }
                                      } else {
                                        if($seca_field_width_tmp eq 1) {
                                          printf ORIEN_FILE ("%s%-40s ((%-50s * 0x%-8x)    %-51s) |\n","$1","$2 =","$seca_field_bit_tmp",$seca_field_value,"                     ");
                                        } else {
                                          printf ORIEN_FILE ("%s%-40s ((%-50s & 0x%-8x) << %-51s) |\n","$1","$2 =","$seca_field_mask_tmp",$seca_field_value,"$seca_field_shift_tmp");
                                        }
                                      }
                                    } elsif($j eq ($seca_field_list_num - 1)) {                                                                                              
                                      if($seca_field_width_tmp eq 1) {
                                        printf ORIEN_FILE ("%s%-40s ((%-50s * 0x%-8x)    %-51s) ;\n","$1","    ","$seca_field_bit_tmp",$seca_field_value,"                     ");
                                      } else {
                                        printf ORIEN_FILE ("%s%-40s ((%-50s & 0x%-8x) << %-51s) ;\n","$1","    ","$seca_field_mask_tmp",$seca_field_value,"$seca_field_shift_tmp");
                                      }
                                    } else {                                                                                                                                 
                                      if($seca_field_width_tmp eq 1) {
                                        printf ORIEN_FILE ("%s%-40s ((%-50s * 0x%-8x)    %-51s) |\n","$1","    ","$seca_field_bit_tmp",$seca_field_value,"                     ");
                                      } else {
                                        printf ORIEN_FILE ("%s%-40s ((%-50s & 0x%-8x) << %-51s) |\n","$1","    ","$seca_field_mask_tmp",$seca_field_value,"$seca_field_shift_tmp");
                                      }
                                    }
                                }
                            }
                        }
                    }
                }
                if ($line_match eq 0) {
                    print ORIEN_FILE "$line";
                }
            }
            close SOURCE_FILE;
        }
    close ORIEN_FILE;
}

sub CopyFile{
    #print "source file name is $_[0]\n";
    #print "orien  file name is $_[1]\n";
    open(ORIEN_FILE,">$_[1]");
        if (open(SOURCE_FILE,"$_[0]")) {
            @context = <SOURCE_FILE>;
            foreach $line (@context) {
                print ORIEN_FILE "$line";
            }
            close SOURCE_FILE;
        }
    close ORIEN_FILE;
}

sub FindConfigFile{
    if (-f $File::Find::name) {
        if ($_ =~ m/^(\w+_sec[a-z]\.cfg)$/) {
            #print "find file is $1 \n";
            push(@seca_fl_list,$1); 
        }
    }
}

sub FindWanted{
    if (-f $File::Find::name) {
        if ($_ =~ m/(\S+)\.c$/) {
            print "process file: $File::Find::name \n";
            GenMacroDefine("$_","$1"."_macro_define.h");
            unlink "$1"."_macro_define.h";
            if($ccode_standard_mark eq 1) {
                unlink "$_".".tmp";
                GenSubContent("$_","$_".".tmp");
                #AddMacroDefine("$_".".tmp","$_","$1"."_macro_define.h");
                system ("mv -f $_.tmp $_");
                unlink "$_".".tmp";
            }
        }
    }
}

sub Main{
    my $cur_dir  = getcwd;
    my $proj_src = $ENV{PROJ_SRC};
    my $seca_dir = "$ENV{PROJ_SRC}/design/scripts/rbus_scripts/rbus_cfg/";
    if($g_seca_fl eq "all") {
        chdir($seca_dir) or die "$seca_dir was not found!!! please gen_rbus firstly.";
        find(\&FindConfigFile,"$seca_dir");
    } else {
        push(@seca_fl_list,$g_seca_fl);
    }
    #for ($i = 0; $i < @seca_fl_list; $i = $i+1) {
    #    print "seca_fl_list[$i] = $seca_fl_list[$i] \n";
    #}
    for ($z = 0; $z < @seca_fl_list; $z = $z + 1) {
        print "read config_file : $seca_fl_list[$z]\n";
        $g_seca_fl = "$seca_dir"."$seca_fl_list[$z]";
        RegMem();
        chdir($cur_dir) or die "$cur_dir does not exist!!!";
        find(\&FindWanted,"$cur_dir/$g_work_dir");
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1390951.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何避免知识付费小程序平台的陷阱?搭建平台的最佳实践

随着知识经济的兴起&#xff0c;知识付费已经成为一种趋势。越来越多的人开始将自己的知识和技能进行变现&#xff0c;而知识付费小程序平台则成为了一个重要的渠道。然而&#xff0c;市面上的知识付费小程序平台琳琅满目&#xff0c;其中不乏一些不良平台&#xff0c;让老实人…

【零基础入门Python数据分析】Anaconda3 JupyterNotebookseaborn版

目录 一、安装环境 python介绍 anaconda介绍 jupyter notebook介绍 anaconda3 环境安装 解决JuPyter500&#xff1a;Internal Server Error问题-CSDN博客 Jupyter notebook快捷键操作大全 二、Python基础入门 数据类型与变量 数据类型 变量及赋值 布尔类型与逻辑运算…

flutter报错Cannot hit test a render box that has never been laid out

出现这个问题的原因可能是因为你把一个ListView或者GridView放到了一个没有设置大小的容器里面导致的&#xff0c;所以意思是不能渲染那一个没有布局过的容器。我这里遇到的错误是因为我把GridView放到了一个Container里面&#xff0c;并且我没有设置Container宽高。 就导致了那…

linux如何排查cpu持续飙高原因

一、检查CPU使用率 首先在Linux系统中检查CPU使用率。可以通过在命令行中输入top或htop命令来查看当前系统中各个进程的CPU使用率。如果CPU使用率大于80%&#xff0c;则可以考虑进行排查。 $ top二、检查系统负载 另外可以使用uptime命令来查看系统的平均负载情况。 $ upti…

elasticsearch6.6.0设置访问密码

elasticsearch6.6.0设置访问密码 第一步 x-pack-core-6.6.0.jar第二步 elasticsearch.yml第三步 设置密码 第一步 x-pack-core-6.6.0.jar 首先破解 x-pack-core-6.6.0.jar 破解的方式大家可以参考 https://codeantenna.com/a/YDks83ZHjd 中<5.破解x-pack> 这部分 , 也可…

Zookeeper安装教程

文章目录 前言一、选择安装包二、使用wget下载并安装zookeeper 前言 Linux下Zookeeper安装步骤 一、选择安装包 Zookeeper下载地址&#xff1a;https://zookeeper.apache.org/releases.html 选择一个稳定版本即可&#xff0c;我这里选择的是3.7.2 点击“Apache ZooKeeper 3.…

考研C语言刷题篇之分支循环结构一

目录 第一题 第二题 方法一&#xff1a;要循环两次&#xff0c;一次求阶乘&#xff0c;一次求和。 注意&#xff1a;在求和时&#xff0c;如果不将sum每次求和的初始值置为1&#xff0c;那么求和就会重复。 方法二&#xff1a; 第三题 方法一&#xff1a;用数组遍历的思想…

Spring高手之路-Spring事务失效的场景详解

目录 前言 Transactional 应用在非 public 修饰的方法上 同一个类中方法调用&#xff0c;导致Transactional失效 final、static方法 Transactional的用法不对 Transactional 注解属性 propagation 设置不当 Transactional注解属性 rollbackFor 设置错误 用错注解 异常…

实战whisper:本地化部署通用语音识别模型

前言 Whisper 是一种通用语音识别模型。它是在大量不同音频数据集上进行训练的&#xff0c;也是一个多任务模型&#xff0c;可以执行多语言语音识别、语音翻译和语言识别。 这里呢&#xff0c;我将给出我的一些代码&#xff0c;来帮助你尽快实现【语音转文字】的服务部署。 以下…

最佳实践分享:SQL性能调优

SQL性能调优是一个需要不断探索和实践的过程&#xff0c;旨在确保数据库查询的高效运行。本文将分享一些SQL性能调优的最佳实践&#xff0c;帮助您提升数据库性能&#xff0c;减少查询响应时间。 一、索引优化 索引是提高查询性能的关键。以下是一些关于索引优化的建议&#…

使用micro-app将现有项目改造成微前端,对现有项目实现增量升级

使用micro-app将现有项目改造成微前端&#xff0c;对现有项目实现增量升级 基座应用 1、安装依赖 npm i micro-zoe/micro-app --save2、在入口引入 //main.js import microApp from micro-zoe/micro-appnew Vue({ }) //在new Vue 下面执行 microApp.start()3、新增一个vue页…

ASP.NET Core 的 Web Api 实现限流 中间件

Microsoft.AspNetCore.RateLimiting 中间件提供速率限制&#xff08;限流&#xff09;中间件。 它是.NET 7 以上版本才支持的中间件&#xff0c;刚看了一下&#xff0c;确实挺好用&#xff0c;下面给大家简单介绍一下&#xff1a; RateLimiterOptionsExtensions 类提供下列用…

5 个被低估的开源项目

文章目录 1.集算器 -数据处理2. Firecamp - 邮递员替代方案3.Keploy——后端 测试4. Hanko - 密钥验证5. Zrok - Ngrok 类固醇 长话短说 本文列出了五个不太受欢迎的优秀项目&#xff0c;您应该尝试一下。&#x1f525; 这些工具旨在改进数据处理、API 开发、后端测试、身份验…

MiniTab的拟合回归模型的系列参数设置

为拟合回归模型指定模型项 统计 > 回归 > 回归 > 拟合回归模型 > 模型 可以向模型添加交互作用项和多项式项。默认情况下&#xff0c;模型仅包含在主对话框中输入的预测变量的主效应。添加项的方法有很多。假设预测变量列表具有 3 个连续变量 X、Y、Z 和 2 个类别…

WPF XAML(二)

一、前言 本文是 WPF XAML&#xff08;一&#xff09;的续文&#xff0c;链接我就放下面了。 WPF XAML&#xff08;一&#xff09;-CSDN博客https://blog.csdn.net/qq_71897293/article/details/135537094?spm1001.2014.3001.5501 二、XAML 中空白与特殊字符 在XAML中我们在…

鸿蒙ArkTS的起源和简介

theme: lilsnake 1、引言 Mozilla创造了JS&#xff0c;Microsoft创建了TS&#xff0c;Huawei进一步推出了ArkTS。 从最初的基础的逻辑交互能力&#xff0c;到具备类型系统的高效工程开发能力&#xff0c;再到融合声明式UI、多维状态管理等丰富的应用开发能力&#xff0c;共同…

TA百人计划学习笔记 2.6伽马矫正

资料 源视频 【技术美术百人计划】图形 2.6 伽马校正_哔哩哔哩_bilibili PPT 2600_伽马矫正 参考笔记 2.6伽马&#xff08;Gamma&#xff09;校正 语雀 从0开始的技术美术之路&#xff08;十&#xff09;伽马校正_线性工作流 技术美术-CSDN博客为什么 韦伯定理 人眼对于暗部是…

《MyBatis》-- 流式查询内存性能优化-单条数据加工

阿丹-需求/场景&#xff1a; 在项目场景中涉及到数据二次加工。需要将单个对象数据转为按照规定的数据字典的转换。以及需要转换数据结构。从对象转换为按照规定的值和规则的数组。 因为要写入csv文件&#xff0c;涉及到文件的输出流。 之前讨论针对的解决方案&#xff1a; …

HCIP第一次练习 -- RIP复习实验

要求&#xff1a; 需求:R1-R2-R3-R4-R5运行RIPV2 R6-R7运行RIPV1 1.使用合理地址规划网络&#xff0c;各自创建环回接口 2.R1创建环回172.16.1.1/24172.16.2.1/24 172.16.3.1/24 3.要求R3使用R2访问R1环回 4.减少路由条自数量,增加路由传递安全性 5.R5创建一个环回模拟运营商,不…

FFmpeg之SwrRessample

文章目录 一、概述二、重采样流程三、重要结构体3.1、SwrContext3.2、ResamplerContext 四、重要函数4.1、swr_alloc4.2、swr_alloc_set_opts4.3、av_opt_set_*4.4、swr_init4.5、av_samples_alloc_array_and_samples4.6、av_samples_alloc4.7、swr_convert4.8、swr_get_delay4…