ffmpeg 关键数据结构

ffmpeg 关键数据结构

AVFormatContext

libavformat/avformat.h

/**
 * Format I/O context.
 * New fields can be added to the end with minor version bumps.
 * Removal, reordering and changes to existing fields require a major
 * version bump.
 * sizeof(AVFormatContext) must not be used outside libav*, use
 * avformat_alloc_context() to create an AVFormatContext.
 *
 * Fields can be accessed through AVOptions (av_opt*),
 * the name string used matches the associated command line parameter name and
 * can be found in libavformat/options_table.h.
 * The AVOption/command line parameter names differ in some cases from the C
 * structure field names for historic reasons or brevity.
 */
typedef struct AVFormatContext {
    /**
     * A class for logging and @ref avoptions. Set by avformat_alloc_context().
     * Exports (de)muxer private options if they exist.
     */
    const AVClass *av_class;

    /**
     * The input container format.
     *
     * Demuxing only, set by avformat_open_input().
     */
    ff_const59 struct AVInputFormat *iformat;

    /**
     * The output container format.
     *
     * Muxing only, must be set by the caller before avformat_write_header().
     */
    ff_const59 struct AVOutputFormat *oformat;

    /**
     * Format private data. This is an AVOptions-enabled struct
     * if and only if iformat/oformat.priv_class is not NULL.
     *
     * - muxing: set by avformat_write_header()
     * - demuxing: set by avformat_open_input()
     */
    void *priv_data;

    /**
     * I/O context.
     *
     * - demuxing: either set by the user before avformat_open_input() (then
     *             the user must close it manually) or set by avformat_open_input().
     * - muxing: set by the user before avformat_write_header(). The caller must
     *           take care of closing / freeing the IO context.
     *
     * Do NOT set this field if AVFMT_NOFILE flag is set in
     * iformat/oformat.flags. In such a case, the (de)muxer will handle
     * I/O in some other way and this field will be NULL.
     */
    AVIOContext *pb;

    /* stream info */
    /**
     * Flags signalling stream properties. A combination of AVFMTCTX_*.
     * Set by libavformat.
     */
    int ctx_flags;

    /**
     * Number of elements in AVFormatContext.streams.
     *
     * Set by avformat_new_stream(), must not be modified by any other code.
     */
    unsigned int nb_streams;
    /**
     * A list of all streams in the file. New streams are created with
     * avformat_new_stream().
     *
     * - demuxing: streams are created by libavformat in avformat_open_input().
     *             If AVFMTCTX_NOHEADER is set in ctx_flags, then new streams may also
     *             appear in av_read_frame().
     * - muxing: streams are created by the user before avformat_write_header().
     *
     * Freed by libavformat in avformat_free_context().
     */
    AVStream **streams;

#if FF_API_FORMAT_FILENAME
    /**
     * input or output filename
     *
     * - demuxing: set by avformat_open_input()
     * - muxing: may be set by the caller before avformat_write_header()
     *
     * @deprecated Use url instead.
     */
    attribute_deprecated
    char filename[1024];
#endif

    /**
     * input or output URL. Unlike the old filename field, this field has no
     * length restriction.
     *
     * - demuxing: set by avformat_open_input(), initialized to an empty
     *             string if url parameter was NULL in avformat_open_input().
     * - muxing: may be set by the caller before calling avformat_write_header()
     *           (or avformat_init_output() if that is called first) to a string
     *           which is freeable by av_free(). Set to an empty string if it
     *           was NULL in avformat_init_output().
     *
     * Freed by libavformat in avformat_free_context().
     */
    char *url;

    /**
     * Position of the first frame of the component, in
     * AV_TIME_BASE fractional seconds. NEVER set this value directly:
     * It is deduced from the AVStream values.
     *
     * Demuxing only, set by libavformat.
     */
    int64_t start_time;

    /**
     * Duration of the stream, in AV_TIME_BASE fractional
     * seconds. Only set this value if you know none of the individual stream
     * durations and also do not set any of them. This is deduced from the
     * AVStream values if not set.
     *
     * Demuxing only, set by libavformat.
     */
    int64_t duration;

    /**
     * Total stream bitrate in bit/s, 0 if not
     * available. Never set it directly if the file_size and the
     * duration are known as FFmpeg can compute it automatically.
     */
    int64_t bit_rate;

    unsigned int packet_size;
    int max_delay;

    /**
     * Flags modifying the (de)muxer behaviour. A combination of AVFMT_FLAG_*.
     * Set by the user before avformat_open_input() / avformat_write_header().
     */
    int flags;
#define AVFMT_FLAG_GENPTS       0x0001 ///< Generate missing pts even if it requires parsing future frames.
#define AVFMT_FLAG_IGNIDX       0x0002 ///< Ignore index.
#define AVFMT_FLAG_NONBLOCK     0x0004 ///< Do not block when reading packets from input.
#define AVFMT_FLAG_IGNDTS       0x0008 ///< Ignore DTS on frames that contain both DTS & PTS
#define AVFMT_FLAG_NOFILLIN     0x0010 ///< Do not infer any values from other values, just return what is stored in the container
#define AVFMT_FLAG_NOPARSE      0x0020 ///< Do not use AVParsers, you also must set AVFMT_FLAG_NOFILLIN as the fillin code works on frames and no parsing -> no frames. Also seeking to frames can not work if parsing to find frame boundaries has been disabled
#define AVFMT_FLAG_NOBUFFER     0x0040 ///< Do not buffer frames when possible
#define AVFMT_FLAG_CUSTOM_IO    0x0080 ///< The caller has supplied a custom AVIOContext, don't avio_close() it.
#define AVFMT_FLAG_DISCARD_CORRUPT  0x0100 ///< Discard frames marked corrupted
#define AVFMT_FLAG_FLUSH_PACKETS    0x0200 ///< Flush the AVIOContext every packet.
/**
 * When muxing, try to avoid writing any random/volatile data to the output.
 * This includes any random IDs, real-time timestamps/dates, muxer version, etc.
 *
 * This flag is mainly intended for testing.
 */
#define AVFMT_FLAG_BITEXACT         0x0400
#if FF_API_LAVF_MP4A_LATM
#define AVFMT_FLAG_MP4A_LATM    0x8000 ///< Deprecated, does nothing.
#endif
#define AVFMT_FLAG_SORT_DTS    0x10000 ///< try to interleave outputted packets by dts (using this flag can slow demuxing down)
#define AVFMT_FLAG_PRIV_OPT    0x20000 ///< Enable use of private options by delaying codec open (this could be made default once all code is converted)
#if FF_API_LAVF_KEEPSIDE_FLAG
#define AVFMT_FLAG_KEEP_SIDE_DATA 0x40000 ///< Deprecated, does nothing.
#endif
#define AVFMT_FLAG_FAST_SEEK   0x80000 ///< Enable fast, but inaccurate seeks for some formats
#define AVFMT_FLAG_SHORTEST   0x100000 ///< Stop muxing when the shortest stream stops.
#define AVFMT_FLAG_AUTO_BSF   0x200000 ///< Add bitstream filters as requested by the muxer

    /**
     * Maximum size of the data read from input for determining
     * the input container format.
     * Demuxing only, set by the caller before avformat_open_input().
     */
    int64_t probesize;

    /**
     * Maximum duration (in AV_TIME_BASE units) of the data read
     * from input in avformat_find_stream_info().
     * Demuxing only, set by the caller before avformat_find_stream_info().
     * Can be set to 0 to let avformat choose using a heuristic.
     */
    int64_t max_analyze_duration;

    const uint8_t *key;
    int keylen;

    unsigned int nb_programs;
    AVProgram **programs;

    /**
     * Forced video codec_id.
     * Demuxing: Set by user.
     */
    enum AVCodecID video_codec_id;

    /**
     * Forced audio codec_id.
     * Demuxing: Set by user.
     */
    enum AVCodecID audio_codec_id;

    /**
     * Forced subtitle codec_id.
     * Demuxing: Set by user.
     */
    enum AVCodecID subtitle_codec_id;

    /**
     * Maximum amount of memory in bytes to use for the index of each stream.
     * If the index exceeds this size, entries will be discarded as
     * needed to maintain a smaller size. This can lead to slower or less
     * accurate seeking (depends on demuxer).
     * Demuxers for which a full in-memory index is mandatory will ignore
     * this.
     * - muxing: unused
     * - demuxing: set by user
     */
    unsigned int max_index_size;

    /**
     * Maximum amount of memory in bytes to use for buffering frames
     * obtained from realtime capture devices.
     */
    unsigned int max_picture_buffer;

    /**
     * Number of chapters in AVChapter array.
     * When muxing, chapters are normally written in the file header,
     * so nb_chapters should normally be initialized before write_header
     * is called. Some muxers (e.g. mov and mkv) can also write chapters
     * in the trailer.  To write chapters in the trailer, nb_chapters
     * must be zero when write_header is called and non-zero when
     * write_trailer is called.
     * - muxing: set by user
     * - demuxing: set by libavformat
     */
    unsigned int nb_chapters;
    AVChapter **chapters;

    /**
     * Metadata that applies to the whole file.
     *
     * - demuxing: set by libavformat in avformat_open_input()
     * - muxing: may be set by the caller before avformat_write_header()
     *
     * Freed by libavformat in avformat_free_context().
     */
    AVDictionary *metadata;

    /**
     * Start time of the stream in real world time, in microseconds
     * since the Unix epoch (00:00 1st January 1970). That is, pts=0 in the
     * stream was captured at this real world time.
     * - muxing: Set by the caller before avformat_write_header(). If set to
     *           either 0 or AV_NOPTS_VALUE, then the current wall-time will
     *           be used.
     * - demuxing: Set by libavformat. AV_NOPTS_VALUE if unknown. Note that
     *             the value may become known after some number of frames
     *             have been received.
     */
    int64_t start_time_realtime;

    /**
     * The number of frames used for determining the framerate in
     * avformat_find_stream_info().
     * Demuxing only, set by the caller before avformat_find_stream_info().
     */
    int fps_probe_size;

    /**
     * Error recognition; higher values will detect more errors but may
     * misdetect some more or less valid parts as errors.
     * Demuxing only, set by the caller before avformat_open_input().
     */
    int error_recognition;

    /**
     * Custom interrupt callbacks for the I/O layer.
     *
     * demuxing: set by the user before avformat_open_input().
     * muxing: set by the user before avformat_write_header()
     * (mainly useful for AVFMT_NOFILE formats). The callback
     * should also be passed to avio_open2() if it's used to
     * open the file.
     */
    AVIOInterruptCB interrupt_callback;

    /**
     * Flags to enable debugging.
     */
    int debug;
#define FF_FDEBUG_TS        0x0001

    /**
     * Maximum buffering duration for interleaving.
     *
     * To ensure all the streams are interleaved correctly,
     * av_interleaved_write_frame() will wait until it has at least one packet
     * for each stream before actually writing any packets to the output file.
     * When some streams are "sparse" (i.e. there are large gaps between
     * successive packets), this can result in excessive buffering.
     *
     * This field specifies the maximum difference between the timestamps of the
     * first and the last packet in the muxing queue, above which libavformat
     * will output a packet regardless of whether it has queued a packet for all
     * the streams.
     *
     * Muxing only, set by the caller before avformat_write_header().
     */
    int64_t max_interleave_delta;

    /**
     * Allow non-standard and experimental extension
     * @see AVCodecContext.strict_std_compliance
     */
    int strict_std_compliance;

    /**
     * Flags for the user to detect events happening on the file. Flags must
     * be cleared by the user once the event has been handled.
     * A combination of AVFMT_EVENT_FLAG_*.
     */
    int event_flags;
#define AVFMT_EVENT_FLAG_METADATA_UPDATED 0x0001 ///< The call resulted in updated metadata.

    /**
     * Maximum number of packets to read while waiting for the first timestamp.
     * Decoding only.
     */
    int max_ts_probe;

    /**
     * Avoid negative timestamps during muxing.
     * Any value of the AVFMT_AVOID_NEG_TS_* constants.
     * Note, this only works when using av_interleaved_write_frame. (interleave_packet_per_dts is in use)
     * - muxing: Set by user
     * - demuxing: unused
     */
    int avoid_negative_ts;
#define AVFMT_AVOID_NEG_TS_AUTO             -1 ///< Enabled when required by target format
#define AVFMT_AVOID_NEG_TS_MAKE_NON_NEGATIVE 1 ///< Shift timestamps so they are non negative
#define AVFMT_AVOID_NEG_TS_MAKE_ZERO         2 ///< Shift timestamps so that they start at 0

    /**
     * Transport stream id.
     * This will be moved into demuxer private options. Thus no API/ABI compatibility
     */
    int ts_id;

    /**
     * Audio preload in microseconds.
     * Note, not all formats support this and unpredictable things may happen if it is used when not supported.
     * - encoding: Set by user
     * - decoding: unused
     */
    int audio_preload;

    /**
     * Max chunk time in microseconds.
     * Note, not all formats support this and unpredictable things may happen if it is used when not supported.
     * - encoding: Set by user
     * - decoding: unused
     */
    int max_chunk_duration;

    /**
     * Max chunk size in bytes
     * Note, not all formats support this and unpredictable things may happen if it is used when not supported.
     * - encoding: Set by user
     * - decoding: unused
     */
    int max_chunk_size;

    /**
     * forces the use of wallclock timestamps as pts/dts of packets
     * This has undefined results in the presence of B frames.
     * - encoding: unused
     * - decoding: Set by user
     */
    int use_wallclock_as_timestamps;

    /**
     * avio flags, used to force AVIO_FLAG_DIRECT.
     * - encoding: unused
     * - decoding: Set by user
     */
    int avio_flags;

    /**
     * The duration field can be estimated through various ways, and this field can be used
     * to know how the duration was estimated.
     * - encoding: unused
     * - decoding: Read by user
     */
    enum AVDurationEstimationMethod duration_estimation_method;

    /**
     * Skip initial bytes when opening stream
     * - encoding: unused
     * - decoding: Set by user
     */
    int64_t skip_initial_bytes;

    /**
     * Correct single timestamp overflows
     * - encoding: unused
     * - decoding: Set by user
     */
    unsigned int correct_ts_overflow;

    /**
     * Force seeking to any (also non key) frames.
     * - encoding: unused
     * - decoding: Set by user
     */
    int seek2any;

    /**
     * Flush the I/O context after each packet.
     * - encoding: Set by user
     * - decoding: unused
     */
    int flush_packets;

    /**
     * format probing score.
     * The maximal score is AVPROBE_SCORE_MAX, its set when the demuxer probes
     * the format.
     * - encoding: unused
     * - decoding: set by avformat, read by user
     */
    int probe_score;

    /**
     * number of bytes to read maximally to identify format.
     * - encoding: unused
     * - decoding: set by user
     */
    int format_probesize;

    /**
     * ',' separated list of allowed decoders.
     * If NULL then all are allowed
     * - encoding: unused
     * - decoding: set by user
     */
    char *codec_whitelist;

    /**
     * ',' separated list of allowed demuxers.
     * If NULL then all are allowed
     * - encoding: unused
     * - decoding: set by user
     */
    char *format_whitelist;

    /**
     * An opaque field for libavformat internal usage.
     * Must not be accessed in any way by callers.
     */
    AVFormatInternal *internal;

    /**
     * IO repositioned flag.
     * This is set by avformat when the underlaying IO context read pointer
     * is repositioned, for example when doing byte based seeking.
     * Demuxers can use the flag to detect such changes.
     */
    int io_repositioned;

    /**
     * Forced video codec.
     * This allows forcing a specific decoder, even when there are multiple with
     * the same codec_id.
     * Demuxing: Set by user
     */
    AVCodec *video_codec;

    /**
     * Forced audio codec.
     * This allows forcing a specific decoder, even when there are multiple with
     * the same codec_id.
     * Demuxing: Set by user
     */
    AVCodec *audio_codec;

    /**
     * Forced subtitle codec.
     * This allows forcing a specific decoder, even when there are multiple with
     * the same codec_id.
     * Demuxing: Set by user
     */
    AVCodec *subtitle_codec;

    /**
     * Forced data codec.
     * This allows forcing a specific decoder, even when there are multiple with
     * the same codec_id.
     * Demuxing: Set by user
     */
    AVCodec *data_codec;

    /**
     * Number of bytes to be written as padding in a metadata header.
     * Demuxing: Unused.
     * Muxing: Set by user via av_format_set_metadata_header_padding.
     */
    int metadata_header_padding;

    /**
     * User data.
     * This is a place for some private data of the user.
     */
    void *opaque;

    /**
     * Callback used by devices to communicate with application.
     */
    av_format_control_message control_message_cb;

    /**
     * Output timestamp offset, in microseconds.
     * Muxing: set by user
     */
    int64_t output_ts_offset;

    /**
     * dump format separator.
     * can be ", " or "\n      " or anything else
     * - muxing: Set by user.
     * - demuxing: Set by user.
     */
    uint8_t *dump_separator;

    /**
     * Forced Data codec_id.
     * Demuxing: Set by user.
     */
    enum AVCodecID data_codec_id;

#if FF_API_OLD_OPEN_CALLBACKS
    /**
     * Called to open further IO contexts when needed for demuxing.
     *
     * This can be set by the user application to perform security checks on
     * the URLs before opening them.
     * The function should behave like avio_open2(), AVFormatContext is provided
     * as contextual information and to reach AVFormatContext.opaque.
     *
     * If NULL then some simple checks are used together with avio_open2().
     *
     * Must not be accessed directly from outside avformat.
     * @See av_format_set_open_cb()
     *
     * Demuxing: Set by user.
     *
     * @deprecated Use io_open and io_close.
     */
    attribute_deprecated
    int (*open_cb)(struct AVFormatContext *s, AVIOContext **p, const char *url, int flags, const AVIOInterruptCB *int_cb, AVDictionary **options);
#endif

    /**
     * ',' separated list of allowed protocols.
     * - encoding: unused
     * - decoding: set by user
     */
    char *protocol_whitelist;

    /**
     * A callback for opening new IO streams.
     *
     * Whenever a muxer or a demuxer needs to open an IO stream (typically from
     * avformat_open_input() for demuxers, but for certain formats can happen at
     * other times as well), it will call this callback to obtain an IO context.
     *
     * @param s the format context
     * @param pb on success, the newly opened IO context should be returned here
     * @param url the url to open
     * @param flags a combination of AVIO_FLAG_*
     * @param options a dictionary of additional options, with the same
     *                semantics as in avio_open2()
     * @return 0 on success, a negative AVERROR code on failure
     *
     * @note Certain muxers and demuxers do nesting, i.e. they open one or more
     * additional internal format contexts. Thus the AVFormatContext pointer
     * passed to this callback may be different from the one facing the caller.
     * It will, however, have the same 'opaque' field.
     */
    int (*io_open)(struct AVFormatContext *s, AVIOContext **pb, const char *url,
                   int flags, AVDictionary **options);

    /**
     * A callback for closing the streams opened with AVFormatContext.io_open().
     */
    void (*io_close)(struct AVFormatContext *s, AVIOContext *pb);

    /**
     * ',' separated list of disallowed protocols.
     * - encoding: unused
     * - decoding: set by user
     */
    char *protocol_blacklist;

    /**
     * The maximum number of streams.
     * - encoding: unused
     * - decoding: set by user
     */
    int max_streams;

    /**
     * Skip duration calcuation in estimate_timings_from_pts.
     * - encoding: unused
     * - decoding: set by user
     */
    int skip_estimate_duration_from_pts;
} AVFormatContext;

AVDictionary

libavutil/dict.h

struct AVDictionary {
    int count;
    AVDictionaryEntry *elems;
};
typedef struct AVDictionaryEntry {
    char *key;
    char *value;
} AVDictionaryEntry;

AVDictionary 的elems指针指向AVDictionaryEntry的数组,count是数组中元素的数量。每一个entry是一个key value对。

#include <stdint.h>
#include <libavutil/log.h>
#include <libavutil/dict.h>

int main(int argc, char *argv[])
{
    AVDictionary *d = NULL;
    AVDictionaryEntry *entry = NULL;
    char *key = "hello";
    int64_t value = 1000;

    av_log_set_level(AV_LOG_DEBUG);
    av_dict_set_int(&d, key, value, 0);
    av_dict_set(&d, "good", "night", 0);

    while (entry = av_dict_get(d, "", entry, AV_DICT_IGNORE_SUFFIX)) {
        av_log(NULL, AV_LOG_INFO, "key: %s, value: %s\n",
                    entry->key, entry->value);
    }

    av_dict_free(&d);
    return 0;
}

AVCodecContext

/**
 * main external API structure.
 * New fields can be added to the end with minor version bumps.
 * Removal, reordering and changes to existing fields require a major
 * version bump.
 * You can use AVOptions (av_opt* / av_set/get*()) to access these fields from user
 * applications.
 * The name string for AVOptions options matches the associated command line
 * parameter name and can be found in libavcodec/options_table.h
 * The AVOption/command line parameter names differ in some cases from the C
 * structure field names for historic reasons or brevity.
 * sizeof(AVCodecContext) must not be used outside libav*.
 */
