• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Khan's Notebook GCC/GNU/Linux Delphi/Window Java/Anywhere

            路漫漫,長修遠,我們不能沒有錢
            隨筆 - 173, 文章 - 0, 評論 - 257, 引用 - 0
            數(shù)據(jù)加載中……

            ffmpeg分析系列之五(打開輸入的文件)

            1. 打開文件:

            if (!fmt || !(fmt->flags & AVFMT_NOFILE)) { 

                
            因 fmt == NULL, 上面成立, 再看下面的代碼:

                    ByteIOContext *pb = NULL; // 字節(jié)IO上下文

                    if ((err=url_fopen(&pb, filename, URL_RDONLY)) < 0) { // 只讀方式打開輸入的文件
                        goto fail;
                    }
                    if (buf_size > 0) { // 因 buf_size == 0, 不成立
                        url_setbufsize(pb, buf_size);

                    }


            進入url_fopen函數(shù):

            int url_fopen(ByteIOContext **s, // 輸出參數(shù): 字節(jié)IO上下文
                          const char *filename, // 文件名
                          int flags) // 標(biāo)志
            {
                URLContext *h; // URL(統(tǒng)一資源定位)上下文
                int err;

                err = url_open(&h, filename, flags); // 打開URL
                if (err < 0)
                    return err;
                err = url_fdopen(s, h); // 用URL上下文打開字節(jié)IO上下文
                if (err < 0) {
                    url_close(h);
                    return err;
                }
                return 0;
            }


            進入url_open函數(shù):

            int url_open(URLContext **puc, // 輸出參數(shù): URL上下文

            const char *filename, // 文件名

            int flags) // 標(biāo)志

            {
                URLProtocol *up;
                const char *p;
                char proto_str[128], *q;

                // 提取協(xié)議
                p = filename;
                q = proto_str;
                while (*!= '\0' && *!= ':') { // 未結(jié)束, 并未遇到分隔符':'
                    if (!isalpha(*p)) // 如果不是英文字母
                        goto file_proto;
                    if ((- proto_str) < sizeof(proto_str) - 1)
                        *q++ = *p; // 記錄協(xié)議字符串
                    p++;
                }

                if (*== '\0' || is_dos_path(filename)) { // 如果上面是因為結(jié)束而跳出, 或且
            文件名是DOS路徑

                file_proto:
                    strcpy(proto_str, "file"); // 文件協(xié)議
                } else {
                    *= '\0'; // 追加結(jié)束符
                }

                up = first_protocol;
                while (up != NULL) {
                    if (!strcmp(proto_str, up->name)) // 協(xié)議匹配
                        return url_open_protocol (puc, up, filename, flags); // 用這個協(xié)議打開URL
                    up = up->next;
                }
                *puc = NULL;
                return AVERROR(ENOENT);
            }


            進入url_open_protocol函數(shù):

            int url_open_protocol (URLContext **puc, // 輸出參數(shù): URL上下文

            struct URLProtocol *up, // URL協(xié)議

            const char *filename, // 文件名

            int flags// 標(biāo)志
            {
                URLContext *uc;
                int err;

                // 網(wǎng)絡(luò)初始化
            #if CONFIG_NETWORK
                if (!ff_network_init())
                    return AVERROR(EIO);
            #endif

                // 分配URL上下文并加上文件名的存儲空間
                uc = av_mallocz(sizeof(URLContext) + strlen(filename) + 1);
                if (!uc) {
                    err = AVERROR(ENOMEM);
                    goto fail;
                }

                // 初始化URL上下文
            #if LIBAVFORMAT_VERSION_MAJOR >= 53
                uc->av_class = &urlcontext_class;
            #endif

                // 記錄文件名
                uc->filename = (char *) &uc[1];
                strcpy(uc->filename, filename);
             
                uc->prot = up
            // URL協(xié)議

                uc->flags = flags// 標(biāo)志
                uc->is_streamed = 0// 默認(rèn)不是流, 可以在up->url_open函數(shù)里修改
                uc->max_packet_size = 0; // 
            包最大多大, 默認(rèn)為0, 可以在up->url_open函數(shù)里修改

                // 打開URL
                err = up->url_open(uc, filename, flags);
                if (err < 0) {
                    av_free(uc);
                    goto fail;
                }

             

                if( (flags & (URL_WRONLY | URL_RDWR)// 如果以可寫方式打開

                   || !strcmp(up->name, "file")// 或且是文件協(xié)議

                     // 如果不是流并且不可以url_seek

                    if(!uc->is_streamed && url_seek(uc, 0, SEEK_SET) < 0)
                        uc->is_streamed= 1
            // 強制為流

                // 輸出
            參數(shù): URL上下文

                *puc = uc;
                return 0;
             fail:
                *puc = NULL;
            #if CONFIG_NETWORK
                ff_network_close();
            #endif
                return err;
            }


            先來看看url_get_max_packet_size函數(shù)

            int url_get_max_packet_size(URLContext *h)
            {
                return h->max_packet_size; // 包最大多大, 被上面初始化為0
            }


            進入url_fdopen函數(shù):

            int url_fdopen(

            ByteIOContext **s, // 輸出參數(shù): 字節(jié)IO上下文

            URLContext *h// URL上下文
            {
                uint8_t *buffer;
                int buffer_size, max_packet_size;

                max_packet_size = url_get_max_packet_size(h);
                if (max_packet_size) {
                    buffer_size = max_packet_size;
                } else {
                    buffer_size = IO_BUFFER_SIZE; // 緩沖大小為IO_BUFFER_SIZE
                }
                buffer = av_malloc(buffer_size); // 分配緩沖
                if (!buffer)
                    return AVERROR(ENOMEM);

                *= av_mallocz(sizeof(ByteIOContext)); // 分配字節(jié)IO上下文

                if(!*s) {
                    av_free(buffer);
                    return AVERROR(ENOMEM);
                }

                if (init_put_byte(*s, buffer, buffer_size,
                                  (h->flags & URL_WRONLY || h->flags & URL_RDWR), h,
                                  url_read, url_write, url_seek) < 0) {
                    av_free(buffer);
                    av_freep(s);
                    return AVERROR(EIO);
                }
                (*s)->is_streamed = h->is_streamed// 是否為流
                (*s)->max_packet_size = max_packet_size// 包最大多大
                if(h->prot) {
                    (*s)->read_pause = (int (*)(void *, int))h->prot->url_read_pause; // 讀暫停函數(shù)
                    (*s)->read_seek = (int64_t (*)(void *, int, int64_t, int))h->prot->url_read_seek; // 讀seek函數(shù)
                }
                return 0;
            }


            進入init_put_byte函數(shù):

            int init_put_byte(ByteIOContext *s, // 字節(jié)IO上下文
                              unsigned char *buffer, // 緩沖
                              int buffer_size, // 緩沖的大小
                              int write_flag, // 寫標(biāo)志
                              void *opaque, // URL上下文
                              int (*read_packet)(void *opaque, uint8_t *buf, int buf_size), // 讀包
                              int (*write_packet)(void *opaque, uint8_t *buf, int buf_size),// 寫包
                              int64_t (*seek)(void *opaque, int64_t offset, int whence)) // 調(diào)整文件指針
            {
                s->buffer = buffer;
                s->buffer_size = buffer_size;
                s->buf_ptr = buffer;
                s->opaque = opaque;
                url_resetbuf(s, write_flag ? URL_WRONLY : URL_RDONLY);
                s->write_packet = write_packet;
                s->read_packet = read_packet;
                s->seek = seek;
                s->pos = 0;
                s->must_flush = 0;
                s->eof_reached = 0;
                s->error = 0;
                s->is_streamed = 0;
                s->max_packet_size = 0;
                s->update_checksum= NULL;
                if(!read_packet && !write_flag){
                    s->pos = buffer_size;
                    s->buf_end = s->buffer + buffer_size;
                }
                s->read_pause = NULL;
                s->read_seek = NULL;
                return 0;
            }

            @import url(http://www.shnenglu.com/cutesoft_client/cuteeditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);

            posted on 2012-12-14 01:34 Khan 閱讀(1171) 評論(0)  編輯 收藏 引用 所屬分類: GCC/G++跨平臺開發(fā)

            国产成人精品白浆久久69 | 欧美一级久久久久久久大| 久久免费视频一区| 无码日韩人妻精品久久蜜桃| 国产精品视频久久久| 久久久久亚洲AV无码专区桃色| 亚洲国产精品无码成人片久久| 91久久精品视频| 无码人妻久久一区二区三区| 久久99免费视频| 久久天天躁狠狠躁夜夜不卡| 色综合合久久天天综合绕视看| 久久久久久国产精品美女| 青青青国产精品国产精品久久久久 | 国产成人精品久久一区二区三区av | 中文字幕一区二区三区久久网站| 国产精品亚洲综合久久| 99国内精品久久久久久久| 亚洲精品乱码久久久久久中文字幕| 久久精品人妻一区二区三区| 国产精品久久久久久久久鸭| 精品多毛少妇人妻AV免费久久 | 人妻少妇精品久久| 久久婷婷久久一区二区三区| 久久国产色av免费看| 亚洲性久久久影院| 国产精品青草久久久久福利99| 久久99免费视频| 精品久久久久久无码专区| 精品熟女少妇AV免费久久| 亚洲&#228;v永久无码精品天堂久久| 日本免费久久久久久久网站| 久久久久久午夜成人影院| 国内精品人妻无码久久久影院导航| 久久夜色撩人精品国产小说| 久久99精品九九九久久婷婷 | 久久综合狠狠综合久久| 色播久久人人爽人人爽人人片AV| 天堂无码久久综合东京热| 亚洲国产成人久久一区久久| 午夜精品久久久久久影视riav|