【FFmpeg编程进阶】(13)FLV 解码器初始化函数 ff_h263_decode_init() 代码分析 --- 待更新

【FFmpeg编程进阶】(13)ff_flv_decoder 初始化函数 ff_h263_decode_init 代码分析 --- 待更新

在前面分析《【FFmpeg编程进阶】(11)avcodec_open2() 函数代码分析 - 打开Codec解码器》时,
我们涉及到了解码Codec init 初始化,由于代码比较长,我们再分一章来分析。

主要目的,还是以 FLV 解码器为例 ,来看下解码器主要做了啥,不用太精细,了解大概做了啥事就好了,
至于更精细的,我们后面对 FFmpeg 有更深入了解时,再看。

先记录下TODO LIST,后面再更新。

# libavcodec\flvdec.c
AVCodec ff_flv_decoder = {
    .name           = "flv",
    .long_name      = NULL_IF_CONFIG_SMALL("FLV / Sorenson Spark / Sorenson H.263 (Flash Video)"),
    .type           = AVMEDIA_TYPE_VIDEO,
    .id             = AV_CODEC_ID_FLV1,
    .priv_data_size = sizeof(MpegEncContext),
    .init           = ff_h263_decode_init,
    .close          = ff_h263_decode_end,
    .decode         = ff_h263_decode_frame,
    .capabilities   = AV_CODEC_CAP_DRAW_HORIZ_BAND | AV_CODEC_CAP_DR1,
    .caps_internal  = FF_CODEC_CAP_SKIP_FRAME_FILL_PARAM,
    .max_lowres     = 3,
    .pix_fmts       = (const enum AVPixelFormat[]) { AV_PIX_FMT_YUV420P,
                                                     AV_PIX_FMT_NONE },
};

一、FLV解码 ff_h263_decode_init()

  1. 初始化 MpegEncContext 解码器上下文结构体,将解码器Codec 上下文AVCodecContextMpegEncContext 绑定在一起
  2. 绑定宏块解码函数 ff_h263_decode_mb()
  3. s->h263_flv = 1

PS: 在编解码核心函数里,看了一个多小时代码,发现其逻辑就目前我的理解来说有点看不懂(慢慢花时间看或许多少也会有收获)
考虑效率及目前的需求,对于目前我这样的新手来说,这些更加高深的编解码知识会有点形而上,
与其花大量时间结合封装格式深专研进去学习,还不如先放手学习其他的基础,
比如先掌握ffmpeg 怎么使用、怎么编程,这些或许在当前阶段更加重要,
对于目前来说,我只需要知道调用这个接口,就会对packet 进行编解码,
至于编解码其详细的原理,等随着音视频学习更深时,基础更好时,再返回来学习,这样可能会更好理解,同时与高效些。
因此,本文加上 待更新 字样先留个念想,后面学习深入再补上。


# libavcodec\h263dec.c
av_cold int ff_h263_decode_init(AVCodecContext *avctx)
{
    MpegEncContext *s = avctx->priv_data;
    s->out_format      = FMT_H263;

	// 1. 初始化 MpegEncContext 解码器上下文结构体,将解码器Codec 上下文AVCodecContext 与 MpegEncContext 绑定在一起
    // set defaults
    ff_mpv_decode_defaults(s);
    ff_mpv_decode_init(s, avctx);
	// 2. 绑定宏块解码函数 ff_h263_decode_mb()
    s->quant_precision = 5;
    s->decode_mb       = ff_h263_decode_mb;
    s->low_delay       = 1;
    s->unrestricted_mv = 1;
	
	// 3. s->h263_flv = 1;
    /* select sub codec */
    switch (avctx->codec->id) {
    case AV_CODEC_ID_MSMPEG4V2:
        s->h263_pred       = 1;
        s->msmpeg4_version = 2;
        break;
    case AV_CODEC_ID_FLV1:
        s->h263_flv = 1;
        break;
    }
    s->codec_id    = avctx->codec->id;

	// 4. 解码器相关信息初始化
    /* for H.263, we allocate the images after having read the header */
    if (avctx->codec->id != AV_CODEC_ID_H263 &&
        avctx->codec->id != AV_CODEC_ID_H263P &&
        avctx->codec->id != AV_CODEC_ID_MPEG4) {
        avctx->pix_fmt = h263_get_format(avctx);
        ff_mpv_idct_init(s);
        if ((ret = ff_mpv_common_init(s)) < 0)
            return ret;
    }
	
    ff_h263dsp_init(&s->h263dsp);
    ff_qpeldsp_init(&s->qdsp);
    ff_h263_decode_init_vlc();

    return 0;
}

