typedef struct AVOutputFormat {
const char *name;
/**
* 格式人性化描述名稱
* Descriptive name for the format, meant to be more human-readable
* than name. You should use the NULL_IF_CONFIG_SMALL() macro
* to define it.
*/
const char *long_name;
//媒體格式mime類型描述
const char *mime_type;
const char *extensions; /**< comma-separated filename extensions */
/* output support */
//音頻解碼器id
enum AVCodecID audio_codec; /**< default audio codec */
//視頻解碼器id
enum AVCodecID video_codec; /**< default video codec */
//字母編碼器
enum AVCodecID subtitle_codec; /**< default subtitle codec */
/**
* can use flags: AVFMT_NOFILE, AVFMT_NEEDNUMBER,
* AVFMT_GLOBALHEADER, AVFMT_NOTIMESTAMPS, AVFMT_VARIABLE_FPS,
* AVFMT_NODIMENSIONS, AVFMT_NOSTREAMS, AVFMT_ALLOW_FLUSH,
* AVFMT_TS_NONSTRICT, AVFMT_TS_NEGATIVE
*/
int flags;
/**
* 一個支持codec_id-codec_tag匹配的列表,按最佳匹配的先後順序排列,以AV_CODEC_ID_NONE結束。
* List of supported codec_id-codec_tag pairs, ordered by "better
* choice first". The arrays are all terminated by AV_CODEC_ID_NONE.
*/
const struct AVCodecTag * const *codec_tag;
//AVClass 的關聯
const AVClass *priv_class; ///< AVClass for the private context
/*****************************************************************
* No fields below this line are part of the public API. They
* may not be used outside of libavformat and can be changed and
* removed at will.
* New public fields should be added right above.
*
*
* 該行下方的任何字段都不屬於公共API。 它們可能不會在libavformat之外使用,可以隨意更改和刪除。 應該在上面添加新的公共領域。
*****************************************************************
*/
struct AVOutputFormat *next;
/**
* size of private data so that it can be allocated in the wrapper
* 私有數據的大小,以便它可以在包裝器中分配
*/
int priv_data_size;
//寫文件頭信息函數指針
int (*write_header)(struct AVFormatContext *);
/**
* 寫數據包的函數指針
* 如果flags被設置爲AVFMT_ALLOW_FLUSH,pkt可以爲NULL,然後刷新muxer的緩存數據。
* 還有數據需要傳入時返回值爲0,數據傳送完成時返回1;
* Write a packet. If AVFMT_ALLOW_FLUSH is set in flags,
* pkt can be NULL in order to flush data buffered in the muxer.
* When flushing, return 0 if there still is more data to flush,
* or 1 if everything was flushed and there is no more buffered
* data.
*/
int (*write_packet)(struct AVFormatContext *, AVPacket *pkt);
int (*write_trailer)(struct AVFormatContext *);
/**
* 目前只用於設置像素格式
* Currently only used to set pixel format if not YUV420P.
*/
int (*interleave_packet)(struct AVFormatContext *, AVPacket *out,
AVPacket *in, int flush);
/**
* 檢查指定編碼器是否處在該容器中
* Test if the given codec can be stored in this container.
*
* @return 1 if the codec is supported, 0 if it is not.
* A negative number if unknown.返回1時找到,沒找到返回0,否者返回負數
* MKTAG('A', 'P', 'I', 'C') if the codec is only supported as AV_DISPOSITION_ATTACHED_PIC
*/
int (*query_codec)(enum AVCodecID id, int std_compliance);
//獲取輸出時間戳
void (*get_output_timestamp)(struct AVFormatContext *s, int stream,
int64_t *dts, int64_t *wall);
/**
* 允許程序向設備發送消息
* Allows sending messages from application to device.
*/
int (*control_message)(struct AVFormatContext *s, int type,
void *data, size_t data_size);
/**
* 寫入一個未解析的AVFrame
* Write an uncoded AVFrame.
* 詳情參考av_write_uncoded_frame()
* See av_write_uncoded_frame() for details.
* 後面需要釋放*frame,但是muxer可以阻止指針被設置NULL
* The library will free *frame afterwards, but the muxer can prevent it
* by setting the pointer to NULL.
*/
int (*write_uncoded_frame)(struct AVFormatContext *, int stream_index,
AVFrame **frame, unsigned flags);
/**
* 返回設備參數信息
* Returns device list with it properties.
* @see avdevice_list_devices() for more details.
*/
int (*get_device_list)(struct AVFormatContext *s, struct AVDeviceInfoList *device_list);
/**
* 初始化設備功能子模塊
* Initialize device capabilities submodule.
* @see avdevice_capabilities_create() for more details.
*/
int (*create_device_capabilities)(struct AVFormatContext *s, struct AVDeviceCapabilitiesQuery *caps);
/**
* 釋放設備功能子模塊
* Free device capabilities submodule.
* @see avdevice_capabilities_free() for more details.
*/
int (*free_device_capabilities)(struct AVFormatContext *s, struct AVDeviceCapabilitiesQuery *caps);
//數據解碼器id
enum AVCodecID data_codec; /**< default data codec */
/**
* 初始化,在這裏可能分配數據大小、並在發送數據包之前設置AVFormatContext或者AVStream的參數,該函數不能寫輸入
* Initialize format. May allocate data here, and set any AVFormatContext or
* AVStream parameters that need to be set before packets are sent.
* This method must not write output.
*
* Return 0 if streams were fully configured, 1 if not, negative AVERROR on failure
* 配置成功返回0,失敗返回1,出錯返回值爲負數
* 任何在該函數中分配的操作,在deinit調用時必須釋放
* Any allocations made here must be freed in deinit().
*/
int (*init)(struct AVFormatContext *);
/**
* 銷燬format。
* Deinitialize format. If present, this is called whenever the muxer is being
* destroyed, regardless of whether or not the header has been written.
* 如果正在操作預告寫入,那麼在write_trailer()調用完成後調用
* If a trailer is being written, this is called after write_trailer().
*
* init()操作失敗時也會調用
* This is called if init() fails as well.
*/
void (*deinit)(struct AVFormatContext *);
/**
* 設置必要的比特流過濾,並提取文件頭的附加數據。
* 如果需要檢查來自此流的更多數據包,則返回0; 否則返回1
* Set up any necessary bitstream filtering and extract any extra data needed
* for the global header.
* Return 0 if more packets from this stream must be checked; 1 if not.
*/
int (*check_bitstream)(struct AVFormatContext *, const AVPacket *pkt);
} AVOutputFormat;