ffmpeg之avcodec_alloc_context3


結構體AVCodecContext

點擊這里查看AVCodecContext

結構體AVCodec

點擊這里查看AVCodec

函數聲明avcodec_alloc_context3

/**
 * Allocate an AVCodecContext and set its fields to default values. The
 * resulting struct should be freed with avcodec_free_context().
 * 為AVCodecContext結構體分配內存,並將各字段設置為默認值,結果返回的結構體需要使用avcodec_free_context()進行釋放內存
 * 
 * @param codec if non-NULL, allocate private data and initialize defaults
 *              for the given codec. It is illegal to then call avcodec_open2()
 *              with a different codec.
 * 參數codec非空,這利用codec的指定參數初始化AVCodecContext,
 * avio_open2綁定編碼器codec_a與利用編碼器codec_b初始化的ctx是非法的。
 *              If NULL, then the codec-specific defaults won't be initialized,
 *              which may result in suboptimal default settings (this is
 *              important mainly for encoders, e.g. libx264).
 * 如果codec為空,則不初始化ctx的特定編碼器參數ctx->codec,這個參數很重要
 * @return An AVCodecContext filled with default values or NULL on failure.
 * 函數執行成功這返回ctx,失敗則返回nullptr
 */
AVCodecContext *avcodec_alloc_context3(const AVCodec *codec);

函數實現

AVCodecContext *avcodec_alloc_context3(const AVCodec *codec)
{
    // 為avctx分配內存
    AVCodecContext *avctx= av_malloc(sizeof(AVCodecContext));

    // 失敗返回null
    if (!avctx)
        return NULL;

    // 利用codec初始化avctx
    if (init_context_defaults(avctx, codec) < 0) {
        av_free(avctx);
        return NULL;
    }

    // 成功返回avctx
    return avctx;
}


static int init_context_defaults(AVCodecContext *s, const AVCodec *codec)
{
    int flags=0;
    // ctx內存清零
    memset(s, 0, sizeof(AVCodecContext));

    s->av_class = &av_codec_context_class;

    // 編碼類型,audio,video,subtitle等
    s->codec_type = codec ? codec->type : AVMEDIA_TYPE_UNKNOWN;
    if (codec) {
        s->codec = codec;
        s->codec_id = codec->id;
    }

    // 初始化參數
    if(s->codec_type == AVMEDIA_TYPE_AUDIO)
        flags= AV_OPT_FLAG_AUDIO_PARAM;
    else if(s->codec_type == AVMEDIA_TYPE_VIDEO)
        flags= AV_OPT_FLAG_VIDEO_PARAM;
    else if(s->codec_type == AVMEDIA_TYPE_SUBTITLE)
        flags= AV_OPT_FLAG_SUBTITLE_PARAM;
    av_opt_set_defaults2(s, flags, flags);

    s->time_base           = (AVRational){0,1};
    s->framerate           = (AVRational){ 0, 1 };
    s->pkt_timebase        = (AVRational){ 0, 1 };
    s->get_buffer2         = avcodec_default_get_buffer2;
    s->get_format          = avcodec_default_get_format;
    s->execute             = avcodec_default_execute;
    s->execute2            = avcodec_default_execute2;
    s->sample_aspect_ratio = (AVRational){0,1};
    s->pix_fmt             = AV_PIX_FMT_NONE;
    s->sw_pix_fmt          = AV_PIX_FMT_NONE;
    s->sample_fmt          = AV_SAMPLE_FMT_NONE;

    s->reordered_opaque    = AV_NOPTS_VALUE;
    if(codec && codec->priv_data_size){
        if(!s->priv_data){
            s->priv_data= av_mallocz(codec->priv_data_size);
            if (!s->priv_data) {
                return AVERROR(ENOMEM);
            }
        }
        if(codec->priv_class){
            *(const AVClass**)s->priv_data = codec->priv_class;
            av_opt_set_defaults(s->priv_data);
        }
    }
    if (codec && codec->defaults) {
        int ret;
        const AVCodecDefault *d = codec->defaults;
        while (d->key) {
            ret = av_opt_set(s, d->key, d->value, 0);
            av_assert0(ret >= 0);
            d++;
        }
    }
    return 0;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM