欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

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

发布时间:2023/12/16 编程问答 60 豆豆
生活随笔 收集整理的这篇文章主要介绍了 【FFmpeg编程进阶】(13)FLV 解码器初始化函数 ff_h263_decode_init() 代码分析 --- 待更新 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

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

    • 一、FLV解码 ff_h263_decode_init()
      • 1.1 宏块解码 ff_h263_decode_mb()

在前面分析《【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()

  • 初始化 MpegEncContext 解码器上下文结构体,将解码器Codec 上下文AVCodecContext 与 MpegEncContext 绑定在一起
  • 绑定宏块解码函数 ff_h263_decode_mb()
  • 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 defaultsff_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()

    总结

    以上是生活随笔为你收集整理的【FFmpeg编程进阶】(13)FLV 解码器初始化函数 ff_h263_decode_init() 代码分析 --- 待更新的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。