1.1 宏块解码 ff_h263_decode_mb()

92讲视频课+16大项目实战+源码+¥800元课程礼包+讲师社群1V1答疑+社群闭门分享会=99元   为什么学习数据分析?       人工智能、大数据时代有什么技能是可以运用在各种行业的?数据分析就是。       从海量数据中获得别人看不见的信息,创业者可以通过数据分析来优化产品,营销人员可以通过数据分析改进营销策略,产品经理可以通过数据分析洞察用户习惯,金融从业者可以通过数据分析规避投资风险,程序员可以通过数据分析进一步挖掘出数据价值,它和编程一样,本质上也是一个工具,通过数据来对现实事物进行分析和识别的能力。不管你从事什么行业,掌握了数据分析能力,往往在其岗位上更有竞争力。    本课程共包含五大模块: 一、先导篇: 通过分析数据分析师的一天,让学员了解全面了解成为一个数据分析师的所有必修功法,对数据分析师不在迷惑。   二、基础篇: 围绕Python基础语法介绍、数据预处理、数据可视化以及数据分析与挖掘......这些核心技能模块展开,帮助你快速而全面的掌握和了解成为一个数据分析师的所有必修功法。   三、数据采集篇: 通过网络爬虫实战解决数据分析的必经之路:数据从何来的问题,讲解常见的爬虫套路并利用三大实战帮助学员扎实数据采集能力,避免没有数据可分析的尴尬。   四、分析工具篇: 讲解数据分析避不开的科学计算库Numpy、数据分析工具Pandas及常见可视化工具Matplotlib。   五、算法篇: 算法是数据分析的精华,课程精选10大算法,包括分类、聚类、预测3大类型,每个算法都从原理和案例两个角度学习,让你不仅能用起来,了解原理,还能知道为什么这么做。
【为什么还需要学习C++?】 你是否接触很多语言,但从来没有了解过编程语言的本质? 你是否想成为一名资深开发人员,想开发别人做不了的高性能程序? 你是否经常想要窥探大型企业级开发工程的思路,但苦于没有基础只能望洋兴叹?   那么C++就是你个人能力提升,职业之路进阶的不二之选。 【课程特色】 1.课程共19大章节,239课时内容,涵盖数据结构、函数、类、指针、标准库全部知识体系。 2.带你从知识与思想的层面从0构建C++知识框架,分析大型项目实践思路,为你打下坚实的基础。 3.李宁老师结合4大国外顶级C++著作的精华为大家推出的《征服C++11》课程。 【学完后我将达到什么水平?】 1.对C++的各个知识能够熟练配置、开发、部署; 2.吊打一切关于C++的笔试面试题; 3.面向物联网的“嵌入式”和面向大型化的“分布式”开发,掌握职业钥匙,把握行业先机。 【面向人群】 1.希望一站式快速入门的C++初学者; 2.希望快速学习 C++、掌握编程要义、修炼内功的开发者; 3.有志于挑战更高级的开发项目,成为资深开发的工程师。 【课程设计】 本课程包含3大模块 基础篇 本篇主要讲解c++的基础概念,包含数据类型、运算符等基本语法,数组、指针、字符串等基本词法,循环、函数、类等基本句法等。 进阶篇 本篇主要讲解编程中常用的一些技能,包含类的高级技术、类的继承、编译链接和命名空间等。 提升篇: 本篇可以帮助学员更加高效的进行c++开发,其中包含类型转换、文件操作、异常处理、代码重用等内容。
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页