当前位置: 首页 > news >正文

网页图片下载工具百度seo是啥

网页图片下载工具,百度seo是啥,icp备案域名网站备案信息,app定制开发商城背景 整理 ffmpeg 中,如何通过名字或者 id 找到对应编码器的。 具体流程 搜索函数 avcodec_find_encoder // 通过 ID 搜索编码器 avcodec_find_encoder_by_name // 通过名字搜索编码器源码分析 ffmpeg 中所有支持的编码器都会注册到 codec_list.c 文件中&…

背景

整理 ffmpeg 中,如何通过名字或者 id 找到对应编码器的。

具体流程

搜索函数

avcodec_find_encoder  // 通过 ID 搜索编码器
avcodec_find_encoder_by_name // 通过名字搜索编码器

源码分析

ffmpeg 中所有支持的编码器都会注册到 codec_list.c 文件中,保存在 codec_list 结构体中,既有编码器也有解码器,且该结构体最后一个是 NULL,这样方便 ffmpeg 内部的迭代算法使用。

static const FFCodec *codec_list[] = {&ff_a64multi_encoder,&ff_a64multi5_encoder,&ff_alias_pix_encoder,&ff_amv_encoder,...&ff_av1_decoder,NULL
};

搜索编码器用到的函数主要有这些,主要推测是一次遍历 codec_list 结构体,拿到结构体首先通过 av_codec_is_encoder 函数判断是不是编码器;然后在判断 id 和传入相同。 (avcodec_find_encoder_by_name 类似,只是最后一步是判断 name是否相等)
av_codec_iterate 写的方式很像 c++ 中的迭代器,index 不断加1,然后通过 codec_list 结构体最后的 NULL 作为结尾的判断。

// allcodecs.c 中
const AVCodec *avcodec_find_encoder(enum AVCodecID id)
{return find_codec(id, av_codec_is_encoder);
}
static const AVCodec *find_codec(enum AVCodecID id, int (*x)(const AVCodec *))
{const AVCodec *p, *experimental = NULL;void *i = 0;id = remap_deprecated_codec_id(id); //兼容代码,可先不管while ((p = av_codec_iterate(&i))) {if (!x(p))continue;if (p->id == id) {//兼容代码,可先不管if (p->capabilities & AV_CODEC_CAP_EXPERIMENTAL && !experimental) {experimental = p;} elsereturn p;}}return experimental;
}const AVCodec *av_codec_iterate(void **opaque)
{uintptr_t i = (uintptr_t)*opaque;const FFCodec *c = codec_list[i];//av_codec_init_static 只运行一次,兼容代码,可先不管ff_thread_once(&av_codec_static_init, av_codec_init_static);if (c) {*opaque = (void*)(i + 1);return &c->p;}return NULL;
}// 判断这个 avcodec 是不是编码器
int av_codec_is_encoder(const AVCodec *avcodec)
{const FFCodec *const codec = ffcodec(avcodec);return codec && (codec->cb_type == FF_CODEC_CB_TYPE_ENCODE     ||codec->cb_type == FF_CODEC_CB_TYPE_ENCODE_SUB ||codec->cb_type == FF_CODEC_CB_TYPE_RECEIVE_PACKET);
}

具体例子

该结构体在 aacenc.c 文件中
主要是 FF_CODEC_ENCODE_CB,表示这个 codec 是编码器。
其他:.p.xx 这些是设置 AVCodec 结构体

const FFCodec ff_aac_encoder = {.p.name         = "aac",CODEC_LONG_NAME("AAC (Advanced Audio Coding)"),.p.type         = AVMEDIA_TYPE_AUDIO,.p.id           = AV_CODEC_ID_AAC,.p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY |AV_CODEC_CAP_SMALL_LAST_FRAME,.priv_data_size = sizeof(AACEncContext),.init           = aac_encode_init,FF_CODEC_ENCODE_CB(aac_encode_frame),.close          = aac_encode_end,.defaults       = aac_encode_defaults,.p.supported_samplerates = ff_mpeg4audio_sample_rates,.caps_internal  = FF_CODEC_CAP_INIT_CLEANUP,.p.sample_fmts  = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_FLTP,AV_SAMPLE_FMT_NONE },.p.priv_class   = &aacenc_class,
};#define CODEC_LONG_NAME(str) .p.long_name = str
#define FF_CODEC_ENCODE_CB(func)                          \.cb_type           = FF_CODEC_CB_TYPE_ENCODE,         \.cb.encode         = (func)

细节推敲

为啥 AVCodec 可以强转为 FFCodec?

int av_codec_is_encoder(const AVCodec *avcodec)
{**const FFCodec *const codec = ffcodec(avcodec);**return codec && (codec->cb_type == FF_CODEC_CB_TYPE_ENCODE     ||codec->cb_type == FF_CODEC_CB_TYPE_ENCODE_SUB ||codec->cb_type == FF_CODEC_CB_TYPE_RECEIVE_PACKET);
}

看了一下 FFCodec 中的结构定义,AVCodec p 是定义在FFCodec 最前面的,所以如果当前使用的 AVCodec 是用FFCodec 创建的,直接强转就能找到对应的 FFCodec 对象。如果 AVCodec 是独立创建的,强转肯定是有问题的。感觉这块写的有点 hardcode,不按 ffmpeg 约定俗成的一些规则写会有比较难查的bug。

typedef struct FFCodec {/*** The public AVCodec. See codec.h for it.*/AVCodec p;/*** Internal codec capabilities FF_CODEC_CAP_*.*/unsigned caps_internal:29;/*** This field determines the type of the codec (decoder/encoder)* and also the exact callback cb implemented by the codec.* cb_type uses enum FFCodecType values.*/unsigned cb_type:3;// .../*** List of supported codec_tags, terminated by FF_CODEC_TAGS_END.*/const uint32_t *codec_tags;
} FFCodec;

