
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,返回-1const int *supported_samplerates; //支持的采样率,如果是null或unknown,返回0const enum AVSampleFormat *sample_fmts; //支持的采样率,如果是null,返回-1const uint64_t *channel_layouts; //支持的声道数, 如果是null,返回0uint8_t max_lowres; //解码器支持的最大lowresconst 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 4int 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 0x1000int64_t offset; ///< byte offset from starting packet startint64_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_deprecatedint64_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_XVMCAV_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_ILBMAV_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_HEVCAV_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 codecsAV_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_DECODERAV_CODEC_ID_VIMA = AV_CODEC_ID_ADPCM_VIMA,#endifAV_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 3AV_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 formatAV_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_VOXWAREAV_CODEC_ID_VOXWARE,#endifAV_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 textAV_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 itAV_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

