zoukankan      html  css  js  c++  java
  • ffmpeg之AVCodec

    AVCodec

    typedef struct AVCodec {
        /**
         * Name of the codec implementation.
         * The name is globally unique among encoders and among decoders (but an
         * encoder and a decoder can share the same name).
         * This is the primary way to find a codec from the user perspective.
         */
        const char *name;
        /**
         * Descriptive name for the codec, meant to be more human readable than name.
         * You should use the NULL_IF_CONFIG_SMALL() macro to define it.
         */
        const char *long_name;
        enum AVMediaType type;
        enum AVCodecID id;
        /**
         * Codec capabilities.
         * see AV_CODEC_CAP_*
         */
        int capabilities;
        const AVRational *supported_framerates; ///< array of supported framerates, or NULL if any, array is terminated by {0,0}
        const enum AVPixelFormat *pix_fmts;     ///< array of supported pixel formats, or NULL if unknown, array is terminated by -1
        const int *supported_samplerates;       ///< array of supported audio samplerates, or NULL if unknown, array is terminated by 0
        const enum AVSampleFormat *sample_fmts; ///< array of supported sample formats, or NULL if unknown, array is terminated by -1
        const uint64_t *channel_layouts;         ///< array of support channel layouts, or NULL if unknown. array is terminated by 0
        uint8_t max_lowres;                     ///< maximum value for lowres supported by the decoder
        const AVClass *priv_class;              ///< AVClass for the private context
        const AVProfile *profiles;              ///< array of recognized profiles, or NULL if unknown, array is terminated by {FF_PROFILE_UNKNOWN}
    
        /**
         * Group name of the codec implementation.
         * This is a short symbolic name of the wrapper backing this codec. A
         * wrapper uses some kind of external implementation for the codec, such
         * as an external library, or a codec implementation provided by the OS or
         * the hardware.
         * If this field is NULL, this is a builtin, libavcodec native codec.
         * If non-NULL, this will be the suffix in AVCodec.name in most cases
         * (usually AVCodec.name will be of the form "<codec_name>_<wrapper_name>").
         */
        const char *wrapper_name;
    
        /*****************************************************************
         * No fields below this line are part of the public API. They
         * may not be used outside of libavcodec and can be changed and
         * removed at will.
         * New public fields should be added right above.
         *****************************************************************
         */
        int priv_data_size;
        struct AVCodec *next;
        /**
         * @name Frame-level threading support functions
         * @{
         */
        /**
         * If defined, called on thread contexts when they are created.
         * If the codec allocates writable tables in init(), re-allocate them here.
         * priv_data will be set to a copy of the original.
         */
        int (*init_thread_copy)(AVCodecContext *);
        /**
         * Copy necessary context variables from a previous thread context to the current one.
         * If not defined, the next thread will start automatically; otherwise, the codec
         * must call ff_thread_finish_setup().
         *
         * dst and src will (rarely) point to the same context, in which case memcpy should be skipped.
         */
        int (*update_thread_context)(AVCodecContext *dst, const AVCodecContext *src);
        /** @} */
    
        /**
         * Private codec-specific defaults.
         */
        const AVCodecDefault *defaults;
    
        /**
         * Initialize codec static data, called from avcodec_register().
         *
         * This is not intended for time consuming operations as it is
         * run for every codec regardless of that codec being used.
         */
        void (*init_static_data)(struct AVCodec *codec);
    
        int (*init)(AVCodecContext *);
        int (*encode_sub)(AVCodecContext *, uint8_t *buf, int buf_size,
                          const struct AVSubtitle *sub);
        /**
         * Encode data to an AVPacket.
         *
         * @param      avctx          codec context
         * @param      avpkt          output AVPacket (may contain a user-provided buffer)
         * @param[in]  frame          AVFrame containing the raw data to be encoded
         * @param[out] got_packet_ptr encoder sets to 0 or 1 to indicate that a
         *                            non-empty packet was returned in avpkt.
         * @return 0 on success, negative error code on failure
         */
        int (*encode2)(AVCodecContext *avctx, AVPacket *avpkt, const AVFrame *frame,
                       int *got_packet_ptr);
        int (*decode)(AVCodecContext *, void *outdata, int *outdata_size, AVPacket *avpkt);
        int (*close)(AVCodecContext *);
        /**
         * Encode API with decoupled packet/frame dataflow. The API is the
         * same as the avcodec_ prefixed APIs (avcodec_send_frame() etc.), except
         * that:
         * - never called if the codec is closed or the wrong type,
         * - if AV_CODEC_CAP_DELAY is not set, drain frames are never sent,
         * - only one drain frame is ever passed down,
         */
        int (*send_frame)(AVCodecContext *avctx, const AVFrame *frame);
        int (*receive_packet)(AVCodecContext *avctx, AVPacket *avpkt);
    
        /**
         * Decode API with decoupled packet/frame dataflow. This function is called
         * to get one output frame. It should call ff_decode_get_packet() to obtain
         * input data.
         */
        int (*receive_frame)(AVCodecContext *avctx, AVFrame *frame);
        /**
         * Flush buffers.
         * Will be called when seeking
         */
        void (*flush)(AVCodecContext *);
        /**
         * Internal codec capabilities.
         * See FF_CODEC_CAP_* in internal.h
         */
        int caps_internal;
    
        /**
         * Decoding only, a comma-separated list of bitstream filters to apply to
         * packets before decoding.
         */
        const char *bsfs;
    
        /**
         * Array of pointers to hardware configurations supported by the codec,
         * or NULL if no hardware supported.  The array is terminated by a NULL
         * pointer.
         *
         * The user can only access this field via avcodec_get_hw_config().
         */
        const struct AVCodecHWConfigInternal **hw_configs;
    } AVCodec;
    

    成员变量说明

    // 成员变量
    const char *name;// 编码器名称,avcodec_find_encoder_by_name使用该变量
    const char *long_name; //编码器全称
    enum AVMediaType type; // 编码音视频类别
    enum AVCodecID id;   // 编码器唯一id,avcodec_find_encoder使用该变量
    const AVRational *supported_frames; // 支持的视频帧率
    const enum AVPixelFormat *pix_fts;  // 视频像素格式
    const int *supported_samplerates;  // 支持的音频采样率
    const enum AVSampleFormat *sample_fmts; // 音频采样格式
    const uint64_t *channel_layouts ; // 音频通道数
    int priv_data_size;
    const AVClass *priv_data;
    struct AVCodec *next;  // 链表下一个编码器
    // 成员函数
    int (*send_frame)(AVCodecContext *avctx, const AVFrame *frame);    // avcodec_send_frame调用
    int (*receive_packet)(AVCodecContext *avctx, AVPacket *avpkt);     // avcodec_recevie_packet调用
    int (*receive_frame)(AVCodecContext *avctx, AVFrame *frame);       // avcodec_send_packet/avcodec_receive_frame调用
    

    看具体实例更清晰

    实例AVCodec ff_aac_encoder

    AVCodec ff_aac_encoder = {
        .name           = "aac",              // 简单名字
        .long_name      = NULL_IF_CONFIG_SMALL("AAC (Advanced Audio Coding)"),                         // 复杂名字
        .type           = AVMEDIA_TYPE_AUDIO,    // 编码器所属音视频类别(见下方AVMediaType)
        .id             = AV_CODEC_ID_AAC,       // 编码器唯一标示(avcodec.h)
        .priv_data_size = sizeof(AACEncContext),
        .init           = aac_encode_init,       // 编码器ctx初始化函数
        .encode2        = aac_encode_frame,      // 编码frame为packet的函数 
        .close          = aac_encode_end,        // 资源清理函数
        .defaults       = aac_encode_defaults,
        .supported_samplerates = mpeg4audio_sample_rates, // 编码器支持的采样率
        .caps_internal  = FF_CODEC_CAP_INIT_THREADSAFE,  
        .capabilities   = AV_CODEC_CAP_SMALL_LAST_FRAME | AV_CODEC_CAP_DELAY,
        .sample_fmts    = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_FLTP,
                                                         AV_SAMPLE_FMT_NONE },     // 编码器支持的采样格式
        .priv_class     = &aacenc_class,
    };
    

    实例AVCodec ff_libx264_encoder

    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     = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AUTO_THREADS |
                            AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE,
        .priv_class       = &x264_class,
        .defaults         = x264_defaults,
        .init_static_data = X264_init_static,
        .caps_internal    = FF_CODEC_CAP_INIT_CLEANUP,
        .wrapper_name     = "libx264",
    };
    

    AVMediaType

    /**
     * @addtogroup lavu_media Media Type
     * @brief Media Type
     */
    
    enum AVMediaType {
        AVMEDIA_TYPE_UNKNOWN = -1,  ///< Usually treated as AVMEDIA_TYPE_DATA
        AVMEDIA_TYPE_VIDEO,
        AVMEDIA_TYPE_AUDIO,
        AVMEDIA_TYPE_DATA,          ///< Opaque data information usually continuous
        AVMEDIA_TYPE_SUBTITLE,
        AVMEDIA_TYPE_ATTACHMENT,    ///< Opaque data information usually sparse
        AVMEDIA_TYPE_NB
    };
    

    AVClass

    /**
     * Describe the class of an AVClass context structure. That is an
     * arbitrary struct of which the first field is a pointer to an
     * AVClass struct (e.g. AVCodecContext, AVFormatContext etc.).
     */
    typedef struct AVClass {
        /**
         * The name of the class; usually it is the same name as the
         * context structure type to which the AVClass is associated.
         */
        const char* class_name;
    
        /**
         * A pointer to a function which returns the name of a context
         * instance ctx associated with the class.
         */
        const char* (*item_name)(void* ctx);
    
        /**
         * a pointer to the first option specified in the class if any or NULL
         *
         * @see av_set_default_options()
         */
        const struct AVOption *option;
    
        /**
         * LIBAVUTIL_VERSION with which this structure was created.
         * This is used to allow fields to be added without requiring major
         * version bumps everywhere.
         */
    
        int version;
    
        /**
         * Offset in the structure where log_level_offset is stored.
         * 0 means there is no such variable
         */
        int log_level_offset_offset;
    
        /**
         * Offset in the structure where a pointer to the parent context for
         * logging is stored. For example a decoder could pass its AVCodecContext
         * to eval as such a parent context, which an av_log() implementation
         * could then leverage to display the parent context.
         * The offset can be NULL.
         */
        int parent_log_context_offset;
    
        /**
         * Return next AVOptions-enabled child or NULL
         */
        void* (*child_next)(void *obj, void *prev);
    
        /**
         * Return an AVClass corresponding to the next potential
         * AVOptions-enabled child.
         *
         * The difference between child_next and this is that
         * child_next iterates over _already existing_ objects, while
         * child_class_next iterates over _all possible_ children.
         */
        const struct AVClass* (*child_class_next)(const struct AVClass *prev);
    
        /**
         * Category used for visualization (like color)
         * This is only set if the category is equal for all objects using this class.
         * available since version (51 << 16 | 56 << 8 | 100)
         */
        AVClassCategory category;
    
        /**
         * Callback to return the category.
         * available since version (51 << 16 | 59 << 8 | 100)
         */
        AVClassCategory (*get_category)(void* ctx);
    
        /**
         * Callback to return the supported/allowed ranges.
         * available since version (52.12)
         */
        int (*query_ranges)(struct AVOptionRanges **, void *obj, const char *key, int flags);
    } AVClass;
    
    

    本文来自博客园,作者:faithlocus,转载请注明原文链接:https://www.cnblogs.com/faithlocus/p/15679259.html

  • 相关阅读:
    cpanel 定时运行sh/php
    zencart 后台目录产品黄色icon_yellow_on.gif 解决方案
    字符串编码---hash函数的应用
    Tiling_easy version(填2 x N的格子的种类)
    n行m列的网格中含有的矩形数
    Openstack
    Docker
    Tornado模块
    LAMP应用部署
    数据库管理
  • 原文地址:https://www.cnblogs.com/faithlocus/p/15679259.html
Copyright © 2011-2022 走看看