FFmpeg源代码简单分析 avcodec close

               

=====================================================

FFmpeg的库函数源代码分析文章列表:

【架构图】

FFmpeg源代码结构图 - 解码

FFmpeg源代码结构图 - 编码

【通用】

FFmpeg 源代码简单分析:av_register_all()

FFmpeg 源代码简单分析:avcodec_register_all()

FFmpeg 源代码简单分析:内存的分配和释放(av_malloc()av_free()等)

FFmpeg 源代码简单分析:常见结构体的初始化和销毁(AVFormatContextAVFrame等)

FFmpeg 源代码简单分析:avio_open2()

FFmpeg 源代码简单分析:av_find_decoder()av_find_encoder()

FFmpeg 源代码简单分析:avcodec_open2()

FFmpeg 源代码简单分析:avcodec_close()

【解码】

图解FFMPEG打开媒体的函数avformat_open_input

FFmpeg 源代码简单分析:avformat_open_input()

FFmpeg 源代码简单分析:avformat_find_stream_info()

FFmpeg 源代码简单分析:av_read_frame()

FFmpeg 源代码简单分析:avcodec_decode_video2()

FFmpeg 源代码简单分析:avformat_close_input()

【编码】

FFmpeg 源代码简单分析:avformat_alloc_output_context2()

FFmpeg 源代码简单分析:avformat_write_header()

FFmpeg 源代码简单分析:avcodec_encode_video()

FFmpeg 源代码简单分析:av_write_frame()

FFmpeg 源代码简单分析:av_write_trailer()

【其它】

FFmpeg源代码简单分析:日志输出系统(av_log()等)

FFmpeg源代码简单分析:结构体成员管理系统-AVClass

FFmpeg源代码简单分析:结构体成员管理系统-AVOption

FFmpeg源代码简单分析:libswscalesws_getContext()

FFmpeg源代码简单分析:libswscalesws_scale()

FFmpeg源代码简单分析:libavdeviceavdevice_register_all()

FFmpeg源代码简单分析:libavdevicegdigrab

【脚本】

FFmpeg源代码简单分析:makefile

FFmpeg源代码简单分析:configure

【H.264】

FFmpegH.264解码器源代码简单分析:概述

=====================================================


本文简单分析FFmpeg的avcodec_close()函数。该函数用于关闭编码器。avcodec_close()函数的声明位于libavcodec\avcodec.h,如下所示。


/** * Close a given AVCodecContext and free all the data associated with it * (but not the AVCodecContext itself). * * Calling this function on an AVCodecContext that hasn't been opened will free * the codec-specific data allocated in avcodec_alloc_context3() / * avcodec_get_context_defaults3() with a non-NULL codec. Subsequent calls will * do nothing. */int avcodec_close(AVCodecContext *avctx);

该函数只有一个参数,就是需要关闭的编码器的AVCodecContext。

函数调用关系图

函数的调用关系图如下所示。

avcodec_close()

avcodec_close()的定义位于libavcodec\utils.c,如下所示。
av_cold int avcodec_close(AVCodecContext *avctx){    if (!avctx)        return 0;    if (avcodec_is_open(avctx)) {        FramePool *pool = avctx->internal->pool;        int i;        if (CONFIG_FRAME_THREAD_ENCODER &&            avctx->internal->frame_thread_encoder && avctx->thread_count > 1) {            ff_frame_thread_encoder_free(avctx);        }        if (HAVE_THREADS && avctx->internal->thread_ctx)            ff_thread_free(avctx);        //关闭编解码器        if (avctx->codec && avctx->codec->close)            avctx->codec->close(avctx);        avctx->coded_frame = NULL;        avctx->internal->byte_buffer_size = 0;        av_freep(&avctx->internal->byte_buffer);        av_frame_free(&avctx->internal->to_free);        for (i = 0; i < FF_ARRAY_ELEMS(pool->pools); i++)            av_buffer_pool_uninit(&pool->pools[i]);        av_freep(&avctx->internal->pool);        if (avctx->hwaccel && avctx->hwaccel->uninit)            avctx->hwaccel->uninit(avctx);        av_freep(&avctx->internal->hwaccel_priv_data);        av_freep(&avctx->internal);    }    if (avctx->priv_data && avctx->codec && avctx->codec->priv_class)        av_opt_free(avctx->priv_data);    av_opt_free(avctx);    av_freep(&avctx->priv_data);    if (av_codec_is_encoder(avctx->codec))        av_freep(&avctx->extradata);    avctx->codec = NULL;    avctx->active_thread_type = 0;    return 0;}

从avcodec_close()的定义可以看出,该函数释放AVCodecContext中有关的变量,并且调用了AVCodec的close()关闭了解码器。


AVCodec->close()

AVCodec的close()是一个函数指针,指向了特定编码器的关闭函数。在这里我们以libx264为例,看一下它对应的AVCodec的结构体的定义,如下所示。
AVCodec ff_libx264_encoder = {    .name             = "libx264",    .long_name        = NULL_IF_CONFIG_SMALL("libx264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10"),    .type             = AVMEDIA_TYPE_VIDEO,    .id               = AV_CODEC_ID_H264,    .priv_data_size   = sizeof(X264Context),    .init             = X264_init,    .encode2          = X264_frame,    .close            = X264_close,    .capabilities     = CODEC_CAP_DELAY | CODEC_CAP_AUTO_THREADS,    .priv_class       = &x264_class,    .defaults         = x264_defaults,    .init_static_data = X264_init_static,};

从ff_libx264_encoder的定义可以看出:close()函数对应的是X264_close()函数。继续看一下X264_close()函数的定义,如下所示。
static av_cold int X264_close(AVCodecContext *avctx){    X264Context *x4 = avctx->priv_data;    av_freep(&avctx->extradata);    av_freep(&x4->sei);    //关闭编码器    if (x4->enc)        x264_encoder_close(x4->enc);    av_frame_free(&avctx->coded_frame);    return 0;}

从X264_close()的定义可以看出,该函数调用了libx264的x264_encoder_close()关闭了libx264编码器。


雷霄骅
[email protected]
http://blog.csdn.net/leixiaohua1020

           

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

猜你喜欢

转载自blog.csdn.net/hffgjh/article/details/87872933