FFmpeg总结(五)AV系列结构体之AVCodec、AVCodecParameters、AVCodecParser、AVCodecParserContext、AVCodecDescriptor

来源:互联网 发布:记录工作时间的软件 编辑:程序博客网 时间:2024/06/07 05:05


这里写图片描述

AVCodec: 编解码器结构体
位于libavcodec/avcodec.h中

typedef struct AVCodec {    const char *name; // codec的名字,保持全局唯一,标识名    const char *long_name; // codec的名字,全名    enum AVMediaType type; // Media类型,是视频,音频,还是字幕    enum AVCodecID id;    int capabilities; //  codec的容量,参考 AV_CODEC_CAP_*    const AVRational *supported_framerates; //支持的帧率,如果是null,返回是{0,0}    const enum AVPixelFormat *pix_fmts;  //支持的像素格式,如果是null或unknown,返回-1    const int *supported_samplerates;     //支持的采样率,如果是null或unknown,返回0      const enum AVSampleFormat *sample_fmts;  //支持的采样率,如果是null,返回-1     const uint64_t *channel_layouts;     //支持的声道数, 如果是null,返回0     uint8_t max_lowres;                  //解码器支持的最大lowres      const AVClass *priv_class;    //定义AVClass 成员变量       const AVProfile *profiles;    //定义AVProfile 成员变量              /*****************************************************************     * 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().     */    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 *);    /**     * Decode/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,     * - AVPacket parameter change side data is applied right before calling     *   AVCodec->send_packet,     * - if AV_CODEC_CAP_DELAY is not set, drain packets or frames are never sent,     * - only one drain packet is ever passed down (until the next flush()),     * - a drain AVPacket is always NULL (no need to check for avpkt->size).     */    int (*send_frame)(AVCodecContext *avctx, const AVFrame *frame);    int (*send_packet)(AVCodecContext *avctx, const AVPacket *avpkt);    int (*receive_frame)(AVCodecContext *avctx, AVFrame *frame);    int (*receive_packet)(AVCodecContext *avctx, AVPacket *avpkt);    /**     * Flush buffers.     * Will be called when seeking     */    void (*flush)(AVCodecContext *);    /**     * Internal codec capabilities.     * See FF_CODEC_CAP_* in internal.h     */    int caps_internal;} AVCodec;

AVCodecParameters:描述一个解码后的流的属性
sizeof(AVCodecParameters),并不是public的api, 这个结构必须通过avcodec_parameters_alloc()分配空间,通过avcodec_parameters_free()释放空间。

typedef struct AVCodecParameters {    /**     * General type of the encoded data.     */    enum AVMediaType codec_type;    /**     * Specific type of the encoded data (the codec used).     */    enum AVCodecID   codec_id;    /**     * Additional information about the codec (corresponds to the AVI FOURCC).     */    uint32_t         codec_tag;    /**     * Extra binary data needed for initializing the decoder, codec-dependent.     *     * Must be allocated with av_malloc() and will be freed by     * avcodec_parameters_free(). The allocated size of extradata must be at     * least extradata_size + AV_INPUT_BUFFER_PADDING_SIZE, with the padding     * bytes zeroed.     */    uint8_t *extradata;    /**     * Size of the extradata content in bytes.     */    int      extradata_size;    /**     * - video: the pixel format, the value corresponds to enum AVPixelFormat.     * - audio: the sample format, the value corresponds to enum AVSampleFormat.     */    int format;    /**     * The average bitrate of the encoded data (in bits per second).     */    int64_t bit_rate;    /**     * The number of bits per sample in the codedwords.     *     * This is basically the bitrate per sample. It is mandatory for a bunch of     * formats to actually decode them. It's the number of bits for one sample in     * the actual coded bitstream.     *     * This could be for example 4 for ADPCM     * For PCM formats this matches bits_per_raw_sample     * Can be 0     */    int bits_per_coded_sample;    /**     * This is the number of valid bits in each output sample. If the     * sample format has more bits, the least significant bits are additional     * padding bits, which are always 0. Use right shifts to reduce the sample     * to its actual size. For example, audio formats with 24 bit samples will     * have bits_per_raw_sample set to 24, and format set to AV_SAMPLE_FMT_S32.     * To get the original sample use "(int32_t)sample >> 8"."     *     * For ADPCM this might be 12 or 16 or similar     * Can be 0     */    int bits_per_raw_sample;    /**     * Codec-specific bitstream restrictions that the stream conforms to.     */    int profile;    int level;    /**     * Video only. The dimensions of the video frame in pixels.     */    int width;    int height;    /**     * Video only. The aspect ratio (width / height) which a single pixel     * should have when displayed.     *     * When the aspect ratio is unknown / undefined, the numerator should be     * set to 0 (the denominator may have any value).     */    AVRational sample_aspect_ratio;    /**     * Video only. The order of the fields in interlaced video.     */    enum AVFieldOrder                  field_order;    /**     * Video only. Additional colorspace characteristics.     */    enum AVColorRange                  color_range;    enum AVColorPrimaries              color_primaries;    enum AVColorTransferCharacteristic color_trc;    enum AVColorSpace                  color_space;    enum AVChromaLocation              chroma_location;    /**     * Video only. Number of delayed frames.     */    int video_delay;    /**     * Audio only. The channel layout bitmask. May be 0 if the channel layout is     * unknown or unspecified, otherwise the number of bits set must be equal to     * the channels field.     */    uint64_t channel_layout;    /**     * Audio only. The number of audio channels.     */    int      channels;    /**     * Audio only. The number of audio samples per second.     */    int      sample_rate;    /**     * Audio only. The number of bytes per coded audio frame, required by some     * formats.     *     * Corresponds to nBlockAlign in WAVEFORMATEX.     */    int      block_align;    /**     * Audio only. Audio frame size, if known. Required by some formats to be static.     */    int      frame_size;    /**     * Audio only. The amount of padding (in samples) inserted by the encoder at     * the beginning of the audio. I.e. this number of leading decoded samples     * must be discarded by the caller to get the original audio without leading     * padding.     */    int initial_padding;    /**     * Audio only. The amount of padding (in samples) appended by the encoder to     * the end of the audio. I.e. this number of decoded samples must be     * discarded by the caller from the end of the stream to get the original     * audio without any trailing padding.     */    int trailing_padding;    /**     * Audio only. Number of samples to skip after a discontinuity.     */    int seek_preroll;} AVCodecParameters;

AVCodecParser

typedef struct AVCodecParser {    int codec_ids[5]; /* several codec IDs are permitted */    int priv_data_size;    int (*parser_init)(AVCodecParserContext *s);    /* This callback never returns an error, a negative value means that     * the frame start was in a previous packet. */    int (*parser_parse)(AVCodecParserContext *s,                        AVCodecContext *avctx,                        const uint8_t **poutbuf, int *poutbuf_size,                        const uint8_t *buf, int buf_size);    void (*parser_close)(AVCodecParserContext *s);    int (*split)(AVCodecContext *avctx, const uint8_t *buf, int buf_size);    struct AVCodecParser *next;} AVCodecParser;

AVCodecParserContext :Frame parsing

typedef struct AVCodecParserContext {    void *priv_data;    struct AVCodecParser *parser;    int64_t frame_offset; /* offset of the current frame */    int64_t cur_offset; /* current offset                           (incremented by each av_parser_parse()) */    int64_t next_frame_offset; /* offset of the next frame */    /* video info */    int pict_type; /* XXX: Put it back in AVCodecContext. */    /**     * This field is used for proper frame duration computation in lavf.     * It signals, how much longer the frame duration of the current frame     * is compared to normal frame duration.     *     * frame_duration = (1 + repeat_pict) * time_base     *     * It is used by codecs like H.264 to display telecined material.     */    int repeat_pict; /* XXX: Put it back in AVCodecContext. */    int64_t pts;     /* pts of the current frame */    int64_t dts;     /* dts of the current frame */    /* private data */    int64_t last_pts;    int64_t last_dts;    int fetch_timestamp;#define AV_PARSER_PTS_NB 4    int cur_frame_start_index;    int64_t cur_frame_offset[AV_PARSER_PTS_NB];    int64_t cur_frame_pts[AV_PARSER_PTS_NB];    int64_t cur_frame_dts[AV_PARSER_PTS_NB];    int flags;#define PARSER_FLAG_COMPLETE_FRAMES           0x0001#define PARSER_FLAG_ONCE                      0x0002/// Set if the parser has a valid file offset#define PARSER_FLAG_FETCHED_OFFSET            0x0004#define PARSER_FLAG_USE_CODEC_TS              0x1000    int64_t offset;      ///< byte offset from starting packet start    int64_t cur_frame_end[AV_PARSER_PTS_NB];    /**     * Set by parser to 1 for key frames and 0 for non-key frames.     * It is initialized to -1, so if the parser doesn't set this flag,     * old-style fallback using AV_PICTURE_TYPE_I picture type as key frames     * will be used.     */    int key_frame;#if FF_API_CONVERGENCE_DURATION    /**     * @deprecated unused     */    attribute_deprecated    int64_t convergence_duration;#endif    // Timestamp generation support:    /**     * Synchronization point for start of timestamp generation.     *     * Set to >0 for sync point, 0 for no sync point and <0 for undefined     * (default).     *     * For example, this corresponds to presence of H.264 buffering period     * SEI message.     */    int dts_sync_point;    /**     * Offset of the current timestamp against last timestamp sync point in     * units of AVCodecContext.time_base.     *     * Set to INT_MIN when dts_sync_point unused. Otherwise, it must     * contain a valid timestamp offset.     *     * Note that the timestamp of sync point has usually a nonzero     * dts_ref_dts_delta, which refers to the previous sync point. Offset of     * the next frame after timestamp sync point will be usually 1.     *     * For example, this corresponds to H.264 cpb_removal_delay.     */    int dts_ref_dts_delta;    /**     * Presentation delay of current frame in units of AVCodecContext.time_base.     *     * Set to INT_MIN when dts_sync_point unused. Otherwise, it must     * contain valid non-negative timestamp delta (presentation time of a frame     * must not lie in the past).     *     * This delay represents the difference between decoding and presentation     * time of the frame.     *     * For example, this corresponds to H.264 dpb_output_delay.     */    int pts_dts_delta;    /**     * Position of the packet in file.     *     * Analogous to cur_frame_pts/dts     */    int64_t cur_frame_pos[AV_PARSER_PTS_NB];    /**     * Byte position of currently parsed frame in stream.     */    int64_t pos;    /**     * Previous frame byte position.     */    int64_t last_pos;    /**     * Duration of the current frame.     * For audio, this is in units of 1 / AVCodecContext.sample_rate.     * For all other types, this is in units of AVCodecContext.time_base.     */    int duration;    enum AVFieldOrder field_order;    /**     * Indicate whether a picture is coded as a frame, top field or bottom field.     *     * For example, H.264 field_pic_flag equal to 0 corresponds to     * AV_PICTURE_STRUCTURE_FRAME. An H.264 picture with field_pic_flag     * equal to 1 and bottom_field_flag equal to 0 corresponds to     * AV_PICTURE_STRUCTURE_TOP_FIELD.     */    enum AVPictureStructure picture_structure;    /**     * Picture number incremented in presentation or output order.     * This field may be reinitialized at the first picture of a new sequence.     *     * For example, this corresponds to H.264 PicOrderCnt.     */    int output_picture_number;    /**     * Dimensions of the decoded video intended for presentation.     */    int width;    int height;    /**     * Dimensions of the coded video.     */    int coded_width;    int coded_height;    /**     * The format of the coded data, corresponds to enum AVPixelFormat for video     * and for enum AVSampleFormat for audio.     *     * Note that a decoder can have considerable freedom in how exactly it     * decodes the data, so the format reported here might be different from the     * one returned by a decoder.     */    int format;} AVCodecParserContext;

AVCodecDescriptor:描述单个解码器的属性,单个解码器被描述是通过AVCodecID

typedef struct AVCodecDescriptor {    enum AVCodecID     id;    enum AVMediaType type;    const char      *name;    const char *long_name;    /**     * Codec properties, a combination of AV_CODEC_PROP_* flags.     */    int             props;    /**     * MIME type(s) associated with the codec.     * May be NULL; if not, a NULL-terminated array of MIME types.     * The first item is always non-NULL and is the preferred MIME type.     */    const char *const *mime_types;    /**     * If non-NULL, an array of profiles recognized for this codec.     * Terminated with FF_PROFILE_UNKNOWN.     */    const struct AVProfile *profiles;} AVCodecDescriptor;

AVCodecID:枚举出FFmpeg所有解码器id

enum AVCodecID {    AV_CODEC_ID_NONE,    /* video codecs */    AV_CODEC_ID_MPEG1VIDEO,    AV_CODEC_ID_MPEG2VIDEO, ///< preferred ID for MPEG-1/2 video decoding#if FF_API_XVMC    AV_CODEC_ID_MPEG2VIDEO_XVMC,#endif /* FF_API_XVMC */    AV_CODEC_ID_H261,    AV_CODEC_ID_H263,    AV_CODEC_ID_RV10,    AV_CODEC_ID_RV20,    AV_CODEC_ID_MJPEG,    AV_CODEC_ID_MJPEGB,    AV_CODEC_ID_LJPEG,    AV_CODEC_ID_SP5X,    AV_CODEC_ID_JPEGLS,    AV_CODEC_ID_MPEG4,    AV_CODEC_ID_RAWVIDEO,    AV_CODEC_ID_MSMPEG4V1,    AV_CODEC_ID_MSMPEG4V2,    AV_CODEC_ID_MSMPEG4V3,    AV_CODEC_ID_WMV1,    AV_CODEC_ID_WMV2,    AV_CODEC_ID_H263P,    AV_CODEC_ID_H263I,    AV_CODEC_ID_FLV1,    AV_CODEC_ID_SVQ1,    AV_CODEC_ID_SVQ3,    AV_CODEC_ID_DVVIDEO,    AV_CODEC_ID_HUFFYUV,    AV_CODEC_ID_CYUV,    AV_CODEC_ID_H264,    AV_CODEC_ID_INDEO3,    AV_CODEC_ID_VP3,    AV_CODEC_ID_THEORA,    AV_CODEC_ID_ASV1,    AV_CODEC_ID_ASV2,    AV_CODEC_ID_FFV1,    AV_CODEC_ID_4XM,    AV_CODEC_ID_VCR1,    AV_CODEC_ID_CLJR,    AV_CODEC_ID_MDEC,    AV_CODEC_ID_ROQ,    AV_CODEC_ID_INTERPLAY_VIDEO,    AV_CODEC_ID_XAN_WC3,    AV_CODEC_ID_XAN_WC4,    AV_CODEC_ID_RPZA,    AV_CODEC_ID_CINEPAK,    AV_CODEC_ID_WS_VQA,    AV_CODEC_ID_MSRLE,    AV_CODEC_ID_MSVIDEO1,    AV_CODEC_ID_IDCIN,    AV_CODEC_ID_8BPS,    AV_CODEC_ID_SMC,    AV_CODEC_ID_FLIC,    AV_CODEC_ID_TRUEMOTION1,    AV_CODEC_ID_VMDVIDEO,    AV_CODEC_ID_MSZH,    AV_CODEC_ID_ZLIB,    AV_CODEC_ID_QTRLE,    AV_CODEC_ID_TSCC,    AV_CODEC_ID_ULTI,    AV_CODEC_ID_QDRAW,    AV_CODEC_ID_VIXL,    AV_CODEC_ID_QPEG,    AV_CODEC_ID_PNG,    AV_CODEC_ID_PPM,    AV_CODEC_ID_PBM,    AV_CODEC_ID_PGM,    AV_CODEC_ID_PGMYUV,    AV_CODEC_ID_PAM,    AV_CODEC_ID_FFVHUFF,    AV_CODEC_ID_RV30,    AV_CODEC_ID_RV40,    AV_CODEC_ID_VC1,    AV_CODEC_ID_WMV3,    AV_CODEC_ID_LOCO,    AV_CODEC_ID_WNV1,    AV_CODEC_ID_AASC,    AV_CODEC_ID_INDEO2,    AV_CODEC_ID_FRAPS,    AV_CODEC_ID_TRUEMOTION2,    AV_CODEC_ID_BMP,    AV_CODEC_ID_CSCD,    AV_CODEC_ID_MMVIDEO,    AV_CODEC_ID_ZMBV,    AV_CODEC_ID_AVS,    AV_CODEC_ID_SMACKVIDEO,    AV_CODEC_ID_NUV,    AV_CODEC_ID_KMVC,    AV_CODEC_ID_FLASHSV,    AV_CODEC_ID_CAVS,    AV_CODEC_ID_JPEG2000,    AV_CODEC_ID_VMNC,    AV_CODEC_ID_VP5,    AV_CODEC_ID_VP6,    AV_CODEC_ID_VP6F,    AV_CODEC_ID_TARGA,    AV_CODEC_ID_DSICINVIDEO,    AV_CODEC_ID_TIERTEXSEQVIDEO,    AV_CODEC_ID_TIFF,    AV_CODEC_ID_GIF,    AV_CODEC_ID_DXA,    AV_CODEC_ID_DNXHD,    AV_CODEC_ID_THP,    AV_CODEC_ID_SGI,    AV_CODEC_ID_C93,    AV_CODEC_ID_BETHSOFTVID,    AV_CODEC_ID_PTX,    AV_CODEC_ID_TXD,    AV_CODEC_ID_VP6A,    AV_CODEC_ID_AMV,    AV_CODEC_ID_VB,    AV_CODEC_ID_PCX,    AV_CODEC_ID_SUNRAST,    AV_CODEC_ID_INDEO4,    AV_CODEC_ID_INDEO5,    AV_CODEC_ID_MIMIC,    AV_CODEC_ID_RL2,    AV_CODEC_ID_ESCAPE124,    AV_CODEC_ID_DIRAC,    AV_CODEC_ID_BFI,    AV_CODEC_ID_CMV,    AV_CODEC_ID_MOTIONPIXELS,    AV_CODEC_ID_TGV,    AV_CODEC_ID_TGQ,    AV_CODEC_ID_TQI,    AV_CODEC_ID_AURA,    AV_CODEC_ID_AURA2,    AV_CODEC_ID_V210X,    AV_CODEC_ID_TMV,    AV_CODEC_ID_V210,    AV_CODEC_ID_DPX,    AV_CODEC_ID_MAD,    AV_CODEC_ID_FRWU,    AV_CODEC_ID_FLASHSV2,    AV_CODEC_ID_CDGRAPHICS,    AV_CODEC_ID_R210,    AV_CODEC_ID_ANM,    AV_CODEC_ID_BINKVIDEO,    AV_CODEC_ID_IFF_ILBM,#define AV_CODEC_ID_IFF_BYTERUN1 AV_CODEC_ID_IFF_ILBM    AV_CODEC_ID_KGV1,    AV_CODEC_ID_YOP,    AV_CODEC_ID_VP8,    AV_CODEC_ID_PICTOR,    AV_CODEC_ID_ANSI,    AV_CODEC_ID_A64_MULTI,    AV_CODEC_ID_A64_MULTI5,    AV_CODEC_ID_R10K,    AV_CODEC_ID_MXPEG,    AV_CODEC_ID_LAGARITH,    AV_CODEC_ID_PRORES,    AV_CODEC_ID_JV,    AV_CODEC_ID_DFA,    AV_CODEC_ID_WMV3IMAGE,    AV_CODEC_ID_VC1IMAGE,    AV_CODEC_ID_UTVIDEO,    AV_CODEC_ID_BMV_VIDEO,    AV_CODEC_ID_VBLE,    AV_CODEC_ID_DXTORY,    AV_CODEC_ID_V410,    AV_CODEC_ID_XWD,    AV_CODEC_ID_CDXL,    AV_CODEC_ID_XBM,    AV_CODEC_ID_ZEROCODEC,    AV_CODEC_ID_MSS1,    AV_CODEC_ID_MSA1,    AV_CODEC_ID_TSCC2,    AV_CODEC_ID_MTS2,    AV_CODEC_ID_CLLC,    AV_CODEC_ID_MSS2,    AV_CODEC_ID_VP9,    AV_CODEC_ID_AIC,    AV_CODEC_ID_ESCAPE130,    AV_CODEC_ID_G2M,    AV_CODEC_ID_WEBP,    AV_CODEC_ID_HNM4_VIDEO,    AV_CODEC_ID_HEVC,#define AV_CODEC_ID_H265 AV_CODEC_ID_HEVC    AV_CODEC_ID_FIC,    AV_CODEC_ID_ALIAS_PIX,    AV_CODEC_ID_BRENDER_PIX,    AV_CODEC_ID_PAF_VIDEO,    AV_CODEC_ID_EXR,    AV_CODEC_ID_VP7,    AV_CODEC_ID_SANM,    AV_CODEC_ID_SGIRLE,    AV_CODEC_ID_MVC1,    AV_CODEC_ID_MVC2,    AV_CODEC_ID_HQX,    AV_CODEC_ID_TDSC,    AV_CODEC_ID_HQ_HQA,    AV_CODEC_ID_HAP,    AV_CODEC_ID_DDS,    AV_CODEC_ID_DXV,    AV_CODEC_ID_SCREENPRESSO,    AV_CODEC_ID_RSCC,    AV_CODEC_ID_Y41P = 0x8000,    AV_CODEC_ID_AVRP,    AV_CODEC_ID_012V,    AV_CODEC_ID_AVUI,    AV_CODEC_ID_AYUV,    AV_CODEC_ID_TARGA_Y216,    AV_CODEC_ID_V308,    AV_CODEC_ID_V408,    AV_CODEC_ID_YUV4,    AV_CODEC_ID_AVRN,    AV_CODEC_ID_CPIA,    AV_CODEC_ID_XFACE,    AV_CODEC_ID_SNOW,    AV_CODEC_ID_SMVJPEG,    AV_CODEC_ID_APNG,    AV_CODEC_ID_DAALA,    AV_CODEC_ID_CFHD,    AV_CODEC_ID_TRUEMOTION2RT,    AV_CODEC_ID_M101,    AV_CODEC_ID_MAGICYUV,    AV_CODEC_ID_SHEERVIDEO,    AV_CODEC_ID_YLC,    /* various PCM "codecs" */    AV_CODEC_ID_FIRST_AUDIO = 0x10000,     ///< A dummy id pointing at the start of audio codecs    AV_CODEC_ID_PCM_S16LE = 0x10000,    AV_CODEC_ID_PCM_S16BE,    AV_CODEC_ID_PCM_U16LE,    AV_CODEC_ID_PCM_U16BE,    AV_CODEC_ID_PCM_S8,    AV_CODEC_ID_PCM_U8,    AV_CODEC_ID_PCM_MULAW,    AV_CODEC_ID_PCM_ALAW,    AV_CODEC_ID_PCM_S32LE,    AV_CODEC_ID_PCM_S32BE,    AV_CODEC_ID_PCM_U32LE,    AV_CODEC_ID_PCM_U32BE,    AV_CODEC_ID_PCM_S24LE,    AV_CODEC_ID_PCM_S24BE,    AV_CODEC_ID_PCM_U24LE,    AV_CODEC_ID_PCM_U24BE,    AV_CODEC_ID_PCM_S24DAUD,    AV_CODEC_ID_PCM_ZORK,    AV_CODEC_ID_PCM_S16LE_PLANAR,    AV_CODEC_ID_PCM_DVD,    AV_CODEC_ID_PCM_F32BE,    AV_CODEC_ID_PCM_F32LE,    AV_CODEC_ID_PCM_F64BE,    AV_CODEC_ID_PCM_F64LE,    AV_CODEC_ID_PCM_BLURAY,    AV_CODEC_ID_PCM_LXF,    AV_CODEC_ID_S302M,    AV_CODEC_ID_PCM_S8_PLANAR,    AV_CODEC_ID_PCM_S24LE_PLANAR,    AV_CODEC_ID_PCM_S32LE_PLANAR,    AV_CODEC_ID_PCM_S16BE_PLANAR,    /* new PCM "codecs" should be added right below this line starting with     * an explicit value of for example 0x10800     */    /* various ADPCM codecs */    AV_CODEC_ID_ADPCM_IMA_QT = 0x11000,    AV_CODEC_ID_ADPCM_IMA_WAV,    AV_CODEC_ID_ADPCM_IMA_DK3,    AV_CODEC_ID_ADPCM_IMA_DK4,    AV_CODEC_ID_ADPCM_IMA_WS,    AV_CODEC_ID_ADPCM_IMA_SMJPEG,    AV_CODEC_ID_ADPCM_MS,    AV_CODEC_ID_ADPCM_4XM,    AV_CODEC_ID_ADPCM_XA,    AV_CODEC_ID_ADPCM_ADX,    AV_CODEC_ID_ADPCM_EA,    AV_CODEC_ID_ADPCM_G726,    AV_CODEC_ID_ADPCM_CT,    AV_CODEC_ID_ADPCM_SWF,    AV_CODEC_ID_ADPCM_YAMAHA,    AV_CODEC_ID_ADPCM_SBPRO_4,    AV_CODEC_ID_ADPCM_SBPRO_3,    AV_CODEC_ID_ADPCM_SBPRO_2,    AV_CODEC_ID_ADPCM_THP,    AV_CODEC_ID_ADPCM_IMA_AMV,    AV_CODEC_ID_ADPCM_EA_R1,    AV_CODEC_ID_ADPCM_EA_R3,    AV_CODEC_ID_ADPCM_EA_R2,    AV_CODEC_ID_ADPCM_IMA_EA_SEAD,    AV_CODEC_ID_ADPCM_IMA_EA_EACS,    AV_CODEC_ID_ADPCM_EA_XAS,    AV_CODEC_ID_ADPCM_EA_MAXIS_XA,    AV_CODEC_ID_ADPCM_IMA_ISS,    AV_CODEC_ID_ADPCM_G722,    AV_CODEC_ID_ADPCM_IMA_APC,    AV_CODEC_ID_ADPCM_VIMA,#if FF_API_VIMA_DECODER    AV_CODEC_ID_VIMA = AV_CODEC_ID_ADPCM_VIMA,#endif    AV_CODEC_ID_ADPCM_AFC = 0x11800,    AV_CODEC_ID_ADPCM_IMA_OKI,    AV_CODEC_ID_ADPCM_DTK,    AV_CODEC_ID_ADPCM_IMA_RAD,    AV_CODEC_ID_ADPCM_G726LE,    AV_CODEC_ID_ADPCM_THP_LE,    AV_CODEC_ID_ADPCM_PSX,    AV_CODEC_ID_ADPCM_AICA,    AV_CODEC_ID_ADPCM_IMA_DAT4,    AV_CODEC_ID_ADPCM_MTAF,    /* AMR */    AV_CODEC_ID_AMR_NB = 0x12000,    AV_CODEC_ID_AMR_WB,    /* RealAudio codecs*/    AV_CODEC_ID_RA_144 = 0x13000,    AV_CODEC_ID_RA_288,    /* various DPCM codecs */    AV_CODEC_ID_ROQ_DPCM = 0x14000,    AV_CODEC_ID_INTERPLAY_DPCM,    AV_CODEC_ID_XAN_DPCM,    AV_CODEC_ID_SOL_DPCM,    AV_CODEC_ID_SDX2_DPCM = 0x14800,    /* audio codecs */    AV_CODEC_ID_MP2 = 0x15000,    AV_CODEC_ID_MP3, ///< preferred ID for decoding MPEG audio layer 1, 2 or 3    AV_CODEC_ID_AAC,    AV_CODEC_ID_AC3,    AV_CODEC_ID_DTS,    AV_CODEC_ID_VORBIS,    AV_CODEC_ID_DVAUDIO,    AV_CODEC_ID_WMAV1,    AV_CODEC_ID_WMAV2,    AV_CODEC_ID_MACE3,    AV_CODEC_ID_MACE6,    AV_CODEC_ID_VMDAUDIO,    AV_CODEC_ID_FLAC,    AV_CODEC_ID_MP3ADU,    AV_CODEC_ID_MP3ON4,    AV_CODEC_ID_SHORTEN,    AV_CODEC_ID_ALAC,    AV_CODEC_ID_WESTWOOD_SND1,    AV_CODEC_ID_GSM, ///< as in Berlin toast format    AV_CODEC_ID_QDM2,    AV_CODEC_ID_COOK,    AV_CODEC_ID_TRUESPEECH,    AV_CODEC_ID_TTA,    AV_CODEC_ID_SMACKAUDIO,    AV_CODEC_ID_QCELP,    AV_CODEC_ID_WAVPACK,    AV_CODEC_ID_DSICINAUDIO,    AV_CODEC_ID_IMC,    AV_CODEC_ID_MUSEPACK7,    AV_CODEC_ID_MLP,    AV_CODEC_ID_GSM_MS, /* as found in WAV */    AV_CODEC_ID_ATRAC3,#if FF_API_VOXWARE    AV_CODEC_ID_VOXWARE,#endif    AV_CODEC_ID_APE,    AV_CODEC_ID_NELLYMOSER,    AV_CODEC_ID_MUSEPACK8,    AV_CODEC_ID_SPEEX,    AV_CODEC_ID_WMAVOICE,    AV_CODEC_ID_WMAPRO,    AV_CODEC_ID_WMALOSSLESS,    AV_CODEC_ID_ATRAC3P,    AV_CODEC_ID_EAC3,    AV_CODEC_ID_SIPR,    AV_CODEC_ID_MP1,    AV_CODEC_ID_TWINVQ,    AV_CODEC_ID_TRUEHD,    AV_CODEC_ID_MP4ALS,    AV_CODEC_ID_ATRAC1,    AV_CODEC_ID_BINKAUDIO_RDFT,    AV_CODEC_ID_BINKAUDIO_DCT,    AV_CODEC_ID_AAC_LATM,    AV_CODEC_ID_QDMC,    AV_CODEC_ID_CELT,    AV_CODEC_ID_G723_1,    AV_CODEC_ID_G729,    AV_CODEC_ID_8SVX_EXP,    AV_CODEC_ID_8SVX_FIB,    AV_CODEC_ID_BMV_AUDIO,    AV_CODEC_ID_RALF,    AV_CODEC_ID_IAC,    AV_CODEC_ID_ILBC,    AV_CODEC_ID_OPUS,    AV_CODEC_ID_COMFORT_NOISE,    AV_CODEC_ID_TAK,    AV_CODEC_ID_METASOUND,    AV_CODEC_ID_PAF_AUDIO,    AV_CODEC_ID_ON2AVC,    AV_CODEC_ID_DSS_SP,    AV_CODEC_ID_FFWAVESYNTH = 0x15800,    AV_CODEC_ID_SONIC,    AV_CODEC_ID_SONIC_LS,    AV_CODEC_ID_EVRC,    AV_CODEC_ID_SMV,    AV_CODEC_ID_DSD_LSBF,    AV_CODEC_ID_DSD_MSBF,    AV_CODEC_ID_DSD_LSBF_PLANAR,    AV_CODEC_ID_DSD_MSBF_PLANAR,    AV_CODEC_ID_4GV,    AV_CODEC_ID_INTERPLAY_ACM,    AV_CODEC_ID_XMA1,    AV_CODEC_ID_XMA2,    AV_CODEC_ID_DST,    /* subtitle codecs */    AV_CODEC_ID_FIRST_SUBTITLE = 0x17000,          ///< A dummy ID pointing at the start of subtitle codecs.    AV_CODEC_ID_DVD_SUBTITLE = 0x17000,    AV_CODEC_ID_DVB_SUBTITLE,    AV_CODEC_ID_TEXT,  ///< raw UTF-8 text    AV_CODEC_ID_XSUB,    AV_CODEC_ID_SSA,    AV_CODEC_ID_MOV_TEXT,    AV_CODEC_ID_HDMV_PGS_SUBTITLE,    AV_CODEC_ID_DVB_TELETEXT,    AV_CODEC_ID_SRT,    AV_CODEC_ID_MICRODVD   = 0x17800,    AV_CODEC_ID_EIA_608,    AV_CODEC_ID_JACOSUB,    AV_CODEC_ID_SAMI,    AV_CODEC_ID_REALTEXT,    AV_CODEC_ID_STL,    AV_CODEC_ID_SUBVIEWER1,    AV_CODEC_ID_SUBVIEWER,    AV_CODEC_ID_SUBRIP,    AV_CODEC_ID_WEBVTT,    AV_CODEC_ID_MPL2,    AV_CODEC_ID_VPLAYER,    AV_CODEC_ID_PJS,    AV_CODEC_ID_ASS,    AV_CODEC_ID_HDMV_TEXT_SUBTITLE,    /* other specific kind of codecs (generally used for attachments) */    AV_CODEC_ID_FIRST_UNKNOWN = 0x18000,           ///< A dummy ID pointing at the start of various fake codecs.    AV_CODEC_ID_TTF = 0x18000,    AV_CODEC_ID_BINTEXT    = 0x18800,    AV_CODEC_ID_XBIN,    AV_CODEC_ID_IDF,    AV_CODEC_ID_OTF,    AV_CODEC_ID_SMPTE_KLV,    AV_CODEC_ID_DVD_NAV,    AV_CODEC_ID_TIMED_ID3,    AV_CODEC_ID_BIN_DATA,    AV_CODEC_ID_PROBE = 0x19000, ///< codec_id is not known (like AV_CODEC_ID_NONE) but lavf should attempt to identify it    AV_CODEC_ID_MPEG2TS = 0x20000, /**< _FAKE_ codec to indicate a raw MPEG-2 TS                                * stream (only used by libavformat) */    AV_CODEC_ID_MPEG4SYSTEMS = 0x20001, /**< _FAKE_ codec to indicate a MPEG-4 Systems                                * stream (only used by libavformat) */    AV_CODEC_ID_FFMETADATA = 0x21000,   ///< Dummy codec for streams containing only metadata information.    AV_CODEC_ID_WRAPPED_AVFRAME = 0x21001, ///< Passthrough codec, AVFrames wrapped in AVPacket};

如我们找一个标准的h.264+aac的解码,h.264解码器在h264.c中的声明如下,注意id(AV_CODEC_ID_H264)对应我们上面AVCodcID中的AV_CODEC_ID_H264。

AVCodec ff_h264_decoder = {    .name                  = "h264",    .long_name             = NULL_IF_CONFIG_SMALL("H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10"),    .type                  = AVMEDIA_TYPE_VIDEO,    .id                    = AV_CODEC_ID_H264,    .priv_data_size        = sizeof(H264Context),    .init                  = ff_h264_decode_init,    .close                 = h264_decode_end,    .decode                = h264_decode_frame,    .capabilities          = /*AV_CODEC_CAP_DRAW_HORIZ_BAND |*/ AV_CODEC_CAP_DR1 |                             AV_CODEC_CAP_DELAY | AV_CODEC_CAP_SLICE_THREADS |                             AV_CODEC_CAP_FRAME_THREADS,    .caps_internal         = FF_CODEC_CAP_INIT_THREADSAFE,    .flush                 = flush_dpb,    .init_thread_copy      = ONLY_IF_THREADS_ENABLED(decode_init_thread_copy),    .update_thread_context = ONLY_IF_THREADS_ENABLED(ff_h264_update_thread_context),    .profiles              = NULL_IF_CONFIG_SMALL(ff_h264_profiles),    .priv_class            = &h264_class,};

aac中解码器声明如下,位于aacdec.c文件中,注意id(AV_CODEC_ID_AAC)与上面上面的AVCodcID中的AV_CODEC_ID_AAC。

AVCodec ff_aac_decoder = {    .name            = "aac",    .long_name       = NULL_IF_CONFIG_SMALL("AAC (Advanced Audio Coding)"),    .type            = AVMEDIA_TYPE_AUDIO,    .id              = AV_CODEC_ID_AAC,    .priv_data_size  = sizeof(AACContext),    .init            = aac_decode_init,    .close           = aac_decode_close,    .decode          = aac_decode_frame,    .sample_fmts     = (const enum AVSampleFormat[]) {        AV_SAMPLE_FMT_FLTP, AV_SAMPLE_FMT_NONE    },    .capabilities    = AV_CODEC_CAP_CHANNEL_CONF | AV_CODEC_CAP_DR1,    .caps_internal   = FF_CODEC_CAP_INIT_THREADSAFE,    .channel_layouts = aac_channel_layout,    .flush = flush,    .priv_class      = &aac_decoder_class,    .profiles        = NULL_IF_CONFIG_SMALL(ff_aac_profiles),};

每一个编解码器对应一个结构体AVCodec

1 0
原创粉丝点击