typedef struct AVCodecContext {
    /**
     * information on struct for av_log
     * - set by avcodec_alloc_context3
     */
    const AVClass *av_class;
    int log_level_offset;

    enum AVMediaType codec_type; /* see AVMEDIA_TYPE_xxx */
    const struct AVCodec  *codec;
    enum AVCodecID     codec_id; /* see AV_CODEC_ID_xxx */

    /**
     * fourcc (LSB first, so "ABCD" -> ('D'<<24) + ('C'<<16) + ('B'<<8) + 'A').
     * This is used to work around some encoder bugs.
     * A demuxer should set this to what is stored in the field used to identify the codec.
     * If there are multiple such fields in a container then the demuxer should choose the one
     * which maximizes the information about the used codec.
     * If the codec tag field in a container is larger than 32 bits then the demuxer should
     * remap the longer ID to 32 bits with a table or other structure. Alternatively a new
     * extra_codec_tag + size could be added but for this a clear advantage must be demonstrated
     * first.
     * - encoding: Set by user, if not then the default based on codec_id will be used.
     * - decoding: Set by user, will be converted to uppercase by libavcodec during init.
     */
    unsigned int codec_tag;

    void *priv_data;

    /**
     * Private context used for internal data.
     *
     * Unlike priv_data, this is not codec-specific. It is used in general
     * libavcodec functions.
     */
    struct AVCodecInternal *internal;

    /**
     * Private data of the user, can be used to carry app specific stuff.
     * - encoding: Set by user.
     * - decoding: Set by user.
     */
    void *opaque;

    /**
     * the average bitrate
     * - encoding: Set by user; unused for constant quantizer encoding.
     * - decoding: Set by user, may be overwritten by libavcodec
     *             if this info is available in the stream
     */
    int64_t bit_rate;

    /**
     * number of bits the bitstream is allowed to diverge from the reference.
     *           the reference can be CBR (for CBR pass1) or VBR (for pass2)
     * - encoding: Set by user; unused for constant quantizer encoding.
     * - decoding: unused
     */
    int bit_rate_tolerance;

    /**
     * Global quality for codecs which cannot change it per frame.
     * This should be proportional to MPEG-1/2/4 qscale.
     * - encoding: Set by user.
     * - decoding: unused
     */
    int global_quality;

    /**
     * - encoding: Set by user.
     * - decoding: unused
     */
    int compression_level;
#define FF_COMPRESSION_DEFAULT -1

    /**
     * AV_CODEC_FLAG_*.
     * - encoding: Set by user.
     * - decoding: Set by user.
     */
    int flags;

    /**
     * AV_CODEC_FLAG2_*
     * - encoding: Set by user.
     * - decoding: Set by user.
     */
    int flags2;

    /**
     * some codecs need / can use extradata like Huffman tables.
     * MJPEG: Huffman tables
     * rv10: additional flags
     * MPEG-4: global headers (they can be in the bitstream or here)
     * The allocated memory should be AV_INPUT_BUFFER_PADDING_SIZE bytes larger
     * than extradata_size to avoid problems if it is read with the bitstream reader.
     * The bytewise contents of extradata must not depend on the architecture or CPU endianness.
     * Must be allocated with the av_malloc() family of functions.
     * - encoding: Set/allocated/freed by libavcodec.
     * - decoding: Set/allocated/freed by user.
     */
    uint8_t *extradata;
    int extradata_size;

    /**
     * This is the fundamental unit of time (in seconds) in terms
     * of which frame timestamps are represented. For fixed-fps content,
     * timebase should be 1/framerate and timestamp increments should be
     * identically 1.
     * This often, but not always is the inverse of the frame rate or field rate
     * for video. 1/time_base is not the average frame rate if the frame rate is not
     * constant.
     *
     * Like containers, elementary streams also can store timestamps, 1/time_base
     * is the unit in which these timestamps are specified.
     * As example of such codec time base see ISO/IEC 14496-2:2001(E)
     * vop_time_increment_resolution and fixed_vop_rate
     * (fixed_vop_rate == 0 implies that it is different from the framerate)
     *
     * - encoding: MUST be set by user.
     * - decoding: the use of this field for decoding is deprecated.
     *             Use framerate instead.
     */
    AVRational time_base;

    /**
     * For some codecs, the time base is closer to the field rate than the frame rate.
     * Most notably, H.264 and MPEG-2 specify time_base as half of frame duration
     * if no telecine is used ...
     *
     * Set to time_base ticks per frame. Default 1, e.g., H.264/MPEG-2 set it to 2.
     */
    int ticks_per_frame;

    /**
     * Codec delay.
     *
     * Encoding: Number of frames delay there will be from the encoder input to
     *           the decoder output. (we assume the decoder matches the spec)
     * Decoding: Number of frames delay in addition to what a standard decoder
     *           as specified in the spec would produce.
     *
     * Video:
     *   Number of frames the decoded output will be delayed relative to the
     *   encoded input.
     *
     * Audio:
     *   For encoding, this field is unused (see initial_padding).
     *
     *   For decoding, this is the number of samples the decoder needs to
     *   output before the decoder's output is valid. When seeking, you should
     *   start decoding this many samples prior to your desired seek point.
     *
     * - encoding: Set by libavcodec.
     * - decoding: Set by libavcodec.
     */
    int delay;


    /* video only */
    /**
     * picture width / height.
     *
     * @note Those fields may not match the values of the last
     * AVFrame output by avcodec_decode_video2 due frame
     * reordering.
     *
     * - encoding: MUST be set by user.
     * - decoding: May be set by the user before opening the decoder if known e.g.
     *             from the container. Some decoders will require the dimensions
     *             to be set by the caller. During decoding, the decoder may
     *             overwrite those values as required while parsing the data.
     */
   
    int width, height;

    /**
     * Bitstream width / height, may be different from width/height e.g. when
     * the decoded frame is cropped before being output or lowres is enabled.
     *
     * @note Those field may not match the value of the last
     * AVFrame output by avcodec_receive_frame() due frame
     * reordering.
     *
     * - encoding: unused
     * - decoding: May be set by the user before opening the decoder if known
     *             e.g. from the container. During decoding, the decoder may
     *             overwrite those values as required while parsing the data.
     */
    int coded_width, coded_height;

    /**
     * the number of pictures in a group of pictures, or 0 for intra_only
     * - encoding: Set by user.
     * - decoding: unused
     */
    int gop_size;

    /**
     * Pixel format, see AV_PIX_FMT_xxx.
     * May be set by the demuxer if known from headers.
     * May be overridden by the decoder if it knows better.
     *
     * @note This field may not match the value of the last
     * AVFrame output by avcodec_receive_frame() due frame
     * reordering.
     *
     * - encoding: Set by user.
     * - decoding: Set by user if known, overridden by libavcodec while
     *             parsing the data.
     */
    enum AVPixelFormat pix_fmt;

    /**
     * If non NULL, 'draw_horiz_band' is called by the libavcodec
     * decoder to draw a horizontal band. It improves cache usage. Not
     * all codecs can do that. You must check the codec capabilities
     * beforehand.
     * When multithreading is used, it may be called from multiple threads
     * at the same time; threads might draw different parts of the same AVFrame,
     * or multiple AVFrames, and there is no guarantee that slices will be drawn
     * in order.
     * The function is also used by hardware acceleration APIs.
     * It is called at least once during frame decoding to pass
     * the data needed for hardware render.
     * In that mode instead of pixel data, AVFrame points to
     * a structure specific to the acceleration API. The application
     * reads the structure and can change some fields to indicate progress
     * or mark state.
     * - encoding: unused
     * - decoding: Set by user.
     * @param height the height of the slice
     * @param y the y position of the slice
     * @param type 1->top field, 2->bottom field, 3->frame
     * @param offset offset into the AVFrame.data from which the slice should be read
     */
    void (*draw_horiz_band)(struct AVCodecContext *s,
                            const AVFrame *src, int offset[AV_NUM_DATA_POINTERS],
                            int y, int type, int height);

    /**
     * callback to negotiate the pixelFormat
     * @param fmt is the list of formats which are supported by the codec,
     * it is terminated by -1 as 0 is a valid format, the formats are ordered by quality.
     * The first is always the native one.
     * @note The callback may be called again immediately if initialization for
     * the selected (hardware-accelerated) pixel format failed.
     * @warning Behavior is undefined if the callback returns a value not
     * in the fmt list of formats.
     * @return the chosen format
     * - encoding: unused
     * - decoding: Set by user, if not set the native format will be chosen.
     */
    enum AVPixelFormat (*get_format)(struct AVCodecContext *s, const enum AVPixelFormat * fmt);

    /**
     * maximum number of B-frames between non-B-frames
     * Note: The output will be delayed by max_b_frames+1 relative to the input.
     * - encoding: Set by user.
     * - decoding: unused
     */
    int max_b_frames;

    /**
     * qscale factor between IP and B-frames
     * If > 0 then the last P-frame quantizer will be used (q= lastp_q*factor+offset).
     * If < 0 then normal ratecontrol will be done (q= -normal_q*factor+offset).
     * - encoding: Set by user.
     * - decoding: unused
     */
    float b_quant_factor;

#if FF_API_PRIVATE_OPT
    /** @deprecated use encoder private options instead */
    attribute_deprecated
    int b_frame_strategy;
#endif

    /**
     * qscale offset between IP and B-frames
     * - encoding: Set by user.
     * - decoding: unused
     */
    float b_quant_offset;

    /**
     * Size of the frame reordering buffer in the decoder.
     * For MPEG-2 it is 1 IPB or 0 low delay IP.
     * - encoding: Set by libavcodec.
     * - decoding: Set by libavcodec.
     */
    int has_b_frames;

#if FF_API_PRIVATE_OPT
    /** @deprecated use encoder private options instead */
    attribute_deprecated
    int mpeg_quant;
#endif

    /**
     * qscale factor between P- and I-frames
     * If > 0 then the last P-frame quantizer will be used (q = lastp_q * factor + offset).
     * If < 0 then normal ratecontrol will be done (q= -normal_q*factor+offset).
     * - encoding: Set by user.
     * - decoding: unused
     */
    float i_quant_factor;

    /**
     * qscale offset between P and I-frames
     * - encoding: Set by user.
     * - decoding: unused
     */
    float i_quant_offset;

    /**
     * luminance masking (0-> disabled)
     * - encoding: Set by user.
     * - decoding: unused
     */
    float lumi_masking;

    /**
     * temporary complexity masking (0-> disabled)
     * - encoding: Set by user.
     * - decoding: unused
     */
    float temporal_cplx_masking;

    /**
     * spatial complexity masking (0-> disabled)
     * - encoding: Set by user.
     * - decoding: unused
     */
    float spatial_cplx_masking;

    /**
     * p block masking (0-> disabled)
     * - encoding: Set by user.
     * - decoding: unused
     */
    float p_masking;

    /**
     * darkness masking (0-> disabled)
     * - encoding: Set by user.
     * - decoding: unused
     */
    float dark_masking;

    /**
     * slice count
     * - encoding: Set by libavcodec.
     * - decoding: Set by user (or 0).
     */
    int slice_count;

#if FF_API_PRIVATE_OPT
    /** @deprecated use encoder private options instead */
    attribute_deprecated
     int prediction_method;
#define FF_PRED_LEFT   0
#define FF_PRED_PLANE  1
#define FF_PRED_MEDIAN 2
#endif

    /**
     * slice offsets in the frame in bytes
     * - encoding: Set/allocated by libavcodec.
     * - decoding: Set/allocated by user (or NULL).
     */
    int *slice_offset;

    /**
     * sample aspect ratio (0 if unknown)
     * That is the width of a pixel divided by the height of the pixel.
     * Numerator and denominator must be relatively prime and smaller than 256 for some video standards.
     * - encoding: Set by user.
     * - decoding: Set by libavcodec.
     */
    AVRational sample_aspect_ratio;

    /**
     * motion estimation comparison function
     * - encoding: Set by user.
     * - decoding: unused
     */
    int me_cmp;
    /**
     * subpixel motion estimation comparison function
     * - encoding: Set by user.
     * - decoding: unused
     */
    int me_sub_cmp;
    /**
     * macroblock comparison function (not supported yet)
     * - encoding: Set by user.
     * - decoding: unused
     */
    int mb_cmp;
    /**
     * interlaced DCT comparison function
     * - encoding: Set by user.
     * - decoding: unused
     */
    int ildct_cmp;
#define FF_CMP_SAD          0
#define FF_CMP_SSE          1
#define FF_CMP_SATD         2
#define FF_CMP_DCT          3
#define FF_CMP_PSNR         4
#define FF_CMP_BIT          5
#define FF_CMP_RD           6
#define FF_CMP_ZERO         7
#define FF_CMP_VSAD         8
#define FF_CMP_VSSE         9
#define FF_CMP_NSSE         10
#define FF_CMP_W53          11
#define FF_CMP_W97          12
#define FF_CMP_DCTMAX       13
#define FF_CMP_DCT264       14
#define FF_CMP_MEDIAN_SAD   15
#define FF_CMP_CHROMA       256

    /**
     * ME diamond size & shape
     * - encoding: Set by user.
     * - decoding: unused
     */
    int dia_size;

    /**
     * amount of previous MV predictors (2a+1 x 2a+1 square)
     * - encoding: Set by user.
     * - decoding: unused
     */
    int last_predictor_count;

#if FF_API_PRIVATE_OPT
    /** @deprecated use encoder private options instead */
    attribute_deprecated
    int pre_me;
#endif

    /**
     * motion estimation prepass comparison function
     * - encoding: Set by user.
     * - decoding: unused
     */
    int me_pre_cmp;

    /**
     * ME prepass diamond size & shape
     * - encoding: Set by user.
     * - decoding: unused
     */
    int pre_dia_size;

    /**
     * subpel ME quality
     * - encoding: Set by user.
     * - decoding: unused
     */
    int me_subpel_quality;

    /**
     * maximum motion estimation search range in subpel units
     * If 0 then no limit.
     *
     * - encoding: Set by user.
     * - decoding: unused
     */
    int me_range;

    /**
     * slice flags
     * - encoding: unused
     * - decoding: Set by user.
     */
    int slice_flags;
#define SLICE_FLAG_CODED_ORDER    0x0001 ///< draw_horiz_band() is called in coded order instead of display
#define SLICE_FLAG_ALLOW_FIELD    0x0002 ///< allow draw_horiz_band() with field slices (MPEG-2 field pics)
#define SLICE_FLAG_ALLOW_PLANE    0x0004 ///< allow draw_horiz_band() with 1 component at a time (SVQ1)

    /**
     * macroblock decision mode
     * - encoding: Set by user.
     * - decoding: unused
     */
    int mb_decision;
#define FF_MB_DECISION_SIMPLE 0        ///< uses mb_cmp
#define FF_MB_DECISION_BITS   1        ///< chooses the one which needs the fewest bits
#define FF_MB_DECISION_RD     2        ///< rate distortion

    /**
     * custom intra quantization matrix
     * Must be allocated with the av_malloc() family of functions, and will be freed in
     * avcodec_free_context().
     * - encoding: Set/allocated by user, freed by libavcodec. Can be NULL.
     * - decoding: Set/allocated/freed by libavcodec.
     */
    uint16_t *intra_matrix;

    /**
     * custom inter quantization matrix
     * Must be allocated with the av_malloc() family of functions, and will be freed in
     * avcodec_free_context().
     * - encoding: Set/allocated by user, freed by libavcodec. Can be NULL.
     * - decoding: Set/allocated/freed by libavcodec.
     */
    uint16_t *inter_matrix;

#if FF_API_PRIVATE_OPT
    /** @deprecated use encoder private options instead */
    attribute_deprecated
    int scenechange_threshold;

    /** @deprecated use encoder private options instead */
    attribute_deprecated
    int noise_reduction;
#endif

    /**
     * precision of the intra DC coefficient - 8
     * - encoding: Set by user.
     * - decoding: Set by libavcodec
     */
    int intra_dc_precision;

    /**
     * Number of macroblock rows at the top which are skipped.
     * - encoding: unused
     * - decoding: Set by user.
     */
    int skip_top;

    /**
     * Number of macroblock rows at the bottom which are skipped.
     * - encoding: unused
     * - decoding: Set by user.
     */
    int skip_bottom;

    /**
     * minimum MB Lagrange multiplier
     * - encoding: Set by user.
     * - decoding: unused
     */
    int mb_lmin;

    /**
     * maximum MB Lagrange multiplier
     * - encoding: Set by user.
     * - decoding: unused
     */
    int mb_lmax;

#if FF_API_PRIVATE_OPT
    /**
     * @deprecated use encoder private options instead
     */
    attribute_deprecated
    int me_penalty_compensation;
#endif

    /**
     * - encoding: Set by user.
     * - decoding: unused
     */
    int bidir_refine;

#if FF_API_PRIVATE_OPT
    /** @deprecated use encoder private options instead */
    attribute_deprecated
    int brd_scale;
#endif

    /**
     * minimum GOP size
     * - encoding: Set by user.
     * - decoding: unused
     */
    int keyint_min;

    /**
     * number of reference frames
     * - encoding: Set by user.
     * - decoding: Set by lavc.
     */
    int refs;

#if FF_API_PRIVATE_OPT
    /** @deprecated use encoder private options instead */
    attribute_deprecated
    int chromaoffset;
#endif

    /**
     * Note: Value depends upon the compare function used for fullpel ME.
     * - encoding: Set by user.
     * - decoding: unused
     */
    int mv0_threshold;

#if FF_API_PRIVATE_OPT
    /** @deprecated use encoder private options instead */
    attribute_deprecated
    int b_sensitivity;
#endif

    /**
     * Chromaticity coordinates of the source primaries.
     * - encoding: Set by user
     * - decoding: Set by libavcodec
     */
    enum AVColorPrimaries color_primaries;

    /**
     * Color Transfer Characteristic.
     * - encoding: Set by user
     * - decoding: Set by libavcodec
     */
    enum AVColorTransferCharacteristic color_trc;

    /**
     * YUV colorspace type.
     * - encoding: Set by user
     * - decoding: Set by libavcodec
     */
    enum AVColorSpace colorspace;

    /**
     * MPEG vs JPEG YUV range.
     * - encoding: Set by user
     * - decoding: Set by libavcodec
     */
    enum AVColorRange color_range;

    /**
     * This defines the location of chroma samples.
     * - encoding: Set by user
     * - decoding: Set by libavcodec
     */
    enum AVChromaLocation chroma_sample_location;

    /**
     * Number of slices.
     * Indicates number of picture subdivisions. Used for parallelized
     * decoding.
     * - encoding: Set by user
     * - decoding: unused
     */
    int slices;

    /** Field order
     * - encoding: set by libavcodec
     * - decoding: Set by user.
     */
    enum AVFieldOrder field_order;

    /* audio only */
    int sample_rate; ///< samples per second
    int channels;    ///< number of audio channels

    /**
     * audio sample format
     * - encoding: Set by user.
     * - decoding: Set by libavcodec.
     */
    enum AVSampleFormat sample_fmt;  ///< sample format

    /* The following data should not be initialized. */
    /**
     * Number of samples per channel in an audio frame.
     *
     * - encoding: set by libavcodec in avcodec_open2(). Each submitted frame
     *   except the last must contain exactly frame_size samples per channel.
     *   May be 0 when the codec has AV_CODEC_CAP_VARIABLE_FRAME_SIZE set, then the
     *   frame size is not restricted.
     * - decoding: may be set by some decoders to indicate constant frame size
     */
    int frame_size;

    /**
     * Frame counter, set by libavcodec.
     *
     * - decoding: total number of frames returned from the decoder so far.
     * - encoding: total number of frames passed to the encoder so far.
     *
     *   @note the counter is not incremented if encoding/decoding resulted in
     *   an error.
     */
    int frame_number;

    /**
     * number of bytes per packet if constant and known or 0
     * Used by some WAV based audio codecs.
     */
    int block_align;

    /**
     * Audio cutoff bandwidth (0 means "automatic")
     * - encoding: Set by user.
     * - decoding: unused
     */
    int cutoff;

    /**
     * Audio channel layout.
     * - encoding: set by user.
     * - decoding: set by user, may be overwritten by libavcodec.
     */
    uint64_t channel_layout;

    /**
     * Request decoder to use this channel layout if it can (0 for default)
     * - encoding: unused
     * - decoding: Set by user.
     */
    uint64_t request_channel_layout;

    /**
     * Type of service that the audio stream conveys.
     * - encoding: Set by user.
     * - decoding: Set by libavcodec.
     */
    enum AVAudioServiceType audio_service_type;

    /**
     * desired sample format
     * - encoding: Not used.
     * - decoding: Set by user.
     * Decoder will decode to this format if it can.
     */
    enum AVSampleFormat request_sample_fmt;

    /**
     * This callback is called at the beginning of each frame to get data
     * buffer(s) for it. There may be one contiguous buffer for all the data or
     * there may be a buffer per each data plane or anything in between. What
     * this means is, you may set however many entries in buf[] you feel necessary.
     * Each buffer must be reference-counted using the AVBuffer API (see description
     * of buf[] below).
     *
     * The following fields will be set in the frame before this callback is
     * called:
     * - format
     * - width, height (video only)
     * - sample_rate, channel_layout, nb_samples (audio only)
     * Their values may differ from the corresponding values in
     * AVCodecContext. This callback must use the frame values, not the codec
     * context values, to calculate the required buffer size.
     *
     * This callback must fill the following fields in the frame:
     * - data[]
     * - linesize[]
     * - extended_data:
     *   * if the data is planar audio with more than 8 channels, then this
     *     callback must allocate and fill extended_data to contain all pointers
     *     to all data planes. data[] must hold as many pointers as it can.
     *     extended_data must be allocated with av_malloc() and will be freed in
     *     av_frame_unref().
     *   * otherwise extended_data must point to data
     * - buf[] must contain one or more pointers to AVBufferRef structures. Each of
     *   the frame's data and extended_data pointers must be contained in these. That
     *   is, one AVBufferRef for each allocated chunk of memory, not necessarily one
     *   AVBufferRef per data[] entry. See: av_buffer_create(), av_buffer_alloc(),
     *   and av_buffer_ref().
     * - extended_buf and nb_extended_buf must be allocated with av_malloc() by
     *   this callback and filled with the extra buffers if there are more
     *   buffers than buf[] can hold. extended_buf will be freed in
     *   av_frame_unref().
     *
     * If AV_CODEC_CAP_DR1 is not set then get_buffer2() must call
     * avcodec_default_get_buffer2() instead of providing buffers allocated by
     * some other means.
     *
     * Each data plane must be aligned to the maximum required by the target
     * CPU.
     *
     * @see avcodec_default_get_buffer2()
     *
     * Video:
     *
     * If AV_GET_BUFFER_FLAG_REF is set in flags then the frame may be reused
     * (read and/or written to if it is writable) later by libavcodec.
     *
     * avcodec_align_dimensions2() should be used to find the required width and
     * height, as they normally need to be rounded up to the next multiple of 16.
     *
     * Some decoders do not support linesizes changing between frames.
     *
     * If frame multithreading is used and thread_safe_callbacks is set,
     * this callback may be called from a different thread, but not from more
     * than one at once. Does not need to be reentrant.
     *
     * @see avcodec_align_dimensions2()
     *
     * Audio:
     *
     * Decoders request a buffer of a particular size by setting
     * AVFrame.nb_samples prior to calling get_buffer2(). The decoder may,
     * however, utilize only part of the buffer by setting AVFrame.nb_samples
     * to a smaller value in the output frame.
     *
     * As a convenience, av_samples_get_buffer_size() and
     * av_samples_fill_arrays() in libavutil may be used by custom get_buffer2()
     * functions to find the required data size and to fill data pointers and
     * linesize. In AVFrame.linesize, only linesize[0] may be set for audio
     * since all planes must be the same size.
     *
     * @see av_samples_get_buffer_size(), av_samples_fill_arrays()
     *
     * - encoding: unused
     * - decoding: Set by libavcodec, user can override.
     */
    int (*get_buffer2)(struct AVCodecContext *s, AVFrame *frame, int flags);

    /**
     * If non-zero, the decoded audio and video frames returned from
     * avcodec_decode_video2() and avcodec_decode_audio4() are reference-counted
     * and are valid indefinitely. The caller must free them with
     * av_frame_unref() when they are not needed anymore.
     * Otherwise, the decoded frames must not be freed by the caller and are
     * only valid until the next decode call.
     *
     * This is always automatically enabled if avcodec_receive_frame() is used.
     *
     * - encoding: unused
     * - decoding: set by the caller before avcodec_open2().
     */
    attribute_deprecated
    int refcounted_frames;

    /* - encoding parameters */
    float qcompress;  ///< amount of qscale change between easy & hard scenes (0.0-1.0)
    float qblur;      ///< amount of qscale smoothing over time (0.0-1.0)

    /**
     * minimum quantizer
     * - encoding: Set by user.
     * - decoding: unused
     */
    int qmin;

    /**
     * maximum quantizer
     * - encoding: Set by user.
     * - decoding: unused
     */
    int qmax;

    /**
     * maximum quantizer difference between frames
     * - encoding: Set by user.
     * - decoding: unused
     */
    int max_qdiff;

    /**
     * decoder bitstream buffer size
     * - encoding: Set by user.
     * - decoding: unused
     */
    int rc_buffer_size;

    /**
     * ratecontrol override, see RcOverride
     * - encoding: Allocated/set/freed by user.
     * - decoding: unused
     */
    int rc_override_count;
    RcOverride *rc_override;

    /**
     * maximum bitrate
     * - encoding: Set by user.
     * - decoding: Set by user, may be overwritten by libavcodec.
     */
    int64_t rc_max_rate;

    /**
     * minimum bitrate
     * - encoding: Set by user.
     * - decoding: unused
     */
    int64_t rc_min_rate;

    /**
     * Ratecontrol attempt to use, at maximum, <value> of what can be used without an underflow.
     * - encoding: Set by user.
     * - decoding: unused.
     */
    float rc_max_available_vbv_use;

    /**
     * Ratecontrol attempt to use, at least, <value> times the amount needed to prevent a vbv overflow.
     * - encoding: Set by user.
     * - decoding: unused.
     */
    float rc_min_vbv_overflow_use;

    /**
     * Number of bits which should be loaded into the rc buffer before decoding starts.
     * - encoding: Set by user.
     * - decoding: unused
     */
    int rc_initial_buffer_occupancy;

#if FF_API_CODER_TYPE
#define FF_CODER_TYPE_VLC       0
#define FF_CODER_TYPE_AC        1
#define FF_CODER_TYPE_RAW       2
#define FF_CODER_TYPE_RLE       3
    /**
     * @deprecated use encoder private options instead
     */
    attribute_deprecated
    int coder_type;
#endif /* FF_API_CODER_TYPE */

#if FF_API_PRIVATE_OPT
    /** @deprecated use encoder private options instead */
    attribute_deprecated
    int context_model;
#endif

#if FF_API_PRIVATE_OPT
    /** @deprecated use encoder private options instead */
    attribute_deprecated
    int frame_skip_threshold;

    /** @deprecated use encoder private options instead */
    attribute_deprecated
    int frame_skip_factor;

    /** @deprecated use encoder private options instead */
    attribute_deprecated
    int frame_skip_exp;

    /** @deprecated use encoder private options instead */
    attribute_deprecated
    int frame_skip_cmp;
#endif /* FF_API_PRIVATE_OPT */

    /**
     * trellis RD quantization
     * - encoding: Set by user.
     * - decoding: unused
     */
    int trellis;

#if FF_API_PRIVATE_OPT
    /** @deprecated use encoder private options instead */
    attribute_deprecated
    int min_prediction_order;

    /** @deprecated use encoder private options instead */
    attribute_deprecated
    int max_prediction_order;

    /** @deprecated use encoder private options instead */
    attribute_deprecated
    int64_t timecode_frame_start;
#endif

#if FF_API_RTP_CALLBACK
    /**
     * @deprecated unused
     */
    /* The RTP callback: This function is called    */
    /* every time the encoder has a packet to send. */
    /* It depends on the encoder if the data starts */
    /* with a Start Code (it should). H.263 does.   */
    /* mb_nb contains the number of macroblocks     */
    /* encoded in the RTP payload.                  */
    attribute_deprecated
    void (*rtp_callback)(struct AVCodecContext *avctx, void *data, int size, int mb_nb);
#endif

#if FF_API_PRIVATE_OPT
    /** @deprecated use encoder private options instead */
    attribute_deprecated
    int rtp_payload_size;   /* The size of the RTP payload: the coder will  */
                            /* do its best to deliver a chunk with size     */
                            /* below rtp_payload_size, the chunk will start */
                            /* with a start code on some codecs like H.263. */
                            /* This doesn't take account of any particular  */
                            /* headers inside the transmitted RTP payload.  */
#endif

#if FF_API_STAT_BITS
    /* statistics, used for 2-pass encoding */
    attribute_deprecated
    int mv_bits;
    attribute_deprecated
    int header_bits;
    attribute_deprecated
    int i_tex_bits;
    attribute_deprecated
    int p_tex_bits;
    attribute_deprecated
    int i_count;
    attribute_deprecated
    int p_count;
    attribute_deprecated
    int skip_count;
    attribute_deprecated
    int misc_bits;

    /** @deprecated this field is unused */
    attribute_deprecated
    int frame_bits;
#endif

    /**
     * pass1 encoding statistics output buffer
     * - encoding: Set by libavcodec.
     * - decoding: unused
     */
    char *stats_out;

    /**
     * pass2 encoding statistics input buffer
     * Concatenated stuff from stats_out of pass1 should be placed here.
     * - encoding: Allocated/set/freed by user.
     * - decoding: unused
     */
    char *stats_in;

    /**
     * Work around bugs in encoders which sometimes cannot be detected automatically.
     * - encoding: Set by user
     * - decoding: Set by user
     */
    int workaround_bugs;
#define FF_BUG_AUTODETECT       1  ///< autodetection
#define FF_BUG_XVID_ILACE       4
#define FF_BUG_UMP4             8
#define FF_BUG_NO_PADDING       16
#define FF_BUG_AMV              32
#define FF_BUG_QPEL_CHROMA      64
#define FF_BUG_STD_QPEL         128
#define FF_BUG_QPEL_CHROMA2     256
#define FF_BUG_DIRECT_BLOCKSIZE 512
#define FF_BUG_EDGE             1024
#define FF_BUG_HPEL_CHROMA      2048
#define FF_BUG_DC_CLIP          4096
#define FF_BUG_MS               8192 ///< Work around various bugs in Microsoft's broken decoders.
#define FF_BUG_TRUNCATED       16384
#define FF_BUG_IEDGE           32768

    /**
     * strictly follow the standard (MPEG-4, ...).
     * - encoding: Set by user.
     * - decoding: Set by user.
     * Setting this to STRICT or higher means the encoder and decoder will
     * generally do stupid things, whereas setting it to unofficial or lower
     * will mean the encoder might produce output that is not supported by all
     * spec-compliant decoders. Decoders don't differentiate between normal,
     * unofficial and experimental (that is, they always try to decode things
     * when they can) unless they are explicitly asked to behave stupidly
     * (=strictly conform to the specs)
     */
    int strict_std_compliance;
#define FF_COMPLIANCE_VERY_STRICT   2 ///< Strictly conform to an older more strict version of the spec or reference software.
#define FF_COMPLIANCE_STRICT        1 ///< Strictly conform to all the things in the spec no matter what consequences.
#define FF_COMPLIANCE_NORMAL        0
#define FF_COMPLIANCE_UNOFFICIAL   -1 ///< Allow unofficial extensions
#define FF_COMPLIANCE_EXPERIMENTAL -2 ///< Allow nonstandardized experimental things.

    /**
     * error concealment flags
     * - encoding: unused
     * - decoding: Set by user.
     */
    int error_concealment;
#define FF_EC_GUESS_MVS   1
#define FF_EC_DEBLOCK     2
#define FF_EC_FAVOR_INTER 256

    /**
     * debug
     * - encoding: Set by user.
     * - decoding: Set by user.
     */
    int debug;
#define FF_DEBUG_PICT_INFO   1
#define FF_DEBUG_RC          2
#define FF_DEBUG_BITSTREAM   4
#define FF_DEBUG_MB_TYPE     8
#define FF_DEBUG_QP          16
#if FF_API_DEBUG_MV
/**
 * @deprecated this option does nothing
 */
#define FF_DEBUG_MV          32
#endif
#define FF_DEBUG_DCT_COEFF   0x00000040
#define FF_DEBUG_SKIP        0x00000080
#define FF_DEBUG_STARTCODE   0x00000100
#define FF_DEBUG_ER          0x00000400
#define FF_DEBUG_MMCO        0x00000800
#define FF_DEBUG_BUGS        0x00001000
#if FF_API_DEBUG_MV
#define FF_DEBUG_VIS_QP      0x00002000
#define FF_DEBUG_VIS_MB_TYPE 0x00004000
#endif
#define FF_DEBUG_BUFFERS     0x00008000
#define FF_DEBUG_THREADS     0x00010000
#define FF_DEBUG_GREEN_MD    0x00800000
#define FF_DEBUG_NOMC        0x01000000

#if FF_API_DEBUG_MV
    /**
     * debug
     * - encoding: Set by user.
     * - decoding: Set by user.
     */
    int debug_mv;
#define FF_DEBUG_VIS_MV_P_FOR  0x00000001 // visualize forward predicted MVs of P-frames
#define FF_DEBUG_VIS_MV_B_FOR  0x00000002 // visualize forward predicted MVs of B-frames
#define FF_DEBUG_VIS_MV_B_BACK 0x00000004 // visualize backward predicted MVs of B-frames
#endif

    /**
     * Error recognition; may misdetect some more or less valid parts as errors.
     * - encoding: unused
     * - decoding: Set by user.
     */
    int err_recognition;

/**
 * Verify checksums embedded in the bitstream (could be of either encoded or
 * decoded data, depending on the codec) and print an error message on mismatch.
 * If AV_EF_EXPLODE is also set, a mismatching checksum will result in the
 * decoder returning an error.
 */
#define AV_EF_CRCCHECK  (1<<0)
#define AV_EF_BITSTREAM (1<<1)          ///< detect bitstream specification deviations
#define AV_EF_BUFFER    (1<<2)          ///< detect improper bitstream length
#define AV_EF_EXPLODE   (1<<3)          ///< abort decoding on minor error detection

#define AV_EF_IGNORE_ERR (1<<15)        ///< ignore errors and continue
#define AV_EF_CAREFUL    (1<<16)        ///< consider things that violate the spec, are fast to calculate and have not been seen in the wild as errors
#define AV_EF_COMPLIANT  (1<<17)        ///< consider all spec non compliances as errors
#define AV_EF_AGGRESSIVE (1<<18)        ///< consider things that a sane encoder should not do as an error


    /**
     * opaque 64-bit number (generally a PTS) that will be reordered and
     * output in AVFrame.reordered_opaque
     * - encoding: Set by libavcodec to the reordered_opaque of the input
     *             frame corresponding to the last returned packet. Only
     *             supported by encoders with the
     *             AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE capability.
     * - decoding: Set by user.
     */
    int64_t reordered_opaque;

    /**
     * Hardware accelerator in use
     * - encoding: unused.
     * - decoding: Set by libavcodec
     */
    const struct AVHWAccel *hwaccel;

    /**
     * Hardware accelerator context.
     * For some hardware accelerators, a global context needs to be
     * provided by the user. In that case, this holds display-dependent
     * data FFmpeg cannot instantiate itself. Please refer to the
     * FFmpeg HW accelerator documentation to know how to fill this
     * is. e.g. for VA API, this is a struct vaapi_context.
     * - encoding: unused
     * - decoding: Set by user
     */
    void *hwaccel_context;

    /**
     * error
     * - encoding: Set by libavcodec if flags & AV_CODEC_FLAG_PSNR.
     * - decoding: unused
     */
    uint64_t error[AV_NUM_DATA_POINTERS];

    /**
     * DCT algorithm, see FF_DCT_* below
     * - encoding: Set by user.
     * - decoding: unused
     */
    int dct_algo;
#define FF_DCT_AUTO    0
#define FF_DCT_FASTINT 1
#define FF_DCT_INT     2
#define FF_DCT_MMX     3
#define FF_DCT_ALTIVEC 5
#define FF_DCT_FAAN    6

    /**
     * IDCT algorithm, see FF_IDCT_* below.
     * - encoding: Set by user.
     * - decoding: Set by user.
     */
    int idct_algo;
#define FF_IDCT_AUTO          0
#define FF_IDCT_INT           1
#define FF_IDCT_SIMPLE        2
#define FF_IDCT_SIMPLEMMX     3
#define FF_IDCT_ARM           7
#define FF_IDCT_ALTIVEC       8
#define FF_IDCT_SIMPLEARM     10
#define FF_IDCT_XVID          14
#define FF_IDCT_SIMPLEARMV5TE 16
#define FF_IDCT_SIMPLEARMV6   17
#define FF_IDCT_FAAN          20
#define FF_IDCT_SIMPLENEON    22
#define FF_IDCT_NONE          24 /* Used by XvMC to extract IDCT coefficients with FF_IDCT_PERM_NONE */
#define FF_IDCT_SIMPLEAUTO    128

    /**
     * bits per sample/pixel from the demuxer (needed for huffyuv).
     * - encoding: Set by libavcodec.
     * - decoding: Set by user.
     */
     int bits_per_coded_sample;

    /**
     * Bits per sample/pixel of internal libavcodec pixel/sample format.
     * - encoding: set by user.
     * - decoding: set by libavcodec.
     */
    int bits_per_raw_sample;

#if FF_API_LOWRES
    /**
     * low resolution decoding, 1-> 1/2 size, 2->1/4 size
     * - encoding: unused
     * - decoding: Set by user.
     */
     int lowres;
#endif

#if FF_API_CODED_FRAME
    /**
     * the picture in the bitstream
     * - encoding: Set by libavcodec.
     * - decoding: unused
     *
     * @deprecated use the quality factor packet side data instead
     */
    attribute_deprecated AVFrame *coded_frame;
#endif

    /**
     * thread count
     * is used to decide how many independent tasks should be passed to execute()
     * - encoding: Set by user.
     * - decoding: Set by user.
     */
    int thread_count;

    /**
     * Which multithreading methods to use.
     * Use of FF_THREAD_FRAME will increase decoding delay by one frame per thread,
     * so clients which cannot provide future frames should not use it.
     *
     * - encoding: Set by user, otherwise the default is used.
     * - decoding: Set by user, otherwise the default is used.
     */
    int thread_type;
#define FF_THREAD_FRAME   1 ///< Decode more than one frame at once
#define FF_THREAD_SLICE   2 ///< Decode more than one part of a single frame at once

    /**
     * Which multithreading methods are in use by the codec.
     * - encoding: Set by libavcodec.
     * - decoding: Set by libavcodec.
     */
    int active_thread_type;

    /**
     * Set by the client if its custom get_buffer() callback can be called
     * synchronously from another thread, which allows faster multithreaded decoding.
     * draw_horiz_band() will be called from other threads regardless of this setting.
     * Ignored if the default get_buffer() is used.
     * - encoding: Set by user.
     * - decoding: Set by user.
     */
    int thread_safe_callbacks;

    /**
     * The codec may call this to execute several independent things.
     * It will return only after finishing all tasks.
     * The user may replace this with some multithreaded implementation,
     * the default implementation will execute the parts serially.
     * @param count the number of things to execute
     * - encoding: Set by libavcodec, user can override.
     * - decoding: Set by libavcodec, user can override.
     */
    int (*execute)(struct AVCodecContext *c, int (*func)(struct AVCodecContext *c2, void *arg), void *arg2, int *ret, int count, int size);

    /**
     * The codec may call this to execute several independent things.
     * It will return only after finishing all tasks.
     * The user may replace this with some multithreaded implementation,
     * the default implementation will execute the parts serially.
     * Also see avcodec_thread_init and e.g. the --enable-pthread configure option.
     * @param c context passed also to func
     * @param count the number of things to execute
     * @param arg2 argument passed unchanged to func
     * @param ret return values of executed functions, must have space for "count" values. May be NULL.
     * @param func function that will be called count times, with jobnr from 0 to count-1.
     *             threadnr will be in the range 0 to c->thread_count-1 < MAX_THREADS and so that no
     *             two instances of func executing at the same time will have the same threadnr.
     * @return always 0 currently, but code should handle a future improvement where when any call to func
     *         returns < 0 no further calls to func may be done and < 0 is returned.
     * - encoding: Set by libavcodec, user can override.
     * - decoding: Set by libavcodec, user can override.
     */
    int (*execute2)(struct AVCodecContext *c, int (*func)(struct AVCodecContext *c2, void *arg, int jobnr, int threadnr), void *arg2, int *ret, int count);

    /**
     * noise vs. sse weight for the nsse comparison function
     * - encoding: Set by user.
     * - decoding: unused
     */
     int nsse_weight;

    /**
     * profile
     * - encoding: Set by user.
     * - decoding: Set by libavcodec.
     */
     int profile;
#define FF_PROFILE_UNKNOWN -99
#define FF_PROFILE_RESERVED -100

#define FF_PROFILE_AAC_MAIN 0
#define FF_PROFILE_AAC_LOW  1
#define FF_PROFILE_AAC_SSR  2
#define FF_PROFILE_AAC_LTP  3
#define FF_PROFILE_AAC_HE   4
#define FF_PROFILE_AAC_HE_V2 28
#define FF_PROFILE_AAC_LD   22
#define FF_PROFILE_AAC_ELD  38
#define FF_PROFILE_MPEG2_AAC_LOW 128
#define FF_PROFILE_MPEG2_AAC_HE  131

#define FF_PROFILE_DNXHD         0
#define FF_PROFILE_DNXHR_LB      1
#define FF_PROFILE_DNXHR_SQ      2
#define FF_PROFILE_DNXHR_HQ      3
#define FF_PROFILE_DNXHR_HQX     4
#define FF_PROFILE_DNXHR_444     5

#define FF_PROFILE_DTS         20
#define FF_PROFILE_DTS_ES      30
#define FF_PROFILE_DTS_96_24   40
#define FF_PROFILE_DTS_HD_HRA  50
#define FF_PROFILE_DTS_HD_MA   60
#define FF_PROFILE_DTS_EXPRESS 70

#define FF_PROFILE_MPEG2_422    0
#define FF_PROFILE_MPEG2_HIGH   1
#define FF_PROFILE_MPEG2_SS     2
#define FF_PROFILE_MPEG2_SNR_SCALABLE  3
#define FF_PROFILE_MPEG2_MAIN   4
#define FF_PROFILE_MPEG2_SIMPLE 5

#define FF_PROFILE_H264_CONSTRAINED  (1<<9)  // 8+1; constraint_set1_flag
#define FF_PROFILE_H264_INTRA        (1<<11) // 8+3; constraint_set3_flag

#define FF_PROFILE_H264_BASELINE             66
#define FF_PROFILE_H264_CONSTRAINED_BASELINE (66|FF_PROFILE_H264_CONSTRAINED)
#define FF_PROFILE_H264_MAIN                 77
#define FF_PROFILE_H264_EXTENDED             88
#define FF_PROFILE_H264_HIGH                 100
#define FF_PROFILE_H264_HIGH_10              110
#define FF_PROFILE_H264_HIGH_10_INTRA        (110|FF_PROFILE_H264_INTRA)
#define FF_PROFILE_H264_MULTIVIEW_HIGH       118
#define FF_PROFILE_H264_HIGH_422             122
#define FF_PROFILE_H264_HIGH_422_INTRA       (122|FF_PROFILE_H264_INTRA)
#define FF_PROFILE_H264_STEREO_HIGH          128
#define FF_PROFILE_H264_HIGH_444             144
#define FF_PROFILE_H264_HIGH_444_PREDICTIVE  244
#define FF_PROFILE_H264_HIGH_444_INTRA       (244|FF_PROFILE_H264_INTRA)
#define FF_PROFILE_H264_CAVLC_444            44

#define FF_PROFILE_VC1_SIMPLE   0
#define FF_PROFILE_VC1_MAIN     1
#define FF_PROFILE_VC1_COMPLEX  2
#define FF_PROFILE_VC1_ADVANCED 3

#define FF_PROFILE_MPEG4_SIMPLE                     0
#define FF_PROFILE_MPEG4_SIMPLE_SCALABLE            1
#define FF_PROFILE_MPEG4_CORE                       2
#define FF_PROFILE_MPEG4_MAIN                       3
#define FF_PROFILE_MPEG4_N_BIT                      4
#define FF_PROFILE_MPEG4_SCALABLE_TEXTURE           5
#define FF_PROFILE_MPEG4_SIMPLE_FACE_ANIMATION      6
#define FF_PROFILE_MPEG4_BASIC_ANIMATED_TEXTURE     7
#define FF_PROFILE_MPEG4_HYBRID                     8
#define FF_PROFILE_MPEG4_ADVANCED_REAL_TIME         9
#define FF_PROFILE_MPEG4_CORE_SCALABLE             10
#define FF_PROFILE_MPEG4_ADVANCED_CODING           11
#define FF_PROFILE_MPEG4_ADVANCED_CORE             12
#define FF_PROFILE_MPEG4_ADVANCED_SCALABLE_TEXTURE 13
#define FF_PROFILE_MPEG4_SIMPLE_STUDIO             14
#define FF_PROFILE_MPEG4_ADVANCED_SIMPLE           15

#define FF_PROFILE_JPEG2000_CSTREAM_RESTRICTION_0   1
#define FF_PROFILE_JPEG2000_CSTREAM_RESTRICTION_1   2
#define FF_PROFILE_JPEG2000_CSTREAM_NO_RESTRICTION  32768
#define FF_PROFILE_JPEG2000_DCINEMA_2K              3
#define FF_PROFILE_JPEG2000_DCINEMA_4K              4

#define FF_PROFILE_VP9_0                            0
#define FF_PROFILE_VP9_1                            1
#define FF_PROFILE_VP9_2                            2
#define FF_PROFILE_VP9_3                            3

#define FF_PROFILE_HEVC_MAIN                        1
#define FF_PROFILE_HEVC_MAIN_10                     2
#define FF_PROFILE_HEVC_MAIN_STILL_PICTURE          3
#define FF_PROFILE_HEVC_REXT                        4

#define FF_PROFILE_AV1_MAIN                         0
#define FF_PROFILE_AV1_HIGH                         1
#define FF_PROFILE_AV1_PROFESSIONAL                 2

#define FF_PROFILE_MJPEG_HUFFMAN_BASELINE_DCT            0xc0
#define FF_PROFILE_MJPEG_HUFFMAN_EXTENDED_SEQUENTIAL_DCT 0xc1
#define FF_PROFILE_MJPEG_HUFFMAN_PROGRESSIVE_DCT         0xc2
#define FF_PROFILE_MJPEG_HUFFMAN_LOSSLESS                0xc3
#define FF_PROFILE_MJPEG_JPEG_LS                         0xf7

#define FF_PROFILE_SBC_MSBC                         1

#define FF_PROFILE_PRORES_PROXY     0
#define FF_PROFILE_PRORES_LT        1
#define FF_PROFILE_PRORES_STANDARD  2
#define FF_PROFILE_PRORES_HQ        3
#define FF_PROFILE_PRORES_4444      4
#define FF_PROFILE_PRORES_XQ        5

#define FF_PROFILE_ARIB_PROFILE_A 0
#define FF_PROFILE_ARIB_PROFILE_C 1

    /**
     * level
     * - encoding: Set by user.
     * - decoding: Set by libavcodec.
     */
     int level;
#define FF_LEVEL_UNKNOWN -99

    /**
     * Skip loop filtering for selected frames.
     * - encoding: unused
     * - decoding: Set by user.
     */
    enum AVDiscard skip_loop_filter;

    /**
     * Skip IDCT/dequantization for selected frames.
     * - encoding: unused
     * - decoding: Set by user.
     */
    enum AVDiscard skip_idct;

    /**
     * Skip decoding for selected frames.
     * - encoding: unused
     * - decoding: Set by user.
     */
    enum AVDiscard skip_frame;

    /**
     * Header containing style information for text subtitles.
     * For SUBTITLE_ASS subtitle type, it should contain the whole ASS
     * [Script Info] and [V4+ Styles] section, plus the [Events] line and
     * the Format line following. It shouldn't include any Dialogue line.
     * - encoding: Set/allocated/freed by user (before avcodec_open2())
     * - decoding: Set/allocated/freed by libavcodec (by avcodec_open2())
     */
    uint8_t *subtitle_header;
    int subtitle_header_size;

#if FF_API_VBV_DELAY
    /**
     * VBV delay coded in the last frame (in periods of a 27 MHz clock).
     * Used for compliant TS muxing.
     * - encoding: Set by libavcodec.
     * - decoding: unused.
     * @deprecated this value is now exported as a part of
     * AV_PKT_DATA_CPB_PROPERTIES packet side data
     */
    attribute_deprecated
    uint64_t vbv_delay;
#endif

#if FF_API_SIDEDATA_ONLY_PKT
    /**
     * Encoding only and set by default. Allow encoders to output packets
     * that do not contain any encoded data, only side data.
     *
     * Some encoders need to output such packets, e.g. to update some stream
     * parameters at the end of encoding.
     *
     * @deprecated this field disables the default behaviour and
     *             it is kept only for compatibility.
     */
    attribute_deprecated
    int side_data_only_packets;
#endif

    /**
     * Audio only. The number of "priming" samples (padding) 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.
     *
     * - decoding: unused
     * - encoding: Set by libavcodec. The timestamps on the output packets are
     *             adjusted by the encoder so that they always refer to the
     *             first sample of the data actually contained in the packet,
     *             including any added padding.  E.g. if the timebase is
     *             1/samplerate and the timestamp of the first input sample is
     *             0, the timestamp of the first output packet will be
     *             -initial_padding.
     */
    int initial_padding;

    /**
     * - decoding: For codecs that store a framerate value in the compressed
     *             bitstream, the decoder may export it here. { 0, 1} when
     *             unknown.
     * - encoding: May be used to signal the framerate of CFR content to an
     *             encoder.
     */
    AVRational framerate;

    /**
     * Nominal unaccelerated pixel format, see AV_PIX_FMT_xxx.
     * - encoding: unused.
     * - decoding: Set by libavcodec before calling get_format()
     */
    enum AVPixelFormat sw_pix_fmt;

    /**
     * Timebase in which pkt_dts/pts and AVPacket.dts/pts are.
     * - encoding unused.
     * - decoding set by user.
     */
    AVRational pkt_timebase;

    /**
     * AVCodecDescriptor
     * - encoding: unused.
     * - decoding: set by libavcodec.
     */
    const AVCodecDescriptor *codec_descriptor;

#if !FF_API_LOWRES
    /**
     * low resolution decoding, 1-> 1/2 size, 2->1/4 size
     * - encoding: unused
     * - decoding: Set by user.
     */
     int lowres;
#endif

    /**
     * Current statistics for PTS correction.
     * - decoding: maintained and used by libavcodec, not intended to be used by user apps
     * - encoding: unused
     */
    int64_t pts_correction_num_faulty_pts; /// Number of incorrect PTS values so far
    int64_t pts_correction_num_faulty_dts; /// Number of incorrect DTS values so far
    int64_t pts_correction_last_pts;       /// PTS of the last frame
    int64_t pts_correction_last_dts;       /// DTS of the last frame

    /**
     * Character encoding of the input subtitles file.
     * - decoding: set by user
     * - encoding: unused
     */
    char *sub_charenc;

    /**
     * Subtitles character encoding mode. Formats or codecs might be adjusting
     * this setting (if they are doing the conversion themselves for instance).
     * - decoding: set by libavcodec
     * - encoding: unused
     */
    int sub_charenc_mode;
#define FF_SUB_CHARENC_MODE_DO_NOTHING  -1  ///< do nothing (demuxer outputs a stream supposed to be already in UTF-8, or the codec is bitmap for instance)
#define FF_SUB_CHARENC_MODE_AUTOMATIC    0  ///< libavcodec will select the mode itself
#define FF_SUB_CHARENC_MODE_PRE_DECODER  1  ///< the AVPacket data needs to be recoded to UTF-8 before being fed to the decoder, requires iconv
#define FF_SUB_CHARENC_MODE_IGNORE       2  ///< neither convert the subtitles, nor check them for valid UTF-8

    /**
     * Skip processing alpha if supported by codec.
     * Note that if the format uses pre-multiplied alpha (common with VP6,
     * and recommended due to better video quality/compression)
     * the image will look as if alpha-blended onto a black background.
     * However for formats that do not use pre-multiplied alpha
     * there might be serious artefacts (though e.g. libswscale currently
     * assumes pre-multiplied alpha anyway).
     *
     * - decoding: set by user
     * - encoding: unused
     */
    int skip_alpha;

    /**
     * Number of samples to skip after a discontinuity
     * - decoding: unused
     * - encoding: set by libavcodec
     */
    int seek_preroll;

#if !FF_API_DEBUG_MV
    /**
     * debug motion vectors
     * - encoding: Set by user.
     * - decoding: Set by user.
     */
    int debug_mv;
#define FF_DEBUG_VIS_MV_P_FOR  0x00000001 //visualize forward predicted MVs of P frames
#define FF_DEBUG_VIS_MV_B_FOR  0x00000002 //visualize forward predicted MVs of B frames
#define FF_DEBUG_VIS_MV_B_BACK 0x00000004 //visualize backward predicted MVs of B frames
#endif

    /**
     * custom intra quantization matrix
     * - encoding: Set by user, can be NULL.
     * - decoding: unused.
     */
    uint16_t *chroma_intra_matrix;

    /**
     * dump format separator.
     * can be ", " or "\n      " or anything else
     * - encoding: Set by user.
     * - decoding: Set by user.
     */
    uint8_t *dump_separator;

    /**
     * ',' separated list of allowed decoders.
     * If NULL then all are allowed
     * - encoding: unused
     * - decoding: set by user
     */
    char *codec_whitelist;

    /**
     * Properties of the stream that gets decoded
     * - encoding: unused
     * - decoding: set by libavcodec
     */
    unsigned properties;
#define FF_CODEC_PROPERTY_LOSSLESS        0x00000001
#define FF_CODEC_PROPERTY_CLOSED_CAPTIONS 0x00000002

    /**
     * Additional data associated with the entire coded stream.
     *
     * - decoding: unused
     * - encoding: may be set by libavcodec after avcodec_open2().
     */
    AVPacketSideData *coded_side_data;
    int            nb_coded_side_data;

    /**
     * A reference to the AVHWFramesContext describing the input (for encoding)
     * or output (decoding) frames. The reference is set by the caller and
     * afterwards owned (and freed) by libavcodec - it should never be read by
     * the caller after being set.
     *
     * - decoding: This field should be set by the caller from the get_format()
     *             callback. The previous reference (if any) will always be
     *             unreffed by libavcodec before the get_format() call.
     *
     *             If the default get_buffer2() is used with a hwaccel pixel
     *             format, then this AVHWFramesContext will be used for
     *             allocating the frame buffers.
     *
     * - encoding: For hardware encoders configured to use a hwaccel pixel
     *             format, this field should be set by the caller to a reference
     *             to the AVHWFramesContext describing input frames.
     *             AVHWFramesContext.format must be equal to
     *             AVCodecContext.pix_fmt.
     *
     *             This field should be set before avcodec_open2() is called.
     */
    AVBufferRef *hw_frames_ctx;

    /**
     * Control the form of AVSubtitle.rects[N]->ass
     * - decoding: set by user
     * - encoding: unused
     */
    int sub_text_format;
#define FF_SUB_TEXT_FMT_ASS              0
#if FF_API_ASS_TIMING
#define FF_SUB_TEXT_FMT_ASS_WITH_TIMINGS 1
#endif

    /**
     * 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.
     *
     * - decoding: unused
     * - encoding: unused
     */
    int trailing_padding;

    /**
     * The number of pixels per image to maximally accept.
     *
     * - decoding: set by user
     * - encoding: set by user
     */
    int64_t max_pixels;

    /**
     * A reference to the AVHWDeviceContext describing the device which will
     * be used by a hardware encoder/decoder.  The reference is set by the
     * caller and afterwards owned (and freed) by libavcodec.
     *
     * This should be used if either the codec device does not require
     * hardware frames or any that are used are to be allocated internally by
     * libavcodec.  If the user wishes to supply any of the frames used as
     * encoder input or decoder output then hw_frames_ctx should be used
     * instead.  When hw_frames_ctx is set in get_format() for a decoder, this
     * field will be ignored while decoding the associated stream segment, but
     * may again be used on a following one after another get_format() call.
     *
     * For both encoders and decoders this field should be set before
     * avcodec_open2() is called and must not be written to thereafter.
     *
     * Note that some decoders may require this field to be set initially in
     * order to support hw_frames_ctx at all - in that case, all frames
     * contexts used must be created on the same device.
     */
    AVBufferRef *hw_device_ctx;

    /**
     * Bit set of AV_HWACCEL_FLAG_* flags, which affect hardware accelerated
     * decoding (if active).
     * - encoding: unused
     * - decoding: Set by user (either before avcodec_open2(), or in the
     *             AVCodecContext.get_format callback)
     */
    int hwaccel_flags;

    /**
     * Video decoding only. Certain video codecs support cropping, meaning that
     * only a sub-rectangle of the decoded frame is intended for display.  This
     * option controls how cropping is handled by libavcodec.
     *
     * When set to 1 (the default), libavcodec will apply cropping internally.
     * I.e. it will modify the output frame width/height fields and offset the
     * data pointers (only by as much as possible while preserving alignment, or
     * by the full amount if the AV_CODEC_FLAG_UNALIGNED flag is set) so that
     * the frames output by the decoder refer only to the cropped area. The
     * crop_* fields of the output frames will be zero.
     *
     * When set to 0, the width/height fields of the output frames will be set
     * to the coded dimensions and the crop_* fields will describe the cropping
     * rectangle. Applying the cropping is left to the caller.
     *
     * @warning When hardware acceleration with opaque output frames is used,
     * libavcodec is unable to apply cropping from the top/left border.
     *
     * @note when this option is set to zero, the width/height fields of the
     * AVCodecContext and output AVFrames have different meanings. The codec
     * context fields store display dimensions (with the coded dimensions in
     * coded_width/height), while the frame fields store the coded dimensions
     * (with the display dimensions being determined by the crop_* fields).
     */
    int apply_cropping;

    /*
     * Video decoding only.  Sets the number of extra hardware frames which
     * the decoder will allocate for use by the caller.  This must be set
     * before avcodec_open2() is called.
     *
     * Some hardware decoders require all frames that they will use for
     * output to be defined in advance before decoding starts.  For such
     * decoders, the hardware frame pool must therefore be of a fixed size.
     * The extra frames set here are on top of any number that the decoder
     * needs internally in order to operate normally (for example, frames
     * used as reference pictures).
     */
    int extra_hw_frames;

    /**
     * The percentage of damaged samples to discard a frame.
     *
     * - decoding: set by user
     * - encoding: unused
     */
    int discard_damaged_percentage;

    /**
     * The number of samples per frame to maximally accept.
     *
     * - decoding: set by user
     * - encoding: set by user
     */
    int64_t max_samples;
} AVCodecContext;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
适合fresh man上手 ffmpeg 库。 目录 ------------------------- 目录 第一章 多媒体概念介绍 6 1.1 视频格式 6 1.1.1 常见格式 6 1.2 音频格式 8 1.2.1 常见格式 9 1.2.2 比较 14 1.3 字幕格式 14 1.3.1 外挂字幕与内嵌字幕的阐述 14 1.3.2 外挂字幕视频与内嵌字幕视频的画面比较 15 1.3.3 外挂字幕的三种格式 15 1.4 采集录制和播放渲染 15 1.4.1 视频采集 15 1.4.2 视频录制 16 1.4.3 视频渲染 16 1.5 编解码器 18 1.6 容器和协议 18 1.6.1 容器格式和编码格式 18 1.6.2 协议 24 1.6.2.1 视频协议 25 1.6.2.2 音频协议 25 1.6.2.3 上层通讯协议 25 1.7 常用概念介绍 26 1.7.1 硬解 26 1.7.2 IBP 帧 26 1.7.3 DTS 和PTS 30 1.7.4 分辨率 30 1.7.5 码率 30 1.7.6 帧率 30 1.7.7 RGB 和YUV 30 1.7.8 实时和非实时 30 1.7.9 复合视频和 s-video 31 1.7.10 硬件加速 31 1.7.11 FFmpeg Device 31 第二章 FFmpeg 框架 32 2.1 FFmpeg 概述 32 2.1.1 简介 32 2.1.2 功能 32 2.1.3 模块组成 33 2.1.4 命令集 33 2.2 媒体播放器三大底层框架 35 第三章 编译及简单应用 39 3.1 FFmpeg 库编译和入门介绍 41 39 3.2 流媒体数据流程讲解 40 3.3 简单应用 42 3.4 SDL( Simple Direct Layer) 45 3.4.1 SDL 显示视频 45 3.4.2 SDL 显示音频 46 3.5 ffmpeg 程序的使用(ffmpeg.exe,ffplay.exe,ffprobe.exe) 46 3.5.1 ffmpeg.exe 46 3.5.2 ffplay.exe 46 3.5.3 ffprobe.exe 46 第四章 数据结构 50 4.1 AVCodec 结构体 51 4.2 AVCodecContext 结构体 52 4.3 AVInputFormat 结构体 53 4.4 AVFormatContext 结构体 62 4.5 MovContext 结构体 63 4.6 URLProtocol 结构体 63 4.7 URLContext 结构体 64 4.8 AVIOContext 结构体(老版本为:ByteIOContext) 64 4.9 AVStream 结构体 65 4.10 MOVStreamContext 结 构体 66 4.11 AVPacket 结 构体 67 4.12 AVPacketList 结 构体 67 4.13 AVFrame 结构体 53 第五章 重要模块 68 5.1 libavutil 公共模块 68 1 文件列表 68 2 common.h 文件 68 3 bswap.h 文件 70 4 rational.h 文件 71 5 mathematics.h 文件 71 6 avutil.h 文件 72 5.2 libavcodec 编解码模块 73 1 文件列表 73 2 avcodec.h 文件 74 3 allcodec.c 文件 78 4 dsputil.h 文件 79 5 dsputil.c 文件 79 6 utils_codec.c 文件 80 7 imgconvert_template.h 文件 90 8 imgconvert.c 文件 110 9 msrle.c 文件 152 10 turespeech_data.h 文件 159 11 turespeech.c 文件 162 5.3 libavformat 容器模块 171 1 文件列表 171 2 avformat.h 文件 172 3 allformat.c 文件 177 4 cutils.c 文件 178 5 file.c 文件 179 6 avio.h 文件 182 7 avio.c 文件 184 8 aviobuf.c 文件 188 9 utils_format.c 文件 197 10 avidec.c 文件 208 5.4 libswscale 视频色彩空间转换 230 5.5 libswresample 音频重采样 230 5.6 libavfilter 音视频滤器 230 5.7 libavdevice 设备输入和输出容器 230 5.8 libpostproc 视频后期处理 230 第六章 播放器 230 6.1 视频播放器 230 6.1.1 ffmpeg 库的配置 230 6.1.2 一个简单的视频播放器 231 6.2 音频播放器 234 6.3 一个完整的播放器--ffplay 240 6.3.1 ffplay 流程图 240 6.3.2 ffplay 源码剖析 240 第七章 应用开发 262 7.1 ffmpeg 库的使用:编码 262 第八章 关键函数介绍 267 8.1 avformat_open_input 267 8.2 avcodec_register_all() 268 8.3 av_read_frame() 269 8.4 avcodec_decode_video2() 270 8.5 transcode_init() 270 8.6 transcode() 280 第九章 ffmpeg 相关工程 288 9.1 ffdshow 288 ffdshow 源代码分析 1 : 整体结构 288 ffdshow 源代码分析 2: 位图覆盖滤镜(对话框部分 Dialog) 290 ffdshow 源代码分析 3: 位图覆盖滤镜(设置部分Settings) 297 ffdshow 源代码分析 4: 位图覆盖滤镜(滤镜部分Filter) 301 ffdshow 源代码分析 5: 位图覆盖滤镜(总结) 306 ffdshow 源代码分析 6: 对解码器的 dll 的封装(libavcodec) 306 ffdshow 源代码分析 8: 视频解码器类(TvideoCodecDec) 328 ffdshow 源代码分析 9: 编解码器有关类的总结 335 9.2 LAV filters 340 LAV Filter 源代码分析 1: 总体结构 340 LAV Filter 源代码分析 2: LAV Splitter 341 LAV Filter 源代码分析 3: LAV Video (1) 364 LAV Filter 源代码分析 4: LAV Video (2) 382 9.3 MPlayer 408 9.3.1 Mplayer 支持的格式 408 9.3.2 Mplayer 中头文件的功能分析 408 9.3.3 MPlayer.main 主流程简要说明 408 9.3.4 Mplayer 源码分析 409 第十章 开发实例 416 第十一章 mp4 文件封装协议分析 416 11.1 概述 416 11.2 mp4 的物理结构 416 11.3 数据的组织结构 417 11.4 mp4 的时间结构 417 11.5 文件结构分析 418 11.5.1 File Type Box(ftyp) 418 11.5.2 Movie Box(moov) 418 第十二章 flv 文件格式分析 437 12.1 概述 437 12.2 文件总体结构 437 12.3 文件结构分析 438 12.3.1 flv 文件头的结构 438 12.3.2 body 主体结构 439 附录A:常见问题 444 1 ffmpeg 从内存中读取数据 444 2 MFC 中使用SDL 播放音频没有声音的解决方法 444 附录B:经典代码示例 445 附录 c:ffmpeg 参数中文详细解释 456 附录D:ffplay 的快捷键以及选项 458 附录E: ffmpeg 处理 rtmp 流媒体 459
本书共16章,分为4篇,详细讲解了使用各种软件和平台进行音、视频多媒体编程的技术,以案例为对象展示实现过程、分析技术难点。主要内容包括软件Visual C++2005的开发技术、DirectSound开发音频、DirectShow/VFW开发视频、MMX/SSE进行多媒体汇编编程、DM642 DSP进行音视频算法优化和主流视频算法MPEG-4/H.264的编码原理及工程实践。本书系统地介绍Visual C++ 2005进行流媒体编程的基本思路和方法,采用案例为主的叙述方式,将大量的技术理论融入具体的案例剖析中。采用的案例均来源于作者实际开发工作,具有很好的实用价值,可以帮助读者在开发中进行参考或直接应用。 第1篇 开发基础 1 第1章 数字音视频开发技术基础 3 1.1 数字音视频基本概念 4 1.1.1 数字音频技术基础 4 1.1.2 各种数字音频文件格式基础 4 1.1.3 视频的相关基础概念 8 1.1.4 常见的视频文件格式 8 1.2 数字音视频数据的编解码技术 10 1.2.1 音频数据的编解码 11 1.2.2 视频数据的编解码 13 1.2.3 音视频编码的相关标准 13 1.3 音视频处理平台的选择 15 1.3.1 个人多媒体计算机 15 1.3.2 嵌入式处理器ARM 16 1.3.3 数字媒体处理器DSP 16 1.4 音视频开发的典型应用 16 1.4.1 个人消费类电子产品 16 1.4.2 公共领域的音视频应用 18 1.5 常用音视频开发工具 21 1.5.1 DirectSound音频开发 21 1.5.2 DirectShow视频开发 21 1.5.3 DSP CCS算法开发 22 1.6 本章小结 23 第2章 Visual C++ 2005开发基础 25 2.1 Visual C++ 2005新增特性 26 2.1.1 句柄(Handles) 26 2.1.2 类型的声明 26 2.1.3 对代码编辑的改进 27 2.2 VC能做的事情 27 2.2.1 生成传统的控制台应用程序 27 2.2.2 生成基于MFC的应用程序 32 2.2.3 生成静态链接库 40 2.2.4 生成动态链接库 41 2.3 利用向导完成基本开发 46 2.3.1 生成应用程序 46 2.3.2 生成应用库LIB/DLL 53 2.4 MFC编程基础 56 2.4.1 Windows消息与事件 56 2.4.2 消息与事件的响应 63 2.4.3 常用消息 66 2.5 基于对话框的编程 68 2.5.1 创建和编辑对话框 68 2.5.2 对话框种类 75 2.6 常用控件使用技巧 79 2.6.1 按钮类控件的使用 80 2.6.2 文本可编辑类控件的使用 81 2.6.3 静态类控件的使用 82 2.6.4 其他控件 83 2.7 Visual 2005开发技术资源 84 2.7.1 MSDN在线帮助 84 2.7.2 丰富的网络资源 86 2.8 Visual 2005开发的常见问题 86 2.8.1 如何使用volatile和const_cast 86 2.8.2 如何构造unicode版本的程序 87 2.8.3 如何使用.def文件 87 2.8.4 如何正确编写Win32 DLL 87 2.8.5 如何编写和使用资源DLL 88 2.8.6 如何实现对话框的数据交换 88 2.9 本章小结 89 第2篇 音频开发 91 第3章 DirectSound开发基础 93 3.1 Microsoft DirectSound SDK 94 3.1.1 比较DirectSound与DirectMusic 94 3.1.2 DirectSound SDK能做什么 95 3.1.3 如何获取DirectSound SDK 96 3.1.4 DirectSound SDK的基本结构 98 3.1.5 Directsound SDK安装 100 3.1.6 选择最适合用户的DirectSound SDK 100 3.1.7 用DirectSound进行编程的必要步骤 102 3.2 DirectSound的详细使用方法 103 3.2.1 DirectSound设备对象 104 3.2.2 DirectSound缓冲区对象 107 3.2.3 使用WAV数据 114 3.2.4 使用音效 116 3.3 开发环境配置 118 3.3.1 Visual C++基本开发环境配置 119 3.3.2 DirectSound应用程序的开发环境配置 119 3.3.3 DirectSound Filter开发环境配置 121 3.4 调试音频处理程序 125 3.4.1 Visual C++调试器 125 3.4.2 DirectSound中常用的调试技术 128 3.5 DirectSound开发的常见问题 130 3.6 本章小结 131 第4章 打造自己的音频播放器 133 4.1 系统设计和分析 134 4.2 缓冲区和通知基础 135 4.2.1 缓冲区的概念 135 4.2.2 缓冲区的通知 136 4.3 播放文件 137 4.3.1 创建DirectSound对象 137 4.3.2 创建播放缓冲区 138 4.3.3 调用方法播放声音 145 4.3.4 结束播放 146 4.4 系统效果演示 146 4.4.1 新建基于对话框的程序框架 147 4.4.2 添加控件及变量 147 4.4.3 封装CDirectSound类实现DirectSound声音播放 148 4.4.4 与对话框界面相关操作实现 156 4.4.5 程序运行结果 159 4.5 DirectSound开发常见问题 160 4.6 本章小结 161 第5章 语音3D特效器制作 163 5.1 系统设计和分析 164 5.2 DirectSound 3D缓冲区 164 5.2.1 获取3D缓冲区对象 165 5.2.2 最大距离和最小距离 166 5.2.3 处理模式 167 5.2.4 声音圆锥 167 5.3 DirectSound 3D虚拟听众 168 5.3.1 获得3D听众 168 5.3.2 听众的空间参数 169 5.3.3 距离因子与Doppler效应 171 5.3.4 滚降因子与延迟设置 173 5.4 系统效果演示 174 5.4.1 具体的实现步骤 174 5.4.2 程序的实现代码 176 5.4.3 程序运行结果 186 5.5 DirectSound 3D开发常见问题 187 5.6 本章小结 188 第6章 对拾音设备录制自己的语音文件 189 6.1 系统分析和设计 190 6.2 管理捕获缓冲区 191 6.2.1 创建捕获缓冲区 191 6.2.2 启动缓冲区 197 6.2.3 封锁缓冲区 197 6.2.4 解锁缓冲区 198 6.2.5 中止捕获 199 6.3 系统效果演示 199 6.3.1 声音类的封装 199 6.3.2 声音管理函数的实现 202 6.3.3 程序运行结果 214 6.4 DirectSound录制语音文件开发常见问题 215 6.5 本章小结 216 第3篇 视频开发 217 第7章 DirectShow开发基础 219 7.1 Microsoft DirectShow SDK 220 7.1.1 DirectX及成员组成 220 7.1.2 DirectShow SDK能做什么 221 7.1.3 如何获取DirectShow SDK 221 7.1.4 安装Direshow SDK 222 7.2 开发环境配置 224 7.2.1 生成DirectShow SDK开发库 224 7.2.2 Visual C++开发环境配置 229 7.2.3 常见问题解析集锦 232 7.3 DirectShow SDK基本架构 234 7.3.1 DirectShow SDK总体架构 234 7.3.2 DirectShow SDK简单应用程序案例 236 7.3.3 滤波器链表Filer Graph及各种组件 244 7.3.4 构建滤波器链表(Building Filer Graph) 252 7.3.5 滤波器链表中的数据流动Data Flow 257 7.3.6 DirectShow中的事件通知机制 261 7.3.7 常用DirectShow SDK接口 267 7.4 DirectShow SDK常用开发案例 267 7.4.1 通用开发流程 268 7.4.2 系统初始化 268 7.4.3 媒体播放方法 268 7.4.4 消息处理方法 270 7.4.5 视频采集技术 271 7.4.6 音频采集案例 282 7.5 本章小结 293 第8章 打造自己的媒体播放器 295 8.1 系统分析与设计 296 8.1.1 FilterGraph结构设计 297 8.1.2 GraphEdit模拟实现 297 8.1.3 界面设计 299 8.2 实现媒体控制类 307 8.2.1 CDXGraph类初始化 308 8.2.2 创建Graph滤波器链表 309 8.2.3 图像窗口设计 311 8.2.4 媒体播放控制 312 8.2.5 全屏显示及抓图存盘实现 315 8.3 实现一个简单的媒体播放器 317 8.4 升级你的播放器 321 8.4.1 添加控制功能 321 8.4.2 添加拖放功能 325 8.4.3 添加音量调节功能 326 8.4.4 添加欢迎背景图片 328 8.5 系统效果展示 328 8.6 如何播放更多的文件格式 329 8.7 本章小结 330 第9章 自制DV实现视频采集 331 9.1 系统分析与设计 332 9.1.1 采集设备的枚举 332 9.1.2 使用Capture Graph Builder 335 9.1.3 采集参数的设置 336 9.2 使用经典采集技术实现视频捕获 338 9.2.1 GraphEdit模拟实现 338 9.2.2 视频捕获类CCaptureClass的实现 340 9.2.3 界面设计 345 9.3 使用VMR技术实现视频图像捕获 350 9.3.1 VMR技术基础 350 9.3.2 GraphEdit模拟实现视频捕获预览 350 9.3.3 视频图像捕获类CVMR_Capture的实现 353 9.3.4 界面设计 361 9.4 系统效果演示 366 9.4.1 实例一 系统效果演示 367 9.4.2 实例二 系统效果演示 368 9.5 本章小结 369 第10章 VFW技术实现视频处理通用平台 371 10.1 VFW开发技术流程分析 372 10.1.1 技术概述 372 10.1.2 VFW采集开发流程图 373 10.2 使用VFW实现视频捕获和预览 373 10.2.1 建立单文档应用程序 373 10.2.2 创建视频窗口 375 10.2.3 设计回调函数 376 10.2.4 视频图像显示设置 378 10.2.5 捕获预览视频 379 10.2.6 配置视频格式及图像参数 381 10.3 使用系统插件实现视频编解码 382 10.3.1 使用系统视频编解码插件 383 10.3.2 视频编码码流写AVI文件 385 10.3.3 关闭平台 387 10.4 使用XviD CODEC算法实现视频编解码 388 10.4.1 生成XviD算法静态库(编译过程) 388 10.4.2 实现XviD CODEC视频编码算法函数 389 10.4.3 实现XviD CODEC视频解码算法函数 393 10.4.4 使用XviD CODEC编解码算法 395 10.5 平台应用效果展示 398 10.6 本章小结 399 第4篇 编解码技术 401 第11章 纵览音视频编解码技术 403 11.1 数字音视频基础 404 11.2 音视频编解码及方法 406 11.2.1 音频编码方法 406 11.2.2 视频编码方法 410 11.3 编解码技术标准 417 11.3.1 静态图像编码标准 418 11.3.2 MPEG-4/H.264视频算法 424 11.3.3 AVS国产视频编码标准 430 11.4 编解码产业及发展 431 11.4.1 编解码资源一览 431 11.4.2 编解码发展前景 432 11.5 本章小结 433 第12章 使用MMX/SSE 2进行多媒体编程 435 12.1 MMX/SSE 2技术基础 436 12.2 MMX/SSE 2指令剖析 439 12.2.1 MMX媒体扩展指令 439 12.2.2 MMX程序设计 444 12.2.3 SSE/SSE 2媒体扩展指令 455 12.2.4 SSE程序设计详细解析 457 12.3 使用MMX/SSE 2进行音视频开发 463 12.3.1 开发前技术准备 464 12.3.2 MMX/SSE 2视频编解码编程 465 12.3.3 使用VC调试MMX/SSE 2程序 470 12.4 MMX/SSE 2开发常见问题 472 12.4.1 制订计划 472 12.4.2 哪部分代码可使用MMX技术改进 473 12.4.3 代码是浮点型还是整型 473 12.4.4 EMMS准则 474 12.4.5 CPUID的检测MMX技术的用法 474 12.4.6 数据对齐 474 12.4.7 数据安排 475 12.4.8 应用程序最后的调整 476 12.5 本章小结 476 第13章 用DM642实现视频编解码技术 477 13.1 数字媒体处理器TMS320DM642DSP概述 478 13.2 DSP软件开发环境CCS 481 13.2.1 安装CCS 481 13.2.2 CCS主要部件 482 13.2.3 使用CCS优化工具实现算法优化 488 13.3 用C语言进行视频算法框架编程 492 13.3.1 C编程规则和参考 492 13.3.2 DSP关键字与CMD文件使用 493 13.3.3 算法系统资源剖析 495 13.4 DM642实现视频算法优化 497 13.4.1 并行算法指令和建立软件流水 497 13.4.2 使用intrinsic指令完成核心模块的优化 499 13.4.3 使用DSP线性汇编优化核心模块 500 13.4.4 使用Cache技术实现算法优化 507 13.4.5 使用乒乓式EDMA实现算法优化 508 13.5 DM642优化视频算法常见问题 513 13.6 本章小结 518 第14章 XviD CODEC实现MPEG-4编解码 519 14.1 MPEG-4编解码概述 520 14.1.1 基于对象的MPEG-4视频编码 520 14.1.2 XviD格式文件播放 520 14.2 XviD CODEC编解码分析 521 14.2.1 MPEG-4编解码设计与剖析 521 14.2.2 MMX/SSE 2实现XviD CODEC 549 14.2.3 DM642下XviD CODEC优化 553 14.3 运行XviD CODEC系统 559 14.3.1 YUV原始视频数据及其显示 559 14.3.2 VC平台下编译和运行XviD CODEC 559 14.3.3 CODEC在DSP下软仿真和硬仿真 562 14.4 系统效果展示 562 14.5 本章小结 563 第15章 X264实现H.264/AVC视频编码 565 15.1 H.264/AVC编码概要 566 15.1.1 开源代码工程管理软件 566 15.1.2 获取开源算法工程 566 15.1.3 H.264/AVC新特性 567 15.2 X264视频编码分析 568 15.2.1 H.264/AVC关键技术要点 569 15.2.2 X264视频编码设计与剖析 577 15.2.3 X264核心模块MMX/DSP汇编优化 599 15.3 运行X264编码系统 606 15.3.1 VC平台下编译和运行X264 606 15.3.2 JM验证X264码流 610 15.3.3 ffmpeg中的H.264视频解码 611 15.4 系统效果展示 611 15.4.1 X264实现H.264/AVC视频编码 611 15.4.2 ffmpeg-h264-vc工程实现H.264视频解码 612 15.5 本章小结 613 第16章 打造自己的DVR监控系统 615 16.1 DVR监控系统分析与设计 616 16.1.1 监控系统分类 616 16.1.2 监控系统组成 617 16.1.3 基于压缩板卡的SDK软件开发包 619 16.2 DVR监控系统主界面软件设计 621 16.2.1 对话框应用程序开发 621 16.2.2 位图按钮设计 622 16.3 模拟DVR视频采集 636 16.3.1 基于DirectShow的视频采集回放 636 16.3.2 基于DirectShow的影音文件回放 638 16.4 系统效果展示 643 16.5 本章小结 644 附录A 旧版VC升级到VC 2005程序安全的10点注意事项 645 附录B 开发常见问题 (附源码) 由于文件过大所以本文件采用分卷压缩的,需要安装好压,并下载完全部压缩分卷。共11个分卷。
目录 第一章 多媒体概念介绍 6 1.1视频格式 6 1.1.1常见格式 6 1.2音频格式 9 1.2.1常见格式 9 1.2.2比较 15 1.3字幕格式 15 1.3.1外挂字幕与内嵌字幕的阐述 15 1.3.2外挂字幕视频与内嵌字幕视频的画面比较 15 1.3.3外挂字幕的三种格式 15 1.4采集录制和播放渲染 16 1.4.1视频采集 16 1. 4.2视频录制 17 1.4.3视频渲染 17 1.5编解码器 18 1.6容器和协议 19 1.6.1容器格式和编码格式 19 1.6.2协议 26 1.6.2.1 视频协议 26 1.6.2.2 音频协议. 26 1.6.2.3 上层通讯协议 27 1.7常用概念介绍 27 1.7.1硬解 27 1.7.2 IBP帧 28 1.7.3 DTS和PTS 31 1.7.4 分辨率 31 1.7.5 码率 32 1.7.6 帧率 32 1.7.7 RGB和YUV 32 1.7.8 实时和非实时 32 1.7.9 复合视频和s-video 32 1.7.10 硬件加速 32 1.7.11 FFmpeg Device 32 第二章 FFmpeg框架 34 2.1 FFmpeg概述 34 2.1.1简介 34 2.1.2功能 34 2.1.3模块组成 35 2.1.4命令集 35 2.2 媒体播放器三大底层框架 37 第三章 编译及简单应用 41 3.1 FFmpeg库编译和入门介绍 41 41 3.2 流媒体数据流程讲解 49 3.3 简单应用 51 3.4 SDL( Simple Direct Layer) 55 3.4.1 SDL显示视频 55 3.4.2 SDL显示音频 55 3.5 ffmpeg程序的使用(ffmpeg.exe,ffplay.exe,ffprobe.exe) 56 3.5.1 ffmpeg.exe 56 3.5.2 ffplay.exe 56 3.5.3 ffprobe.exe 56 第四章 数据结构 57 4.1 AVCodec结构体 59 4.2 AVCodecContext结构体 59 4.3 AVInputFormat结构体 60 4.4 AVFormatContext结构体 61 4.5 MovContext结构体 62 4.6 URLProtocol结构体 62 4.7 URLContext结构体 63 4.8 AVIOContext结构体(老版本为:ByteIOContext) 63 4.9 AVStream结构体 64 4.10 MOVStreamContext 结构体 65 4.11 AVPacket 结构体 66 4.12 AVPacketList 结构体 67 4.13 AVFrame结构体 67 第五章 重要模块 76 5.1 libavutil公共模块 76 1 文件列表 76 2 common.h 文件 76 3 bswap.h 文件 78 4 rational.h 文件 79 5 mathematics.h 文件 80 6 avutil.h 文件 80 5.2 libavcodec编解码模块 82 1 文件列表 82 2 avcodec.h 文件 82 3 allcodec.c 文件 87 4 dsputil.h 文件 87 5 dsputil.c 文件 88 6 utils_codec.c 文件 88 7 imgconvert_template.h 文件 99 8 imgconvert.c 文件 121 9 msrle.c 文件 164 10 turespeech_data.h 文件 171 11 turespeech.c 文件 174 5.3 libavformat容器模块 184 1 文件列表 184 2 avformat.h 文件 184 3 allformat.c 文件 190 4 cutils.c 文件 190 5 file.c 文件 192 6 avio.h 文件 194 7 avio.c 文件 196 8 aviobuf.c 文件 200 9 utils_format.c 文件 209 10 avidec.c 文件 220 5.4 libswscale视频色彩空间转换 243 5.5 libswresample音频重采样 243 5.6 libavfilter音视频滤器 243 5.7 libavdevice设备输入和输出容器 243 5.8 libpostproc视频后期处理 243 第六章 播放器 243 6.1 视频播放器 243 6.1.1 ffmpeg库的配置 243 6.1.2 一个简单的视频播放器 244 6.2 音频播放器 247 6.3 一个完整的播放器--ffplay 253 6.3.1 ffplay流程图 253 6.3.2 ffplay源码剖析 254 第七章 应用开发 275 7.1 ffmpeg库的使用:编码 275 第八章 关键函数介绍 280 8.1 avformat_open_input 280 8.2 avcodec_register_all() 281 8.3 av_read_frame() 283 8.4 avcodec_decode_video2() 283 8.5 transcode_init() 283 8.6 transcode() 294 第九章 ffmpeg相关工程 301 9.1 ffdshow 301 ffdshow 源代码分析1 : 整体结构 302 ffdshow 源代码分析 2: 位图覆盖滤镜(对话框部分Dialog) 304 ffdshow 源代码分析 3: 位图覆盖滤镜(设置部分Settings) 312 ffdshow 源代码分析 4: 位图覆盖滤镜(滤镜部分Filter) 317 ffdshow 源代码分析 5: 位图覆盖滤镜(总结) 322 ffdshow 源代码分析 6: 对解码器的dll的封装(libavcodec) 322 ffdshow 源代码分析 8: 视频解码器类(TvideoCodecDec) 344 ffdshow 源代码分析 9: 编解码器有关类的总结 352 9.2 LAV filters 357 LAV Filter 源代码分析 1: 总体结构 357 LAV Filter 源代码分析 2: LAV Splitter 358 LAV Filter 源代码分析 3: LAV Video (1) 382 LAV Filter 源代码分析 4: LAV Video (2) 400 9.3 MPlayer 427 9.3.1 Mplayer支持的格式 427 9.3.2 Mplayer 中头文件的功能分析 427 9.3.3 MPlayer.main 主流程简要说明 428 9.3.4 Mplayer源码分析 429 第十章 开发实例 436 第十一章 mp4文件封装协议分析 436 11.1 概述 436 11.2 mp4的物理结构 436 11.3 数据的组织结构 437 11.4 mp4的时间结构 437 11.5 文件结构分析 438 11.5.1 File Type Box(ftyp) 438 11.5.2 Movie Box(moov) 438 第十二章 flv 文件格式分析 457 12.1 概述 457 12.2 文件总体结构 457 12.3 文件结构分析 458 12.3.1 flv文件头的结构 458 12.3.2 body主体结构 459 附录A:常见问题 465 1 ffmpeg 从内存中读取数据 465 2 MFC中使用SDL播放音频没有声音的解决方法 465 附录B:经典代码示例 466 附录C:ffmpeg参数中文详细解释 477 附录D:ffplay的快捷键以及选项 479 附录E: ffmpeg处理rtmp流媒体 481
实现了一个视频网站的上传视频、播放视频、个人主页、订阅、评论、通知等基本功能。 MySQL 是一款广受欢迎的开源关系型数据库管理系统(RDBMS),由瑞典MySQL AB公司开发,现隶属于美国甲骨文公司(Oracle)。自1998年首次发布以来,MySQL以其卓越的性能、可靠性和可扩展性,成为全球范围内Web应用程序、企业级解决方案以及其他各种数据处理场景的首选数据库平台之一。 以下是对MySQL数据库的详细介绍: 核心特性与优势 开源与跨平台 MySQL遵循GPL开源协议,这意味着任何人都可以免费下载、使用和修改其源代码。这种开放性促进了广泛的社区支持和第三方插件、工具的发展。此外,MySQL支持多种操作系统,包括Windows、Linux、macOS、Solaris等,确保了其在不同环境下的兼容性和部署灵活性。 关系型模型与SQL支持 MySQL基于关系型数据库模型,数据以表格形式组织,并通过预定义的键(如主键、外键)在表之间建立关联。它完全支持结构化查询语言(SQL),允许用户进行数据查询、插入、更新、删除、创建和管理数据库结构等操作。SQL标准的广泛支持使得MySQL易于学习,且与其他关系型数据库系统有良好的互操作性。 存储引擎 MySQL支持多种存储引擎,如InnoDB、MyISAM、MEMORY等,每种引擎都有特定的优势和适用场景。例如,InnoDB提供事务安全、行级锁定和外键约束,适合处理高并发事务性的应用;MyISAM则更侧重于读取密集型操作,提供全文索引支持,适用于读多写少的场景。这种多引擎架构使得MySQL能够适应不同业务需求,提供高度定制化的存储解决方案。 性能与可扩展性 MySQL通过高效的缓存机制、查询优化器以及对硬件资源的有效利用,保证了在高负载情况下的稳定性和快速响应。它支持水平扩展(如通过分片、复制等技术)和垂直扩展(如增加硬件资源),以应对大规模数据存储和高并发访问的需求。 安全性与管理工具 MySQL提供了一系列安全措施,如用户账户管理、访问权限控制、SSL/TLS加密连接、审计日志等功能,确保数据的安全性和合规性。同时,MySQL附带了一系列管理工具,如MySQL Server、MySQL Workbench、MySQL Shell等,便于用户进行数据库配置、监控、备份、恢复、迁移等工作。 社区与生态系统 MySQL拥有庞大的开发者社区和丰富的第三方插件、库、中间件支持,提供了丰富的文档、教程、论坛以及专业服务,极大地简化了开发、运维和故障排查过程。 关键组件与日志 系统数据库 MySQL内部包含几个特殊的系统数据库,如: information_schema:提供关于所有数据库、表、列、索引等元数据信息,是查询数据库结构的标准接口。 mysql:存储MySQL自身的系统信息,如用户权限、服务器配置、事件调度等。 performance_schema:自MySQL 5.5版本引入,用于收集服务器性能数据,帮助诊断和优化系统性能。 test(非必要):默认提供的测试数据库,通常用于学习和实验,生产环境中可考虑删除。 sys(自MySQL 5.7版本):提供更易用的视图来访问performance_schema中的信息,简化性能分析工作。
本书共16章,分为4篇,详细讲解了使用各种软件和平台进行音、视频多媒体编程的技术,以案例为对象展示实现过程、分析技术难点。主要内容包括软件Visual C++2005的开发技术、DirectSound开发音频、DirectShow/VFW开发视频、MMX/SSE进行多媒体汇编编程、DM642 DSP进行音视频算法优化和主流视频算法MPEG-4/H.264的编码原理及工程实践。本书系统地介绍Visual C++ 2005进行流媒体编程的基本思路和方法,采用案例为主的叙述方式,将大量的技术理论融入具体的案例剖析中。采用的案例均来源于作者实际开发工作,具有很好的实用价值,可以帮助读者在开发中进行参考或直接应用。 第1篇 开发基础 1 第1章 数字音视频开发技术基础 3 1.1 数字音视频基本概念 4 1.1.1 数字音频技术基础 4 1.1.2 各种数字音频文件格式基础 4 1.1.3 视频的相关基础概念 8 1.1.4 常见的视频文件格式 8 1.2 数字音视频数据的编解码技术 10 1.2.1 音频数据的编解码 11 1.2.2 视频数据的编解码 13 1.2.3 音视频编码的相关标准 13 1.3 音视频处理平台的选择 15 1.3.1 个人多媒体计算机 15 1.3.2 嵌入式处理器ARM 16 1.3.3 数字媒体处理器DSP 16 1.4 音视频开发的典型应用 16 1.4.1 个人消费类电子产品 16 1.4.2 公共领域的音视频应用 18 1.5 常用音视频开发工具 21 1.5.1 DirectSound音频开发 21 1.5.2 DirectShow视频开发 21 1.5.3 DSP CCS算法开发 22 1.6 本章小结 23 第2章 Visual C++ 2005开发基础 25 2.1 Visual C++ 2005新增特性 26 2.1.1 句柄(Handles) 26 2.1.2 类型的声明 26 2.1.3 对代码编辑的改进 27 2.2 VC能做的事情 27 2.2.1 生成传统的控制台应用程序 27 2.2.2 生成基于MFC的应用程序 32 2.2.3 生成静态链接库 40 2.2.4 生成动态链接库 41 2.3 利用向导完成基本开发 46 2.3.1 生成应用程序 46 2.3.2 生成应用库LIB/DLL 53 2.4 MFC编程基础 56 2.4.1 Windows消息与事件 56 2.4.2 消息与事件的响应 63 2.4.3 常用消息 66 2.5 基于对话框的编程 68 2.5.1 创建和编辑对话框 68 2.5.2 对话框种类 75 2.6 常用控件使用技巧 79 2.6.1 按钮类控件的使用 80 2.6.2 文本可编辑类控件的使用 81 2.6.3 静态类控件的使用 82 2.6.4 其他控件 83 2.7 Visual 2005开发技术资源 84 2.7.1 MSDN在线帮助 84 2.7.2 丰富的网络资源 86 2.8 Visual 2005开发的常见问题 86 2.8.1 如何使用volatile和const_cast 86 2.8.2 如何构造unicode版本的程序 87 2.8.3 如何使用.def文件 87 2.8.4 如何正确编写Win32 DLL 87 2.8.5 如何编写和使用资源DLL 88 2.8.6 如何实现对话框的数据交换 88 2.9 本章小结 89 第2篇 音频开发 91 第3章 DirectSound开发基础 93 3.1 Microsoft DirectSound SDK 94 3.1.1 比较DirectSound与DirectMusic 94 3.1.2 DirectSound SDK能做什么 95 3.1.3 如何获取DirectSound SDK 96 3.1.4 DirectSound SDK的基本结构 98 3.1.5 Directsound SDK安装 100 3.1.6 选择最适合用户的DirectSound SDK 100 3.1.7 用DirectSound进行编程的必要步骤 102 3.2 DirectSound的详细使用方法 103 3.2.1 DirectSound设备对象 104 3.2.2 DirectSound缓冲区对象 107 3.2.3 使用WAV数据 114 3.2.4 使用音效 116 3.3 开发环境配置 118 3.3.1 Visual C++基本开发环境配置 119 3.3.2 DirectSound应用程序的开发环境配置 119 3.3.3 DirectSound Filter开发环境配置 121 3.4 调试音频处理程序 125 3.4.1 Visual C++调试器 125 3.4.2 DirectSound中常用的调试技术 128 3.5 DirectSound开发的常见问题 130 3.6 本章小结 131 第4章 打造自己的音频播放器 133 4.1 系统设计和分析 134 4.2 缓冲区和通知基础 135 4.2.1 缓冲区的概念 135 4.2.2 缓冲区的通知 136 4.3 播放文件 137 4.3.1 创建DirectSound对象 137 4.3.2 创建播放缓冲区 138 4.3.3 调用方法播放声音 145 4.3.4 结束播放 146 4.4 系统效果演示 146 4.4.1 新建基于对话框的程序框架 147 4.4.2 添加控件及变量 147 4.4.3 封装CDirectSound类实现DirectSound声音播放 148 4.4.4 与对话框界面相关操作实现 156 4.4.5 程序运行结果 159 4.5 DirectSound开发常见问题 160 4.6 本章小结 161 第5章 语音3D特效器制作 163 5.1 系统设计和分析 164 5.2 DirectSound 3D缓冲区 164 5.2.1 获取3D缓冲区对象 165 5.2.2 最大距离和最小距离 166 5.2.3 处理模式 167 5.2.4 声音圆锥 167 5.3 DirectSound 3D虚拟听众 168 5.3.1 获得3D听众 168 5.3.2 听众的空间参数 169 5.3.3 距离因子与Doppler效应 171 5.3.4 滚降因子与延迟设置 173 5.4 系统效果演示 174 5.4.1 具体的实现步骤 174 5.4.2 程序的实现代码 176 5.4.3 程序运行结果 186 5.5 DirectSound 3D开发常见问题 187 5.6 本章小结 188 第6章 对拾音设备录制自己的语音文件 189 6.1 系统分析和设计 190 6.2 管理捕获缓冲区 191 6.2.1 创建捕获缓冲区 191 6.2.2 启动缓冲区 197 6.2.3 封锁缓冲区 197 6.2.4 解锁缓冲区 198 6.2.5 中止捕获 199 6.3 系统效果演示 199 6.3.1 声音类的封装 199 6.3.2 声音管理函数的实现 202 6.3.3 程序运行结果 214 6.4 DirectSound录制语音文件开发常见问题 215 6.5 本章小结 216 第3篇 视频开发 217 第7章 DirectShow开发基础 219 7.1 Microsoft DirectShow SDK 220 7.1.1 DirectX及成员组成 220 7.1.2 DirectShow SDK能做什么 221 7.1.3 如何获取DirectShow SDK 221 7.1.4 安装Direshow SDK 222 7.2 开发环境配置 224 7.2.1 生成DirectShow SDK开发库 224 7.2.2 Visual C++开发环境配置 229 7.2.3 常见问题解析集锦 232 7.3 DirectShow SDK基本架构 234 7.3.1 DirectShow SDK总体架构 234 7.3.2 DirectShow SDK简单应用程序案例 236 7.3.3 滤波器链表Filer Graph及各种组件 244 7.3.4 构建滤波器链表(Building Filer Graph) 252 7.3.5 滤波器链表中的数据流动Data Flow 257 7.3.6 DirectShow中的事件通知机制 261 7.3.7 常用DirectShow SDK接口 267 7.4 DirectShow SDK常用开发案例 267 7.4.1 通用开发流程 268 7.4.2 系统初始化 268 7.4.3 媒体播放方法 268 7.4.4 消息处理方法 270 7.4.5 视频采集技术 271 7.4.6 音频采集案例 282 7.5 本章小结 293 第8章 打造自己的媒体播放器 295 8.1 系统分析与设计 296 8.1.1 FilterGraph结构设计 297 8.1.2 GraphEdit模拟实现 297 8.1.3 界面设计 299 8.2 实现媒体控制类 307 8.2.1 CDXGraph类初始化 308 8.2.2 创建Graph滤波器链表 309 8.2.3 图像窗口设计 311 8.2.4 媒体播放控制 312 8.2.5 全屏显示及抓图存盘实现 315 8.3 实现一个简单的媒体播放器 317 8.4 升级你的播放器 321 8.4.1 添加控制功能 321 8.4.2 添加拖放功能 325 8.4.3 添加音量调节功能 326 8.4.4 添加欢迎背景图片 328 8.5 系统效果展示 328 8.6 如何播放更多的文件格式 329 8.7 本章小结 330 第9章 自制DV实现视频采集 331 9.1 系统分析与设计 332 9.1.1 采集设备的枚举 332 9.1.2 使用Capture Graph Builder 335 9.1.3 采集参数的设置 336 9.2 使用经典采集技术实现视频捕获 338 9.2.1 GraphEdit模拟实现 338 9.2.2 视频捕获类CCaptureClass的实现 340 9.2.3 界面设计 345 9.3 使用VMR技术实现视频图像捕获 350 9.3.1 VMR技术基础 350 9.3.2 GraphEdit模拟实现视频捕获预览 350 9.3.3 视频图像捕获类CVMR_Capture的实现 353 9.3.4 界面设计 361 9.4 系统效果演示 366 9.4.1 实例一 系统效果演示 367 9.4.2 实例二 系统效果演示 368 9.5 本章小结 369 第10章 VFW技术实现视频处理通用平台 371 10.1 VFW开发技术流程分析 372 10.1.1 技术概述 372 10.1.2 VFW采集开发流程图 373 10.2 使用VFW实现视频捕获和预览 373 10.2.1 建立单文档应用程序 373 10.2.2 创建视频窗口 375 10.2.3 设计回调函数 376 10.2.4 视频图像显示设置 378 10.2.5 捕获预览视频 379 10.2.6 配置视频格式及图像参数 381 10.3 使用系统插件实现视频编解码 382 10.3.1 使用系统视频编解码插件 383 10.3.2 视频编码码流写AVI文件 385 10.3.3 关闭平台 387 10.4 使用XviD CODEC算法实现视频编解码 388 10.4.1 生成XviD算法静态库(编译过程) 388 10.4.2 实现XviD CODEC视频编码算法函数 389 10.4.3 实现XviD CODEC视频解码算法函数 393 10.4.4 使用XviD CODEC编解码算法 395 10.5 平台应用效果展示 398 10.6 本章小结 399 第4篇 编解码技术 401 第11章 纵览音视频编解码技术 403 11.1 数字音视频基础 404 11.2 音视频编解码及方法 406 11.2.1 音频编码方法 406 11.2.2 视频编码方法 410 11.3 编解码技术标准 417 11.3.1 静态图像编码标准 418 11.3.2 MPEG-4/H.264视频算法 424 11.3.3 AVS国产视频编码标准 430 11.4 编解码产业及发展 431 11.4.1 编解码资源一览 431 11.4.2 编解码发展前景 432 11.5 本章小结 433 第12章 使用MMX/SSE 2进行多媒体编程 435 12.1 MMX/SSE 2技术基础 436 12.2 MMX/SSE 2指令剖析 439 12.2.1 MMX媒体扩展指令 439 12.2.2 MMX程序设计 444 12.2.3 SSE/SSE 2媒体扩展指令 455 12.2.4 SSE程序设计详细解析 457 12.3 使用MMX/SSE 2进行音视频开发 463 12.3.1 开发前技术准备 464 12.3.2 MMX/SSE 2视频编解码编程 465 12.3.3 使用VC调试MMX/SSE 2程序 470 12.4 MMX/SSE 2开发常见问题 472 12.4.1 制订计划 472 12.4.2 哪部分代码可使用MMX技术改进 473 12.4.3 代码是浮点型还是整型 473 12.4.4 EMMS准则 474 12.4.5 CPUID的检测MMX技术的用法 474 12.4.6 数据对齐 474 12.4.7 数据安排 475 12.4.8 应用程序最后的调整 476 12.5 本章小结 476 第13章 用DM642实现视频编解码技术 477 13.1 数字媒体处理器TMS320DM642DSP概述 478 13.2 DSP软件开发环境CCS 481 13.2.1 安装CCS 481 13.2.2 CCS主要部件 482 13.2.3 使用CCS优化工具实现算法优化 488 13.3 用C语言进行视频算法框架编程 492 13.3.1 C编程规则和参考 492 13.3.2 DSP关键字与CMD文件使用 493 13.3.3 算法系统资源剖析 495 13.4 DM642实现视频算法优化 497 13.4.1 并行算法指令和建立软件流水 497 13.4.2 使用intrinsic指令完成核心模块的优化 499 13.4.3 使用DSP线性汇编优化核心模块 500 13.4.4 使用Cache技术实现算法优化 507 13.4.5 使用乒乓式EDMA实现算法优化 508 13.5 DM642优化视频算法常见问题 513 13.6 本章小结 518 第14章 XviD CODEC实现MPEG-4编解码 519 14.1 MPEG-4编解码概述 520 14.1.1 基于对象的MPEG-4视频编码 520 14.1.2 XviD格式文件播放 520 14.2 XviD CODEC编解码分析 521 14.2.1 MPEG-4编解码设计与剖析 521 14.2.2 MMX/SSE 2实现XviD CODEC 549 14.2.3 DM642下XviD CODEC优化 553 14.3 运行XviD CODEC系统 559 14.3.1 YUV原始视频数据及其显示 559 14.3.2 VC平台下编译和运行XviD CODEC 559 14.3.3 CODEC在DSP下软仿真和硬仿真 562 14.4 系统效果展示 562 14.5 本章小结 563 第15章 X264实现H.264/AVC视频编码 565 15.1 H.264/AVC编码概要 566 15.1.1 开源代码工程管理软件 566 15.1.2 获取开源算法工程 566 15.1.3 H.264/AVC新特性 567 15.2 X264视频编码分析 568 15.2.1 H.264/AVC关键技术要点 569 15.2.2 X264视频编码设计与剖析 577 15.2.3 X264核心模块MMX/DSP汇编优化 599 15.3 运行X264编码系统 606 15.3.1 VC平台下编译和运行X264 606 15.3.2 JM验证X264码流 610 15.3.3 ffmpeg中的H.264视频解码 611 15.4 系统效果展示 611 15.4.1 X264实现H.264/AVC视频编码 611 15.4.2 ffmpeg-h264-vc工程实现H.264视频解码 612 15.5 本章小结 613 第16章 打造自己的DVR监控系统 615 16.1 DVR监控系统分析与设计 616 16.1.1 监控系统分类 616 16.1.2 监控系统组成 617 16.1.3 基于压缩板卡的SDK软件开发包 619 16.2 DVR监控系统主界面软件设计 621 16.2.1 对话框应用程序开发 621 16.2.2 位图按钮设计 622 16.3 模拟DVR视频采集 636 16.3.1 基于DirectShow的视频采集回放 636 16.3.2 基于DirectShow的影音文件回放 638 16.4 系统效果展示 643 16.5 本章小结 644 附录A 旧版VC升级到VC 2005程序安全的10点注意事项 645 附录B 开发常见问题 (附源码) 由于文件过大所以本文件采用分卷压缩的,需要安装好压,并下载完全部压缩分卷。共12个分卷。
本书共16章,分为4篇,详细讲解了使用各种软件和平台进行音、视频多媒体编程的技术,以案例为对象展示实现过程、分析技术难点。主要内容包括软件Visual C++2005的开发技术、DirectSound开发音频、DirectShow/VFW开发视频、MMX/SSE进行多媒体汇编编程、DM642 DSP进行音视频算法优化和主流视频算法MPEG-4/H.264的编码原理及工程实践。本书系统地介绍Visual C++ 2005进行流媒体编程的基本思路和方法,采用案例为主的叙述方式,将大量的技术理论融入具体的案例剖析中。采用的案例均来源于作者实际开发工作,具有很好的实用价值,可以帮助读者在开发中进行参考或直接应用。 第1篇 开发基础 1 第1章 数字音视频开发技术基础 3 1.1 数字音视频基本概念 4 1.1.1 数字音频技术基础 4 1.1.2 各种数字音频文件格式基础 4 1.1.3 视频的相关基础概念 8 1.1.4 常见的视频文件格式 8 1.2 数字音视频数据的编解码技术 10 1.2.1 音频数据的编解码 11 1.2.2 视频数据的编解码 13 1.2.3 音视频编码的相关标准 13 1.3 音视频处理平台的选择 15 1.3.1 个人多媒体计算机 15 1.3.2 嵌入式处理器ARM 16 1.3.3 数字媒体处理器DSP 16 1.4 音视频开发的典型应用 16 1.4.1 个人消费类电子产品 16 1.4.2 公共领域的音视频应用 18 1.5 常用音视频开发工具 21 1.5.1 DirectSound音频开发 21 1.5.2 DirectShow视频开发 21 1.5.3 DSP CCS算法开发 22 1.6 本章小结 23 第2章 Visual C++ 2005开发基础 25 2.1 Visual C++ 2005新增特性 26 2.1.1 句柄(Handles) 26 2.1.2 类型的声明 26 2.1.3 对代码编辑的改进 27 2.2 VC能做的事情 27 2.2.1 生成传统的控制台应用程序 27 2.2.2 生成基于MFC的应用程序 32 2.2.3 生成静态链接库 40 2.2.4 生成动态链接库 41 2.3 利用向导完成基本开发 46 2.3.1 生成应用程序 46 2.3.2 生成应用库LIB/DLL 53 2.4 MFC编程基础 56 2.4.1 Windows消息与事件 56 2.4.2 消息与事件的响应 63 2.4.3 常用消息 66 2.5 基于对话框的编程 68 2.5.1 创建和编辑对话框 68 2.5.2 对话框种类 75 2.6 常用控件使用技巧 79 2.6.1 按钮类控件的使用 80 2.6.2 文本可编辑类控件的使用 81 2.6.3 静态类控件的使用 82 2.6.4 其他控件 83 2.7 Visual 2005开发技术资源 84 2.7.1 MSDN在线帮助 84 2.7.2 丰富的网络资源 86 2.8 Visual 2005开发的常见问题 86 2.8.1 如何使用volatile和const_cast 86 2.8.2 如何构造unicode版本的程序 87 2.8.3 如何使用.def文件 87 2.8.4 如何正确编写Win32 DLL 87 2.8.5 如何编写和使用资源DLL 88 2.8.6 如何实现对话框的数据交换 88 2.9 本章小结 89 第2篇 音频开发 91 第3章 DirectSound开发基础 93 3.1 Microsoft DirectSound SDK 94 3.1.1 比较DirectSound与DirectMusic 94 3.1.2 DirectSound SDK能做什么 95 3.1.3 如何获取DirectSound SDK 96 3.1.4 DirectSound SDK的基本结构 98 3.1.5 Directsound SDK安装 100 3.1.6 选择最适合用户的DirectSound SDK 100 3.1.7 用DirectSound进行编程的必要步骤 102 3.2 DirectSound的详细使用方法 103 3.2.1 DirectSound设备对象 104 3.2.2 DirectSound缓冲区对象 107 3.2.3 使用WAV数据 114 3.2.4 使用音效 116 3.3 开发环境配置 118 3.3.1 Visual C++基本开发环境配置 119 3.3.2 DirectSound应用程序的开发环境配置 119 3.3.3 DirectSound Filter开发环境配置 121 3.4 调试音频处理程序 125 3.4.1 Visual C++调试器 125 3.4.2 DirectSound中常用的调试技术 128 3.5 DirectSound开发的常见问题 130 3.6 本章小结 131 第4章 打造自己的音频播放器 133 4.1 系统设计和分析 134 4.2 缓冲区和通知基础 135 4.2.1 缓冲区的概念 135 4.2.2 缓冲区的通知 136 4.3 播放文件 137 4.3.1 创建DirectSound对象 137 4.3.2 创建播放缓冲区 138 4.3.3 调用方法播放声音 145 4.3.4 结束播放 146 4.4 系统效果演示 146 4.4.1 新建基于对话框的程序框架 147 4.4.2 添加控件及变量 147 4.4.3 封装CDirectSound类实现DirectSound声音播放 148 4.4.4 与对话框界面相关操作实现 156 4.4.5 程序运行结果 159 4.5 DirectSound开发常见问题 160 4.6 本章小结 161 第5章 语音3D特效器制作 163 5.1 系统设计和分析 164 5.2 DirectSound 3D缓冲区 164 5.2.1 获取3D缓冲区对象 165 5.2.2 最大距离和最小距离 166 5.2.3 处理模式 167 5.2.4 声音圆锥 167 5.3 DirectSound 3D虚拟听众 168 5.3.1 获得3D听众 168 5.3.2 听众的空间参数 169 5.3.3 距离因子与Doppler效应 171 5.3.4 滚降因子与延迟设置 173 5.4 系统效果演示 174 5.4.1 具体的实现步骤 174 5.4.2 程序的实现代码 176 5.4.3 程序运行结果 186 5.5 DirectSound 3D开发常见问题 187 5.6 本章小结 188 第6章 对拾音设备录制自己的语音文件 189 6.1 系统分析和设计 190 6.2 管理捕获缓冲区 191 6.2.1 创建捕获缓冲区 191 6.2.2 启动缓冲区 197 6.2.3 封锁缓冲区 197 6.2.4 解锁缓冲区 198 6.2.5 中止捕获 199 6.3 系统效果演示 199 6.3.1 声音类的封装 199 6.3.2 声音管理函数的实现 202 6.3.3 程序运行结果 214 6.4 DirectSound录制语音文件开发常见问题 215 6.5 本章小结 216 第3篇 视频开发 217 第7章 DirectShow开发基础 219 7.1 Microsoft DirectShow SDK 220 7.1.1 DirectX及成员组成 220 7.1.2 DirectShow SDK能做什么 221 7.1.3 如何获取DirectShow SDK 221 7.1.4 安装Direshow SDK 222 7.2 开发环境配置 224 7.2.1 生成DirectShow SDK开发库 224 7.2.2 Visual C++开发环境配置 229 7.2.3 常见问题解析集锦 232 7.3 DirectShow SDK基本架构 234 7.3.1 DirectShow SDK总体架构 234 7.3.2 DirectShow SDK简单应用程序案例 236 7.3.3 滤波器链表Filer Graph及各种组件 244 7.3.4 构建滤波器链表(Building Filer Graph) 252 7.3.5 滤波器链表中的数据流动Data Flow 257 7.3.6 DirectShow中的事件通知机制 261 7.3.7 常用DirectShow SDK接口 267 7.4 DirectShow SDK常用开发案例 267 7.4.1 通用开发流程 268 7.4.2 系统初始化 268 7.4.3 媒体播放方法 268 7.4.4 消息处理方法 270 7.4.5 视频采集技术 271 7.4.6 音频采集案例 282 7.5 本章小结 293 第8章 打造自己的媒体播放器 295 8.1 系统分析与设计 296 8.1.1 FilterGraph结构设计 297 8.1.2 GraphEdit模拟实现 297 8.1.3 界面设计 299 8.2 实现媒体控制类 307 8.2.1 CDXGraph类初始化 308 8.2.2 创建Graph滤波器链表 309 8.2.3 图像窗口设计 311 8.2.4 媒体播放控制 312 8.2.5 全屏显示及抓图存盘实现 315 8.3 实现一个简单的媒体播放器 317 8.4 升级你的播放器 321 8.4.1 添加控制功能 321 8.4.2 添加拖放功能 325 8.4.3 添加音量调节功能 326 8.4.4 添加欢迎背景图片 328 8.5 系统效果展示 328 8.6 如何播放更多的文件格式 329 8.7 本章小结 330 第9章 自制DV实现视频采集 331 9.1 系统分析与设计 332 9.1.1 采集设备的枚举 332 9.1.2 使用Capture Graph Builder 335 9.1.3 采集参数的设置 336 9.2 使用经典采集技术实现视频捕获 338 9.2.1 GraphEdit模拟实现 338 9.2.2 视频捕获类CCaptureClass的实现 340 9.2.3 界面设计 345 9.3 使用VMR技术实现视频图像捕获 350 9.3.1 VMR技术基础 350 9.3.2 GraphEdit模拟实现视频捕获预览 350 9.3.3 视频图像捕获类CVMR_Capture的实现 353 9.3.4 界面设计 361 9.4 系统效果演示 366 9.4.1 实例一 系统效果演示 367 9.4.2 实例二 系统效果演示 368 9.5 本章小结 369 第10章 VFW技术实现视频处理通用平台 371 10.1 VFW开发技术流程分析 372 10.1.1 技术概述 372 10.1.2 VFW采集开发流程图 373 10.2 使用VFW实现视频捕获和预览 373 10.2.1 建立单文档应用程序 373 10.2.2 创建视频窗口 375 10.2.3 设计回调函数 376 10.2.4 视频图像显示设置 378 10.2.5 捕获预览视频 379 10.2.6 配置视频格式及图像参数 381 10.3 使用系统插件实现视频编解码 382 10.3.1 使用系统视频编解码插件 383 10.3.2 视频编码码流写AVI文件 385 10.3.3 关闭平台 387 10.4 使用XviD CODEC算法实现视频编解码 388 10.4.1 生成XviD算法静态库(编译过程) 388 10.4.2 实现XviD CODEC视频编码算法函数 389 10.4.3 实现XviD CODEC视频解码算法函数 393 10.4.4 使用XviD CODEC编解码算法 395 10.5 平台应用效果展示 398 10.6 本章小结 399 第4篇 编解码技术 401 第11章 纵览音视频编解码技术 403 11.1 数字音视频基础 404 11.2 音视频编解码及方法 406 11.2.1 音频编码方法 406 11.2.2 视频编码方法 410 11.3 编解码技术标准 417 11.3.1 静态图像编码标准 418 11.3.2 MPEG-4/H.264视频算法 424 11.3.3 AVS国产视频编码标准 430 11.4 编解码产业及发展 431 11.4.1 编解码资源一览 431 11.4.2 编解码发展前景 432 11.5 本章小结 433 第12章 使用MMX/SSE 2进行多媒体编程 435 12.1 MMX/SSE 2技术基础 436 12.2 MMX/SSE 2指令剖析 439 12.2.1 MMX媒体扩展指令 439 12.2.2 MMX程序设计 444 12.2.3 SSE/SSE 2媒体扩展指令 455 12.2.4 SSE程序设计详细解析 457 12.3 使用MMX/SSE 2进行音视频开发 463 12.3.1 开发前技术准备 464 12.3.2 MMX/SSE 2视频编解码编程 465 12.3.3 使用VC调试MMX/SSE 2程序 470 12.4 MMX/SSE 2开发常见问题 472 12.4.1 制订计划 472 12.4.2 哪部分代码可使用MMX技术改进 473 12.4.3 代码是浮点型还是整型 473 12.4.4 EMMS准则 474 12.4.5 CPUID的检测MMX技术的用法 474 12.4.6 数据对齐 474 12.4.7 数据安排 475 12.4.8 应用程序最后的调整 476 12.5 本章小结 476 第13章 用DM642实现视频编解码技术 477 13.1 数字媒体处理器TMS320DM642DSP概述 478 13.2 DSP软件开发环境CCS 481 13.2.1 安装CCS 481 13.2.2 CCS主要部件 482 13.2.3 使用CCS优化工具实现算法优化 488 13.3 用C语言进行视频算法框架编程 492 13.3.1 C编程规则和参考 492 13.3.2 DSP关键字与CMD文件使用 493 13.3.3 算法系统资源剖析 495 13.4 DM642实现视频算法优化 497 13.4.1 并行算法指令和建立软件流水 497 13.4.2 使用intrinsic指令完成核心模块的优化 499 13.4.3 使用DSP线性汇编优化核心模块 500 13.4.4 使用Cache技术实现算法优化 507 13.4.5 使用乒乓式EDMA实现算法优化 508 13.5 DM642优化视频算法常见问题 513 13.6 本章小结 518 第14章 XviD CODEC实现MPEG-4编解码 519 14.1 MPEG-4编解码概述 520 14.1.1 基于对象的MPEG-4视频编码 520 14.1.2 XviD格式文件播放 520 14.2 XviD CODEC编解码分析 521 14.2.1 MPEG-4编解码设计与剖析 521 14.2.2 MMX/SSE 2实现XviD CODEC 549 14.2.3 DM642下XviD CODEC优化 553 14.3 运行XviD CODEC系统 559 14.3.1 YUV原始视频数据及其显示 559 14.3.2 VC平台下编译和运行XviD CODEC 559 14.3.3 CODEC在DSP下软仿真和硬仿真 562 14.4 系统效果展示 562 14.5 本章小结 563 第15章 X264实现H.264/AVC视频编码 565 15.1 H.264/AVC编码概要 566 15.1.1 开源代码工程管理软件 566 15.1.2 获取开源算法工程 566 15.1.3 H.264/AVC新特性 567 15.2 X264视频编码分析 568 15.2.1 H.264/AVC关键技术要点 569 15.2.2 X264视频编码设计与剖析 577 15.2.3 X264核心模块MMX/DSP汇编优化 599 15.3 运行X264编码系统 606 15.3.1 VC平台下编译和运行X264 606 15.3.2 JM验证X264码流 610 15.3.3 ffmpeg中的H.264视频解码 611 15.4 系统效果展示 611 15.4.1 X264实现H.264/AVC视频编码 611 15.4.2 ffmpeg-h264-vc工程实现H.264视频解码 612 15.5 本章小结 613 第16章 打造自己的DVR监控系统 615 16.1 DVR监控系统分析与设计 616 16.1.1 监控系统分类 616 16.1.2 监控系统组成 617 16.1.3 基于压缩板卡的SDK软件开发包 619 16.2 DVR监控系统主界面软件设计 621 16.2.1 对话框应用程序开发 621 16.2.2 位图按钮设计 622 16.3 模拟DVR视频采集 636 16.3.1 基于DirectShow的视频采集回放 636 16.3.2 基于DirectShow的影音文件回放 638 16.4 系统效果展示 643 16.5 本章小结 644 附录A 旧版VC升级到VC 2005程序安全的10点注意事项 645 附录B 开发常见问题 (附源码) 由于文件过大所以本文件采用分卷压缩的,需要安装好压,并下载完全部压缩分卷。共12个分卷
本书共16章,分为4篇,详细讲解了使用各种软件和平台进行音、视频多媒体编程的技术,以案例为对象展示实现过程、分析技术难点。主要内容包括软件Visual C++2005的开发技术、DirectSound开发音频、DirectShow/VFW开发视频、MMX/SSE进行多媒体汇编编程、DM642 DSP进行音视频算法优化和主流视频算法MPEG-4/H.264的编码原理及工程实践。本书系统地介绍Visual C++ 2005进行流媒体编程的基本思路和方法,采用案例为主的叙述方式,将大量的技术理论融入具体的案例剖析中。采用的案例均来源于作者实际开发工作,具有很好的实用价值,可以帮助读者在开发中进行参考或直接应用。 第1篇 开发基础 1 第1章 数字音视频开发技术基础 3 1.1 数字音视频基本概念 4 1.1.1 数字音频技术基础 4 1.1.2 各种数字音频文件格式基础 4 1.1.3 视频的相关基础概念 8 1.1.4 常见的视频文件格式 8 1.2 数字音视频数据的编解码技术 10 1.2.1 音频数据的编解码 11 1.2.2 视频数据的编解码 13 1.2.3 音视频编码的相关标准 13 1.3 音视频处理平台的选择 15 1.3.1 个人多媒体计算机 15 1.3.2 嵌入式处理器ARM 16 1.3.3 数字媒体处理器DSP 16 1.4 音视频开发的典型应用 16 1.4.1 个人消费类电子产品 16 1.4.2 公共领域的音视频应用 18 1.5 常用音视频开发工具 21 1.5.1 DirectSound音频开发 21 1.5.2 DirectShow视频开发 21 1.5.3 DSP CCS算法开发 22 1.6 本章小结 23 第2章 Visual C++ 2005开发基础 25 2.1 Visual C++ 2005新增特性 26 2.1.1 句柄(Handles) 26 2.1.2 类型的声明 26 2.1.3 对代码编辑的改进 27 2.2 VC能做的事情 27 2.2.1 生成传统的控制台应用程序 27 2.2.2 生成基于MFC的应用程序 32 2.2.3 生成静态链接库 40 2.2.4 生成动态链接库 41 2.3 利用向导完成基本开发 46 2.3.1 生成应用程序 46 2.3.2 生成应用库LIB/DLL 53 2.4 MFC编程基础 56 2.4.1 Windows消息与事件 56 2.4.2 消息与事件的响应 63 2.4.3 常用消息 66 2.5 基于对话框的编程 68 2.5.1 创建和编辑对话框 68 2.5.2 对话框种类 75 2.6 常用控件使用技巧 79 2.6.1 按钮类控件的使用 80 2.6.2 文本可编辑类控件的使用 81 2.6.3 静态类控件的使用 82 2.6.4 其他控件 83 2.7 Visual 2005开发技术资源 84 2.7.1 MSDN在线帮助 84 2.7.2 丰富的网络资源 86 2.8 Visual 2005开发的常见问题 86 2.8.1 如何使用volatile和const_cast 86 2.8.2 如何构造unicode版本的程序 87 2.8.3 如何使用.def文件 87 2.8.4 如何正确编写Win32 DLL 87 2.8.5 如何编写和使用资源DLL 88 2.8.6 如何实现对话框的数据交换 88 2.9 本章小结 89 第2篇 音频开发 91 第3章 DirectSound开发基础 93 3.1 Microsoft DirectSound SDK 94 3.1.1 比较DirectSound与DirectMusic 94 3.1.2 DirectSound SDK能做什么 95 3.1.3 如何获取DirectSound SDK 96 3.1.4 DirectSound SDK的基本结构 98 3.1.5 Directsound SDK安装 100 3.1.6 选择最适合用户的DirectSound SDK 100 3.1.7 用DirectSound进行编程的必要步骤 102 3.2 DirectSound的详细使用方法 103 3.2.1 DirectSound设备对象 104 3.2.2 DirectSound缓冲区对象 107 3.2.3 使用WAV数据 114 3.2.4 使用音效 116 3.3 开发环境配置 118 3.3.1 Visual C++基本开发环境配置 119 3.3.2 DirectSound应用程序的开发环境配置 119 3.3.3 DirectSound Filter开发环境配置 121 3.4 调试音频处理程序 125 3.4.1 Visual C++调试器 125 3.4.2 DirectSound中常用的调试技术 128 3.5 DirectSound开发的常见问题 130 3.6 本章小结 131 第4章 打造自己的音频播放器 133 4.1 系统设计和分析 134 4.2 缓冲区和通知基础 135 4.2.1 缓冲区的概念 135 4.2.2 缓冲区的通知 136 4.3 播放文件 137 4.3.1 创建DirectSound对象 137 4.3.2 创建播放缓冲区 138 4.3.3 调用方法播放声音 145 4.3.4 结束播放 146 4.4 系统效果演示 146 4.4.1 新建基于对话框的程序框架 147 4.4.2 添加控件及变量 147 4.4.3 封装CDirectSound类实现DirectSound声音播放 148 4.4.4 与对话框界面相关操作实现 156 4.4.5 程序运行结果 159 4.5 DirectSound开发常见问题 160 4.6 本章小结 161 第5章 语音3D特效器制作 163 5.1 系统设计和分析 164 5.2 DirectSound 3D缓冲区 164 5.2.1 获取3D缓冲区对象 165 5.2.2 最大距离和最小距离 166 5.2.3 处理模式 167 5.2.4 声音圆锥 167 5.3 DirectSound 3D虚拟听众 168 5.3.1 获得3D听众 168 5.3.2 听众的空间参数 169 5.3.3 距离因子与Doppler效应 171 5.3.4 滚降因子与延迟设置 173 5.4 系统效果演示 174 5.4.1 具体的实现步骤 174 5.4.2 程序的实现代码 176 5.4.3 程序运行结果 186 5.5 DirectSound 3D开发常见问题 187 5.6 本章小结 188 第6章 对拾音设备录制自己的语音文件 189 6.1 系统分析和设计 190 6.2 管理捕获缓冲区 191 6.2.1 创建捕获缓冲区 191 6.2.2 启动缓冲区 197 6.2.3 封锁缓冲区 197 6.2.4 解锁缓冲区 198 6.2.5 中止捕获 199 6.3 系统效果演示 199 6.3.1 声音类的封装 199 6.3.2 声音管理函数的实现 202 6.3.3 程序运行结果 214 6.4 DirectSound录制语音文件开发常见问题 215 6.5 本章小结 216 第3篇 视频开发 217 第7章 DirectShow开发基础 219 7.1 Microsoft DirectShow SDK 220 7.1.1 DirectX及成员组成 220 7.1.2 DirectShow SDK能做什么 221 7.1.3 如何获取DirectShow SDK 221 7.1.4 安装Direshow SDK 222 7.2 开发环境配置 224 7.2.1 生成DirectShow SDK开发库 224 7.2.2 Visual C++开发环境配置 229 7.2.3 常见问题解析集锦 232 7.3 DirectShow SDK基本架构 234 7.3.1 DirectShow SDK总体架构 234 7.3.2 DirectShow SDK简单应用程序案例 236 7.3.3 滤波器链表Filer Graph及各种组件 244 7.3.4 构建滤波器链表(Building Filer Graph) 252 7.3.5 滤波器链表中的数据流动Data Flow 257 7.3.6 DirectShow中的事件通知机制 261 7.3.7 常用DirectShow SDK接口 267 7.4 DirectShow SDK常用开发案例 267 7.4.1 通用开发流程 268 7.4.2 系统初始化 268 7.4.3 媒体播放方法 268 7.4.4 消息处理方法 270 7.4.5 视频采集技术 271 7.4.6 音频采集案例 282 7.5 本章小结 293 第8章 打造自己的媒体播放器 295 8.1 系统分析与设计 296 8.1.1 FilterGraph结构设计 297 8.1.2 GraphEdit模拟实现 297 8.1.3 界面设计 299 8.2 实现媒体控制类 307 8.2.1 CDXGraph类初始化 308 8.2.2 创建Graph滤波器链表 309 8.2.3 图像窗口设计 311 8.2.4 媒体播放控制 312 8.2.5 全屏显示及抓图存盘实现 315 8.3 实现一个简单的媒体播放器 317 8.4 升级你的播放器 321 8.4.1 添加控制功能 321 8.4.2 添加拖放功能 325 8.4.3 添加音量调节功能 326 8.4.4 添加欢迎背景图片 328 8.5 系统效果展示 328 8.6 如何播放更多的文件格式 329 8.7 本章小结 330 第9章 自制DV实现视频采集 331 9.1 系统分析与设计 332 9.1.1 采集设备的枚举 332 9.1.2 使用Capture Graph Builder 335 9.1.3 采集参数的设置 336 9.2 使用经典采集技术实现视频捕获 338 9.2.1 GraphEdit模拟实现 338 9.2.2 视频捕获类CCaptureClass的实现 340 9.2.3 界面设计 345 9.3 使用VMR技术实现视频图像捕获 350 9.3.1 VMR技术基础 350 9.3.2 GraphEdit模拟实现视频捕获预览 350 9.3.3 视频图像捕获类CVMR_Capture的实现 353 9.3.4 界面设计 361 9.4 系统效果演示 366 9.4.1 实例一 系统效果演示 367 9.4.2 实例二 系统效果演示 368 9.5 本章小结 369 第10章 VFW技术实现视频处理通用平台 371 10.1 VFW开发技术流程分析 372 10.1.1 技术概述 372 10.1.2 VFW采集开发流程图 373 10.2 使用VFW实现视频捕获和预览 373 10.2.1 建立单文档应用程序 373 10.2.2 创建视频窗口 375 10.2.3 设计回调函数 376 10.2.4 视频图像显示设置 378 10.2.5 捕获预览视频 379 10.2.6 配置视频格式及图像参数 381 10.3 使用系统插件实现视频编解码 382 10.3.1 使用系统视频编解码插件 383 10.3.2 视频编码码流写AVI文件 385 10.3.3 关闭平台 387 10.4 使用XviD CODEC算法实现视频编解码 388 10.4.1 生成XviD算法静态库(编译过程) 388 10.4.2 实现XviD CODEC视频编码算法函数 389 10.4.3 实现XviD CODEC视频解码算法函数 393 10.4.4 使用XviD CODEC编解码算法 395 10.5 平台应用效果展示 398 10.6 本章小结 399 第4篇 编解码技术 401 第11章 纵览音视频编解码技术 403 11.1 数字音视频基础 404 11.2 音视频编解码及方法 406 11.2.1 音频编码方法 406 11.2.2 视频编码方法 410 11.3 编解码技术标准 417 11.3.1 静态图像编码标准 418 11.3.2 MPEG-4/H.264视频算法 424 11.3.3 AVS国产视频编码标准 430 11.4 编解码产业及发展 431 11.4.1 编解码资源一览 431 11.4.2 编解码发展前景 432 11.5 本章小结 433 第12章 使用MMX/SSE 2进行多媒体编程 435 12.1 MMX/SSE 2技术基础 436 12.2 MMX/SSE 2指令剖析 439 12.2.1 MMX媒体扩展指令 439 12.2.2 MMX程序设计 444 12.2.3 SSE/SSE 2媒体扩展指令 455 12.2.4 SSE程序设计详细解析 457 12.3 使用MMX/SSE 2进行音视频开发 463 12.3.1 开发前技术准备 464 12.3.2 MMX/SSE 2视频编解码编程 465 12.3.3 使用VC调试MMX/SSE 2程序 470 12.4 MMX/SSE 2开发常见问题 472 12.4.1 制订计划 472 12.4.2 哪部分代码可使用MMX技术改进 473 12.4.3 代码是浮点型还是整型 473 12.4.4 EMMS准则 474 12.4.5 CPUID的检测MMX技术的用法 474 12.4.6 数据对齐 474 12.4.7 数据安排 475 12.4.8 应用程序最后的调整 476 12.5 本章小结 476 第13章 用DM642实现视频编解码技术 477 13.1 数字媒体处理器TMS320DM642DSP概述 478 13.2 DSP软件开发环境CCS 481 13.2.1 安装CCS 481 13.2.2 CCS主要部件 482 13.2.3 使用CCS优化工具实现算法优化 488 13.3 用C语言进行视频算法框架编程 492 13.3.1 C编程规则和参考 492 13.3.2 DSP关键字与CMD文件使用 493 13.3.3 算法系统资源剖析 495 13.4 DM642实现视频算法优化 497 13.4.1 并行算法指令和建立软件流水 497 13.4.2 使用intrinsic指令完成核心模块的优化 499 13.4.3 使用DSP线性汇编优化核心模块 500 13.4.4 使用Cache技术实现算法优化 507 13.4.5 使用乒乓式EDMA实现算法优化 508 13.5 DM642优化视频算法常见问题 513 13.6 本章小结 518 第14章 XviD CODEC实现MPEG-4编解码 519 14.1 MPEG-4编解码概述 520 14.1.1 基于对象的MPEG-4视频编码 520 14.1.2 XviD格式文件播放 520 14.2 XviD CODEC编解码分析 521 14.2.1 MPEG-4编解码设计与剖析 521 14.2.2 MMX/SSE 2实现XviD CODEC 549 14.2.3 DM642下XviD CODEC优化 553 14.3 运行XviD CODEC系统 559 14.3.1 YUV原始视频数据及其显示 559 14.3.2 VC平台下编译和运行XviD CODEC 559 14.3.3 CODEC在DSP下软仿真和硬仿真 562 14.4 系统效果展示 562 14.5 本章小结 563 第15章 X264实现H.264/AVC视频编码 565 15.1 H.264/AVC编码概要 566 15.1.1 开源代码工程管理软件 566 15.1.2 获取开源算法工程 566 15.1.3 H.264/AVC新特性 567 15.2 X264视频编码分析 568 15.2.1 H.264/AVC关键技术要点 569 15.2.2 X264视频编码设计与剖析 577 15.2.3 X264核心模块MMX/DSP汇编优化 599 15.3 运行X264编码系统 606 15.3.1 VC平台下编译和运行X264 606 15.3.2 JM验证X264码流 610 15.3.3 ffmpeg中的H.264视频解码 611 15.4 系统效果展示 611 15.4.1 X264实现H.264/AVC视频编码 611 15.4.2 ffmpeg-h264-vc工程实现H.264视频解码 612 15.5 本章小结 613 第16章 打造自己的DVR监控系统 615 16.1 DVR监控系统分析与设计 616 16.1.1 监控系统分类 616 16.1.2 监控系统组成 617 16.1.3 基于压缩板卡的SDK软件开发包 619 16.2 DVR监控系统主界面软件设计 621 16.2.1 对话框应用程序开发 621 16.2.2 位图按钮设计 622 16.3 模拟DVR视频采集 636 16.3.1 基于DirectShow的视频采集回放 636 16.3.2 基于DirectShow的影音文件回放 638 16.4 系统效果展示 643 16.5 本章小结 644 附录A 旧版VC升级到VC 2005程序安全的10点注意事项 645 附录B 开发常见问题 (附源码) 由于文件过大所以本文件采用分卷压缩的,需要安装好压,并下载完全部压缩分卷。共11个分卷。
本书共16章,分为4篇,详细讲解了使用各种软件和平台进行音、视频多媒体编程的技术,以案例为对象展示实现过程、分析技术难点。主要内容包括软件Visual C++2005的开发技术、DirectSound开发音频、DirectShow/VFW开发视频、MMX/SSE进行多媒体汇编编程、DM642 DSP进行音视频算法优化和主流视频算法MPEG-4/H.264的编码原理及工程实践。本书系统地介绍Visual C++ 2005进行流媒体编程的基本思路和方法,采用案例为主的叙述方式,将大量的技术理论融入具体的案例剖析中。采用的案例均来源于作者实际开发工作,具有很好的实用价值,可以帮助读者在开发中进行参考或直接应用。 第1篇 开发基础 1 第1章 数字音视频开发技术基础 3 1.1 数字音视频基本概念 4 1.1.1 数字音频技术基础 4 1.1.2 各种数字音频文件格式基础 4 1.1.3 视频的相关基础概念 8 1.1.4 常见的视频文件格式 8 1.2 数字音视频数据的编解码技术 10 1.2.1 音频数据的编解码 11 1.2.2 视频数据的编解码 13 1.2.3 音视频编码的相关标准 13 1.3 音视频处理平台的选择 15 1.3.1 个人多媒体计算机 15 1.3.2 嵌入式处理器ARM 16 1.3.3 数字媒体处理器DSP 16 1.4 音视频开发的典型应用 16 1.4.1 个人消费类电子产品 16 1.4.2 公共领域的音视频应用 18 1.5 常用音视频开发工具 21 1.5.1 DirectSound音频开发 21 1.5.2 DirectShow视频开发 21 1.5.3 DSP CCS算法开发 22 1.6 本章小结 23 第2章 Visual C++ 2005开发基础 25 2.1 Visual C++ 2005新增特性 26 2.1.1 句柄(Handles) 26 2.1.2 类型的声明 26 2.1.3 对代码编辑的改进 27 2.2 VC能做的事情 27 2.2.1 生成传统的控制台应用程序 27 2.2.2 生成基于MFC的应用程序 32 2.2.3 生成静态链接库 40 2.2.4 生成动态链接库 41 2.3 利用向导完成基本开发 46 2.3.1 生成应用程序 46 2.3.2 生成应用库LIB/DLL 53 2.4 MFC编程基础 56 2.4.1 Windows消息与事件 56 2.4.2 消息与事件的响应 63 2.4.3 常用消息 66 2.5 基于对话框的编程 68 2.5.1 创建和编辑对话框 68 2.5.2 对话框种类 75 2.6 常用控件使用技巧 79 2.6.1 按钮类控件的使用 80 2.6.2 文本可编辑类控件的使用 81 2.6.3 静态类控件的使用 82 2.6.4 其他控件 83 2.7 Visual 2005开发技术资源 84 2.7.1 MSDN在线帮助 84 2.7.2 丰富的网络资源 86 2.8 Visual 2005开发的常见问题 86 2.8.1 如何使用volatile和const_cast 86 2.8.2 如何构造unicode版本的程序 87 2.8.3 如何使用.def文件 87 2.8.4 如何正确编写Win32 DLL 87 2.8.5 如何编写和使用资源DLL 88 2.8.6 如何实现对话框的数据交换 88 2.9 本章小结 89 第2篇 音频开发 91 第3章 DirectSound开发基础 93 3.1 Microsoft DirectSound SDK 94 3.1.1 比较DirectSound与DirectMusic 94 3.1.2 DirectSound SDK能做什么 95 3.1.3 如何获取DirectSound SDK 96 3.1.4 DirectSound SDK的基本结构 98 3.1.5 Directsound SDK安装 100 3.1.6 选择最适合用户的DirectSound SDK 100 3.1.7 用DirectSound进行编程的必要步骤 102 3.2 DirectSound的详细使用方法 103 3.2.1 DirectSound设备对象 104 3.2.2 DirectSound缓冲区对象 107 3.2.3 使用WAV数据 114 3.2.4 使用音效 116 3.3 开发环境配置 118 3.3.1 Visual C++基本开发环境配置 119 3.3.2 DirectSound应用程序的开发环境配置 119 3.3.3 DirectSound Filter开发环境配置 121 3.4 调试音频处理程序 125 3.4.1 Visual C++调试器 125 3.4.2 DirectSound中常用的调试技术 128 3.5 DirectSound开发的常见问题 130 3.6 本章小结 131 第4章 打造自己的音频播放器 133 4.1 系统设计和分析 134 4.2 缓冲区和通知基础 135 4.2.1 缓冲区的概念 135 4.2.2 缓冲区的通知 136 4.3 播放文件 137 4.3.1 创建DirectSound对象 137 4.3.2 创建播放缓冲区 138 4.3.3 调用方法播放声音 145 4.3.4 结束播放 146 4.4 系统效果演示 146 4.4.1 新建基于对话框的程序框架 147 4.4.2 添加控件及变量 147 4.4.3 封装CDirectSound类实现DirectSound声音播放 148 4.4.4 与对话框界面相关操作实现 156 4.4.5 程序运行结果 159 4.5 DirectSound开发常见问题 160 4.6 本章小结 161 第5章 语音3D特效器制作 163 5.1 系统设计和分析 164 5.2 DirectSound 3D缓冲区 164 5.2.1 获取3D缓冲区对象 165 5.2.2 最大距离和最小距离 166 5.2.3 处理模式 167 5.2.4 声音圆锥 167 5.3 DirectSound 3D虚拟听众 168 5.3.1 获得3D听众 168 5.3.2 听众的空间参数 169 5.3.3 距离因子与Doppler效应 171 5.3.4 滚降因子与延迟设置 173 5.4 系统效果演示 174 5.4.1 具体的实现步骤 174 5.4.2 程序的实现代码 176 5.4.3 程序运行结果 186 5.5 DirectSound 3D开发常见问题 187 5.6 本章小结 188 第6章 对拾音设备录制自己的语音文件 189 6.1 系统分析和设计 190 6.2 管理捕获缓冲区 191 6.2.1 创建捕获缓冲区 191 6.2.2 启动缓冲区 197 6.2.3 封锁缓冲区 197 6.2.4 解锁缓冲区 198 6.2.5 中止捕获 199 6.3 系统效果演示 199 6.3.1 声音类的封装 199 6.3.2 声音管理函数的实现 202 6.3.3 程序运行结果 214 6.4 DirectSound录制语音文件开发常见问题 215 6.5 本章小结 216 第3篇 视频开发 217 第7章 DirectShow开发基础 219 7.1 Microsoft DirectShow SDK 220 7.1.1 DirectX及成员组成 220 7.1.2 DirectShow SDK能做什么 221 7.1.3 如何获取DirectShow SDK 221 7.1.4 安装Direshow SDK 222 7.2 开发环境配置 224 7.2.1 生成DirectShow SDK开发库 224 7.2.2 Visual C++开发环境配置 229 7.2.3 常见问题解析集锦 232 7.3 DirectShow SDK基本架构 234 7.3.1 DirectShow SDK总体架构 234 7.3.2 DirectShow SDK简单应用程序案例 236 7.3.3 滤波器链表Filer Graph及各种组件 244 7.3.4 构建滤波器链表(Building Filer Graph) 252 7.3.5 滤波器链表中的数据流动Data Flow 257 7.3.6 DirectShow中的事件通知机制 261 7.3.7 常用DirectShow SDK接口 267 7.4 DirectShow SDK常用开发案例 267 7.4.1 通用开发流程 268 7.4.2 系统初始化 268 7.4.3 媒体播放方法 268 7.4.4 消息处理方法 270 7.4.5 视频采集技术 271 7.4.6 音频采集案例 282 7.5 本章小结 293 第8章 打造自己的媒体播放器 295 8.1 系统分析与设计 296 8.1.1 FilterGraph结构设计 297 8.1.2 GraphEdit模拟实现 297 8.1.3 界面设计 299 8.2 实现媒体控制类 307 8.2.1 CDXGraph类初始化 308 8.2.2 创建Graph滤波器链表 309 8.2.3 图像窗口设计 311 8.2.4 媒体播放控制 312 8.2.5 全屏显示及抓图存盘实现 315 8.3 实现一个简单的媒体播放器 317 8.4 升级你的播放器 321 8.4.1 添加控制功能 321 8.4.2 添加拖放功能 325 8.4.3 添加音量调节功能 326 8.4.4 添加欢迎背景图片 328 8.5 系统效果展示 328 8.6 如何播放更多的文件格式 329 8.7 本章小结 330 第9章 自制DV实现视频采集 331 9.1 系统分析与设计 332 9.1.1 采集设备的枚举 332 9.1.2 使用Capture Graph Builder 335 9.1.3 采集参数的设置 336 9.2 使用经典采集技术实现视频捕获 338 9.2.1 GraphEdit模拟实现 338 9.2.2 视频捕获类CCaptureClass的实现 340 9.2.3 界面设计 345 9.3 使用VMR技术实现视频图像捕获 350 9.3.1 VMR技术基础 350 9.3.2 GraphEdit模拟实现视频捕获预览 350 9.3.3 视频图像捕获类CVMR_Capture的实现 353 9.3.4 界面设计 361 9.4 系统效果演示 366 9.4.1 实例一 系统效果演示 367 9.4.2 实例二 系统效果演示 368 9.5 本章小结 369 第10章 VFW技术实现视频处理通用平台 371 10.1 VFW开发技术流程分析 372 10.1.1 技术概述 372 10.1.2 VFW采集开发流程图 373 10.2 使用VFW实现视频捕获和预览 373 10.2.1 建立单文档应用程序 373 10.2.2 创建视频窗口 375 10.2.3 设计回调函数 376 10.2.4 视频图像显示设置 378 10.2.5 捕获预览视频 379 10.2.6 配置视频格式及图像参数 381 10.3 使用系统插件实现视频编解码 382 10.3.1 使用系统视频编解码插件 383 10.3.2 视频编码码流写AVI文件 385 10.3.3 关闭平台 387 10.4 使用XviD CODEC算法实现视频编解码 388 10.4.1 生成XviD算法静态库(编译过程) 388 10.4.2 实现XviD CODEC视频编码算法函数 389 10.4.3 实现XviD CODEC视频解码算法函数 393 10.4.4 使用XviD CODEC编解码算法 395 10.5 平台应用效果展示 398 10.6 本章小结 399 第4篇 编解码技术 401 第11章 纵览音视频编解码技术 403 11.1 数字音视频基础 404 11.2 音视频编解码及方法 406 11.2.1 音频编码方法 406 11.2.2 视频编码方法 410 11.3 编解码技术标准 417 11.3.1 静态图像编码标准 418 11.3.2 MPEG-4/H.264视频算法 424 11.3.3 AVS国产视频编码标准 430 11.4 编解码产业及发展 431 11.4.1 编解码资源一览 431 11.4.2 编解码发展前景 432 11.5 本章小结 433 第12章 使用MMX/SSE 2进行多媒体编程 435 12.1 MMX/SSE 2技术基础 436 12.2 MMX/SSE 2指令剖析 439 12.2.1 MMX媒体扩展指令 439 12.2.2 MMX程序设计 444 12.2.3 SSE/SSE 2媒体扩展指令 455 12.2.4 SSE程序设计详细解析 457 12.3 使用MMX/SSE 2进行音视频开发 463 12.3.1 开发前技术准备 464 12.3.2 MMX/SSE 2视频编解码编程 465 12.3.3 使用VC调试MMX/SSE 2程序 470 12.4 MMX/SSE 2开发常见问题 472 12.4.1 制订计划 472 12.4.2 哪部分代码可使用MMX技术改进 473 12.4.3 代码是浮点型还是整型 473 12.4.4 EMMS准则 474 12.4.5 CPUID的检测MMX技术的用法 474 12.4.6 数据对齐 474 12.4.7 数据安排 475 12.4.8 应用程序最后的调整 476 12.5 本章小结 476 第13章 用DM642实现视频编解码技术 477 13.1 数字媒体处理器TMS320DM642DSP概述 478 13.2 DSP软件开发环境CCS 481 13.2.1 安装CCS 481 13.2.2 CCS主要部件 482 13.2.3 使用CCS优化工具实现算法优化 488 13.3 用C语言进行视频算法框架编程 492 13.3.1 C编程规则和参考 492 13.3.2 DSP关键字与CMD文件使用 493 13.3.3 算法系统资源剖析 495 13.4 DM642实现视频算法优化 497 13.4.1 并行算法指令和建立软件流水 497 13.4.2 使用intrinsic指令完成核心模块的优化 499 13.4.3 使用DSP线性汇编优化核心模块 500 13.4.4 使用Cache技术实现算法优化 507 13.4.5 使用乒乓式EDMA实现算法优化 508 13.5 DM642优化视频算法常见问题 513 13.6 本章小结 518 第14章 XviD CODEC实现MPEG-4编解码 519 14.1 MPEG-4编解码概述 520 14.1.1 基于对象的MPEG-4视频编码 520 14.1.2 XviD格式文件播放 520 14.2 XviD CODEC编解码分析 521 14.2.1 MPEG-4编解码设计与剖析 521 14.2.2 MMX/SSE 2实现XviD CODEC 549 14.2.3 DM642下XviD CODEC优化 553 14.3 运行XviD CODEC系统 559 14.3.1 YUV原始视频数据及其显示 559 14.3.2 VC平台下编译和运行XviD CODEC 559 14.3.3 CODEC在DSP下软仿真和硬仿真 562 14.4 系统效果展示 562 14.5 本章小结 563 第15章 X264实现H.264/AVC视频编码 565 15.1 H.264/AVC编码概要 566 15.1.1 开源代码工程管理软件 566 15.1.2 获取开源算法工程 566 15.1.3 H.264/AVC新特性 567 15.2 X264视频编码分析 568 15.2.1 H.264/AVC关键技术要点 569 15.2.2 X264视频编码设计与剖析 577 15.2.3 X264核心模块MMX/DSP汇编优化 599 15.3 运行X264编码系统 606 15.3.1 VC平台下编译和运行X264 606 15.3.2 JM验证X264码流 610 15.3.3 ffmpeg中的H.264视频解码 611 15.4 系统效果展示 611 15.4.1 X264实现H.264/AVC视频编码 611 15.4.2 ffmpeg-h264-vc工程实现H.264视频解码 612 15.5 本章小结 613 第16章 打造自己的DVR监控系统 615 16.1 DVR监控系统分析与设计 616 16.1.1 监控系统分类 616 16.1.2 监控系统组成 617 16.1.3 基于压缩板卡的SDK软件开发包 619 16.2 DVR监控系统主界面软件设计 621 16.2.1 对话框应用程序开发 621 16.2.2 位图按钮设计 622 16.3 模拟DVR视频采集 636 16.3.1 基于DirectShow的视频采集回放 636 16.3.2 基于DirectShow的影音文件回放 638 16.4 系统效果展示 643 16.5 本章小结 644 附录A 旧版VC升级到VC 2005程序安全的10点注意事项 645 附录B 开发常见问题 (附源码) 由于文件过大所以本文件采用分卷压缩的,需要安装好压,并下载完全部压缩分卷。共12个分卷。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值