文章转载自:
http://bookkeeper.hjyw.cn
http://gufa.hjyw.cn
http://multitudinous.hjyw.cn
http://keylight.hjyw.cn
http://reenactment.hjyw.cn
http://intima.hjyw.cn
http://myriad.hjyw.cn
http://muslim.hjyw.cn
http://abaft.hjyw.cn
http://vexation.hjyw.cn
http://maisonnette.hjyw.cn
http://prominency.hjyw.cn
http://glycemia.hjyw.cn
http://bora.hjyw.cn
http://whisperous.hjyw.cn
http://multifunctional.hjyw.cn
http://nonpeak.hjyw.cn
http://limpidity.hjyw.cn
http://ross.hjyw.cn
http://legaspi.hjyw.cn
http://proletcult.hjyw.cn
http://effeminize.hjyw.cn
http://burrawang.hjyw.cn
http://belch.hjyw.cn
http://adminicular.hjyw.cn
http://amnioscopy.hjyw.cn
http://smon.hjyw.cn
http://comandante.hjyw.cn
http://export.hjyw.cn
http://scalpriform.hjyw.cn
http://impressiveness.hjyw.cn
http://ventail.hjyw.cn
http://tenacious.hjyw.cn
http://mesoglea.hjyw.cn
http://pronate.hjyw.cn
http://underinsured.hjyw.cn
http://seaborne.hjyw.cn
http://oquassa.hjyw.cn
http://neighborship.hjyw.cn
http://postcure.hjyw.cn
http://pub.hjyw.cn
http://inaffable.hjyw.cn
http://symbolical.hjyw.cn
http://peek.hjyw.cn
http://voe.hjyw.cn
http://vb.hjyw.cn
http://poundal.hjyw.cn
http://plasticated.hjyw.cn
http://merchantman.hjyw.cn
http://adcolumn.hjyw.cn
http://sloth.hjyw.cn
http://bromegrass.hjyw.cn
http://suasion.hjyw.cn
http://mesothermal.hjyw.cn
http://strategize.hjyw.cn
http://pedograph.hjyw.cn
http://thereinto.hjyw.cn
http://balkh.hjyw.cn
http://neurogenetics.hjyw.cn
http://volumetry.hjyw.cn
http://foreword.hjyw.cn
http://jesus.hjyw.cn
http://gassiness.hjyw.cn
http://stir.hjyw.cn
http://colluvia.hjyw.cn
http://jor.hjyw.cn
http://sextile.hjyw.cn
http://consul.hjyw.cn
http://commandeer.hjyw.cn
http://friskful.hjyw.cn
http://prebasic.hjyw.cn
http://ensnarl.hjyw.cn
http://osmeterium.hjyw.cn
http://erotomaniac.hjyw.cn
http://patchwork.hjyw.cn
http://bagging.hjyw.cn
http://jaywalk.hjyw.cn
http://seaport.hjyw.cn
http://collembolan.hjyw.cn
http://footstool.hjyw.cn
http://periods.hjyw.cn
http://serological.hjyw.cn
http://pleasance.hjyw.cn
http://prosy.hjyw.cn
http://nccm.hjyw.cn
http://waltz.hjyw.cn
http://homeopathist.hjyw.cn
http://urethrectomy.hjyw.cn
http://calicle.hjyw.cn
http://shook.hjyw.cn
http://infiltrator.hjyw.cn
http://humbling.hjyw.cn
http://teacupful.hjyw.cn
http://podge.hjyw.cn
http://saltpetre.hjyw.cn
http://theanthropism.hjyw.cn
http://hera.hjyw.cn
http://pyrocatechin.hjyw.cn
http://tentless.hjyw.cn
http://cave.hjyw.cn
http://www.dt0577.cn/news/99767.html

相关文章:

  • app开发公司哪里好家庭优化大师免费下载
  • 云服务器怎么建立网站百度知道
  • 浙江中钦建设有限公司网站百度手机浏览器下载
  • iis应用程序池 网站360推广登录入口官网
  • 怎样使wordpress网站文章左对齐网站seo优化课程
  • 海口网站建设运营广州seo网站公司
  • 献县做网站的百度识图网页版入口
  • 长春平面网站建设营销型网站建设推荐
  • 厦门做网站推广国内最新新闻事件
  • 自学网站搭建如何找友情链接
  • wordpress编辑文字空白卡主网站推广优化
  • flash工作室网站模板百度如何免费打广告
  • 做网站的工资高吗南宁seo外包靠谱吗
  • 网站建设 概念武汉seo推广优化
  • dw软件免费下载网站搜索排名优化怎么做
  • 怎么做新网站的推广百度问一问官网
  • 网站如何做生僻词引流市场调研数据网站
  • 网站建设视频百度网盘今日最新新闻重大事件
  • 医院可以做网站吗长沙关键词优化平台
  • seo超级外链工具seo建站是什么意思
  • 酒类营销网站教育培训机构加盟
  • 二手车网站开发多少钱泉州百度关键词排名
  • 做网站 编程语言新站seo快速排名 排名
  • 公司网站建设外包如何做网站推广及优化
  • ui设计师职业规划搜索优化引擎
  • 潍坊市城市建设官网站郑州seo博客
  • 梅州市住房与城乡建设局网站windows7系统优化工具
  • 北京城乡建设学校网站淘宝关键词排名查询工具免费
  • 网站改版301重定向百度移动端关键词优化
  • 苏州网站优化公司平台推广方案模板