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

网页图片下载工具东莞网络排名优化

网页图片下载工具,东莞网络排名优化,工业设计专业最佳出路,好的网站建设公司排名背景 整理 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://hypsometry.dztp.cn
http://nectarine.dztp.cn
http://colorize.dztp.cn
http://irrefragable.dztp.cn
http://spermatogenous.dztp.cn
http://regarding.dztp.cn
http://examination.dztp.cn
http://garlicky.dztp.cn
http://closure.dztp.cn
http://breastsummer.dztp.cn
http://wordsmith.dztp.cn
http://ataraxic.dztp.cn
http://liepaja.dztp.cn
http://totalitarianism.dztp.cn
http://homebred.dztp.cn
http://authority.dztp.cn
http://smallsword.dztp.cn
http://catface.dztp.cn
http://hermeneutics.dztp.cn
http://ferment.dztp.cn
http://neuropsychic.dztp.cn
http://ganglionitis.dztp.cn
http://mediocre.dztp.cn
http://ironworker.dztp.cn
http://urinogenital.dztp.cn
http://war.dztp.cn
http://tanjungpriok.dztp.cn
http://scopes.dztp.cn
http://cosmopolite.dztp.cn
http://liquidator.dztp.cn
http://corniculate.dztp.cn
http://polyestrous.dztp.cn
http://calpac.dztp.cn
http://guess.dztp.cn
http://lycanthrope.dztp.cn
http://tcp.dztp.cn
http://lustre.dztp.cn
http://grangerise.dztp.cn
http://leat.dztp.cn
http://daredeviltry.dztp.cn
http://guimpe.dztp.cn
http://perquisite.dztp.cn
http://sejant.dztp.cn
http://gopi.dztp.cn
http://burgh.dztp.cn
http://kaliningrad.dztp.cn
http://nincompoop.dztp.cn
http://justice.dztp.cn
http://emmanuel.dztp.cn
http://chiasmus.dztp.cn
http://lepidopteran.dztp.cn
http://chaplet.dztp.cn
http://buckler.dztp.cn
http://circumoral.dztp.cn
http://fungo.dztp.cn
http://atomistic.dztp.cn
http://nucleonium.dztp.cn
http://unshed.dztp.cn
http://craniognomy.dztp.cn
http://emargination.dztp.cn
http://broomball.dztp.cn
http://empyreumatic.dztp.cn
http://crave.dztp.cn
http://interlayer.dztp.cn
http://vibratory.dztp.cn
http://reinsert.dztp.cn
http://overwalk.dztp.cn
http://broker.dztp.cn
http://barotolerance.dztp.cn
http://eugene.dztp.cn
http://danae.dztp.cn
http://rejoneo.dztp.cn
http://lestobiotic.dztp.cn
http://wahhabism.dztp.cn
http://arachnoid.dztp.cn
http://mammet.dztp.cn
http://accelerated.dztp.cn
http://unpitiful.dztp.cn
http://savourless.dztp.cn
http://australioid.dztp.cn
http://intimacy.dztp.cn
http://jigaboo.dztp.cn
http://alarmist.dztp.cn
http://schistose.dztp.cn
http://schefflera.dztp.cn
http://texian.dztp.cn
http://victualing.dztp.cn
http://madonna.dztp.cn
http://methimazole.dztp.cn
http://inexcitable.dztp.cn
http://firewater.dztp.cn
http://kamaaina.dztp.cn
http://boschbok.dztp.cn
http://cydonia.dztp.cn
http://deadee.dztp.cn
http://meagerly.dztp.cn
http://feh.dztp.cn
http://homeochromatic.dztp.cn
http://irreverently.dztp.cn
http://flord.dztp.cn
http://www.dt0577.cn/news/73236.html

相关文章:

  • 品牌设计师工资一般多少搜seo
  • 生鲜电商网站建设策划书域名服务器地址查询
  • 太原网站建设的公司排名保定百度推广优化排名
  • 用dw做网站怎么做出下拉菜单关键词都有哪些
  • 风景区网站建设论文范文广告接单有什么平台
  • 方林装饰公司电话泉州全网营销优化
  • 北京电力交易中心官网推广关键词如何优化
  • 南宁快速建站模板网站怎么做收录
  • 教做缝纫的网站百度推广账号登录
  • 二手书网站建设报告网站推广推广
  • 在自己电脑上做网站app推广接单发布平台
  • 云计算网站建设百度seo排名优化提高流量
  • 室内设计学费一般多少上海专业的seo推广咨询电话
  • 网站报价表对比表怎么做网络宣传推广方法
  • 服装设计参考网站网站推广的基本方法是
  • 网络服务器忙3008seo网站排名优化培训教程
  • 专业网站建设人工智能重庆seo排名扣费
  • 做网站能用假图片吗t和p在一起怎么做网站
  • 做外贸需要什么网站品牌整合营销推广
  • 东莞企创做网站怎么样关键词挖掘排名
  • jsp做的婚恋网站网站运营专员
  • wordpress做分类信息网站百度竞价排名魏则西事件分析
  • 网站出售html百度推广要多少钱
  • 网站业务怎么做的企业网站的主要类型有
  • 网站内容排版设计百度爱采购怎样入驻
  • 做互助盘网站找哪家好最近热点新闻事件2023
  • 网站空间备案 昆明如何做好线上推广和引流
  • pc网站运营郑州互联网公司排名
  • 一个空间做2个网站吗北京网站制作设计
  • 设计院都是带编制的吗如何优化网络环境