• open_input_file函数调用结构图(转)


    open_input_file函数调用结构图(有些重复的函数调用就略掉了,大致是按流程往下的)。

    函数大致说明:

    AVFormatContext *avformat_alloc_context(void);

    函数介绍:
     Allocate an AVFormatContext.
     avformat_free_context() can be used to free the context and everything
     allocated by the framework within it.

    说明:为AVFormatContext分配空间,并设置缺省值,申请的空间用avformat_free_context()释放。

    int av_dict_set(AVDictionary **pm, const char *key, const char *value, int flags);

    函数介绍:
    Set the given entry in *pm, overwriting an existing entry.
     *
     * Note: If AV_DICT_DONT_STRDUP_KEY or AV_DICT_DONT_STRDUP_VAL is set,
     * these arguments will be freed on error.
     *
     * @param pm pointer to a pointer to a dictionary struct. If *pm is NULL
     * a dictionary struct is allocated and put in *pm.
     * @param key entry key to add to *pm (will be av_strduped depending on flags)
     * @param value entry value to add to *pm (will be av_strduped depending on flags).
     *        Passing a NULL value will cause an existing entry to be deleted.
     * @return >= 0 on success otherwise an error code <0


    说明:设置给定的AVDictionary数组,会覆盖已经存在的数据。

    static AVCodec *find_codec_or_die(const char *name, enum AVMediaType type, int encoder)

    函数说明:寻找编码器,找不到就退出程序。

    AVDictionaryEntry *av_dict_get(const AVDictionary *m, const char *key, const AVDictionaryEntry *prev, int flags);

    函数说明:根据key来查找AVDictionaryEntry。

    int avformat_open_input(AVFormatContext **ps, const char *filename, AVInputFormat *fmt, AVDictionary **options);

    函数介绍:
    /**
     * Open an input stream and read the header. The codecs are not opened.
     * The stream must be closed with avformat_close_input().
     *
     * @param ps Pointer to user-supplied AVFormatContext (allocated by avformat_alloc_context).
     *           May be a pointer to NULL, in which case an AVFormatContext is allocated by this
     *           function and written into ps.
     *           Note that a user-supplied AVFormatContext will be freed on failure.
     * @param filename Name of the stream to open.
     * @param fmt If non-NULL, this parameter forces a specific input format.
     *            Otherwise the format is autodetected.
     * @param options  A dictionary filled with AVFormatContext and demuxer-private options.
     *                 On return this parameter will be destroyed and replaced with a dict containing
     *                 options that were not found. May be NULL.
     *
     * @return 0 on success, a negative AVERROR on failure.
     *
     * @note If you want to use custom IO, preallocate the format context and set its pb field.
     */
    说明:打开input流并读取头信息,打开的流必须用avformat_close_input()关闭。

    static AVCodec *choose_decoder(OptionsContext *o, AVFormatContext *s, AVStream *st)

    函数说明:先调用MATCH_PER_STREAM_OPT匹配出codec_names若成功匹配,则调用find_codec_or_die查找解码器,若不成功则调用avcodec_find_decoder查找解码器。

    AVDictionary **setup_find_stream_info_opts(AVFormatContext *s, AVDictionary *codec_opts);

    函数介绍:
    /**
     * Setup AVCodecContext options for avformat_find_stream_info().
     *
     * Create an array of dictionaries, one dictionary for each stream
     * contained in s.
     * Each dictionary will contain the options from codec_opts which can
     * be applied to the corresponding stream codec context.
     *
     * @return pointer to the created array of dictionaries, NULL if it
     * cannot be created
     */
    说明:为avformat_find_stream_info函数创建AVDictionary**。

    int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options);

    函数介绍:
    /**
     * Read packets of a media file to get stream information. This
     * is useful for file formats with no headers such as MPEG. This
     * function also computes the real framerate in case of MPEG-2 repeat
     * frame mode.
     * The logical file position is not changed by this function;
     * examined packets may be buffered for later processing.
     *
     * @param ic media file handle
     * @param options  If non-NULL, an ic.nb_streams long array of pointers to
     *                 dictionaries, where i-th member contains options for
     *                 codec corresponding to i-th stream.
     *                 On return each dictionary will be filled with options that were not found.
     * @return >=0 if OK, AVERROR_xxx on error
     *
     * @note this function isn't guaranteed to open all the codecs, so
     *       options being non-empty at return is a perfectly normal behavior.
     *
     * @todo Let the user decide somehow what information is needed so that
     *       we do not waste time getting stuff the user does not need.
     */
    说明:读取media的packets来获取stram info,可用于读取没有头的MPEG文件信息,也可以计算MPEG-2 repeat frame mode的实际framerate。

    static void add_input_streams(OptionsContext *o, AVFormatContext *ic)

    函数介绍:
    /* Add all the streams from the given input file to the global
     * list of input streams. */
    说明:把给定的输入文件中的流加入全局输入流list里去。可以从函数调用图里看到,此函数用流的数目来做循环。

    void av_dump_format(AVFormatContext *ic, int index, const char *url,  int is_output);

    函数介绍:
    /**
     * Print detailed information about the input or output format, such as
     * duration, bitrate, streams, container, programs, metadata, side data,
     * codec and time base.
     *
     * @param ic        the context to analyze
     * @param index     index of the stream to dump information about
     * @param url       the URL to print, such as source or destination file
     * @param is_output Select whether the specified context is an input(0) or output(1)
     */
    说明:打印信息,如:duration, bitrate, streams, container, programs, metadata, side data, codec and time base。

    static AVDictionary *strip_specifiers(AVDictionary *dict)

    函数介绍:
    /* return a copy of the input with the stream specifiers removed from the keys */
    说明:拷贝dict。
    http://blog.csdn.net/dancing_night/article/details/44962089
     
  • 相关阅读:
    juc线程池原理(六):jdk线程池中的设计模式
    阻塞队列之一:BlockingQueue汇总
    阻塞队列之二:LinkedTransferQueue
    遍历并批量删除容器中元素出现ConcurrentModificationException原因及处置
    Spring 3.1新特性之一:spring注解之@profile
    ThreadPoolExecutor之三:自定义线程池-扩展示例
    守护线程
    cookie跨域问题汇总
    线程组ThreadGroup
    Eclipse中设置JDK、${user}变量
  • 原文地址:https://www.cnblogs.com/xihong2014/p/6707782.html
Copyright © 2020-2023  润新知