ffmpeg # http.c - http_open

這是一個 http_open 函數(shù)的實(shí)現(xiàn)谜洽,它是 FFmpeg 的 HTTP 協(xié)議處理的一部分宵睦。這個函數(shù)用于打開一個 HTTP 連接交惯,并進(jìn)行相應(yīng)的初始化和錯誤處理肯适。下面是逐行的中文注釋和解釋:

static int http_open(URLContext *h, const char *uri, int flags,
                     AVDictionary **options)
{
    // 獲取私有數(shù)據(jù) HTTPContext
    HTTPContext *s = h->priv_data;
    int ret;

    // 根據(jù) seekable 屬性設(shè)置 is_streamed 標(biāo)志
    if (s->seekable == 1)
        h->is_streamed = 0;
    else
        h->is_streamed = 1;

    // 初始化文件大小為最大值
    s->filesize = UINT64_MAX;

    // 復(fù)制 URI 到 location 字段
    s->location = av_strdup(uri);
    if (!s->location)
        return AVERROR(ENOMEM); // 內(nèi)存分配失敗变秦,返回錯誤碼

    // 復(fù)制 URI 到 uri 字段
    s->uri = av_strdup(uri);
    if (!s->uri)
        return AVERROR(ENOMEM); // 內(nèi)存分配失敗,返回錯誤碼

    // 復(fù)制 options 到 chained_options 字段
    if (options)
        av_dict_copy(&s->chained_options, *options, 0);

    // 如果 headers 存在框舔,檢查并添加 CRLF
    if (s->headers) {
        int len = strlen(s->headers);
        if (len < 2 || strcmp("\r\n", s->headers + len - 2)) {
            av_log(h, AV_LOG_WARNING,
                   "No trailing CRLF found in HTTP header. Adding it.\n");
            ret = av_reallocp(&s->headers, len + 3);
            if (ret < 0)
                goto bail_out; // 重新分配內(nèi)存失敗蹦玫,跳轉(zhuǎn)到錯誤處理部分
            s->headers[len]     = '\r';
            s->headers[len + 1] = '\n';
            s->headers[len + 2] = '\0';
        }
    }

    // 如果是監(jiān)聽模式,調(diào)用 http_listen 函數(shù)
    if (s->listen) {
        return http_listen(h, uri, flags, options);
    }

    // 否則刘绣,調(diào)用 http_open_cnx 函數(shù)打開連接
    ret = http_open_cnx(h, options);

bail_out:
    // 錯誤處理部分樱溉,釋放分配的資源
    if (ret < 0) {
        av_dict_free(&s->chained_options);
        av_dict_free(&s->cookie_dict);
        av_dict_free(&s->redirect_cache);
        av_freep(&s->new_location);
        av_freep(&s->uri);
    }
    return ret; // 返回結(jié)果
}

代碼解釋:

  1. 獲取私有數(shù)據(jù)HTTPContext *s = h->priv_data;URLContext 中獲取 HTTPContext 的私有數(shù)據(jù)。

  2. 設(shè)置流標(biāo)志:根據(jù) s->seekable 屬性設(shè)置 h->is_streamed 標(biāo)志纬凤。如果 seekable 為 1饺窿,則 is_streamed 設(shè)置為 0;否則移斩,設(shè)置為 1肚医。

  3. 初始化文件大小:將 s->filesize 初始化為 UINT64_MAX,表示文件大小未知或無限大向瓷。

  4. 復(fù)制 URI:使用 av_strdup 復(fù)制 uris->locations->uri肠套,如果分配失敗,返回內(nèi)存錯誤碼 AVERROR(ENOMEM)猖任。

  5. 復(fù)制選項(xiàng):如果 options 存在你稚,使用 av_dict_copy 將其復(fù)制到 s->chained_options

  6. 檢查并添加 CRLF:如果 s->headers 存在朱躺,檢查其末尾是否有 CRLF刁赖,如果沒有,使用 av_reallocp 重新分配內(nèi)存并添加 CRLF长搀。如果內(nèi)存重新分配失敗宇弛,跳轉(zhuǎn)到錯誤處理部分 bail_out

  7. 監(jiān)聽模式:如果 s->listen 為真源请,調(diào)用 http_listen 函數(shù)處理監(jiān)聽連接枪芒。

  8. 打開連接:調(diào)用 http_open_cnx 函數(shù)打開 HTTP 連接,并將返回值存儲在 ret 中谁尸。

  9. 錯誤處理:在 bail_out 部分舅踪,如果 ret 小于 0,表示操作失敗良蛮,釋放之前分配的資源抽碌。

  10. 返回結(jié)果:返回 ret,表示操作的結(jié)果决瞳。

這個函數(shù)的主要作用是初始化 HTTP 連接货徙,并在出錯時進(jìn)行相應(yīng)的清理和資源釋放泽裳。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市破婆,隨后出現(xiàn)的幾起案子涮总,更是在濱河造成了極大的恐慌,老刑警劉巖祷舀,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瀑梗,死亡現(xiàn)場離奇詭異,居然都是意外死亡裳扯,警方通過查閱死者的電腦和手機(jī)抛丽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來饰豺,“玉大人亿鲜,你說我怎么就攤上這事≡┒郑” “怎么了蒿柳?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長漩蟆。 經(jīng)常有香客問我垒探,道長,這世上最難降的妖魔是什么怠李? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任圾叼,我火速辦了婚禮,結(jié)果婚禮上捺癞,老公的妹妹穿的比我還像新娘夷蚊。我一直安慰自己,他們只是感情好髓介,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布惕鼓。 她就那樣靜靜地躺著,像睡著了一般版保。 火紅的嫁衣襯著肌膚如雪呜笑。 梳的紋絲不亂的頭發(fā)上夫否,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天彻犁,我揣著相機(jī)與錄音,去河邊找鬼凰慈。 笑死汞幢,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的微谓。 我是一名探鬼主播森篷,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼输钩,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了仲智?” 一聲冷哼從身側(cè)響起买乃,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎钓辆,沒想到半個月后剪验,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡前联,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年功戚,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片似嗤。...
    茶點(diǎn)故事閱讀 39,932評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡啸臀,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出烁落,到底是詐尸還是另有隱情乘粒,我是刑警寧澤,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布伤塌,位于F島的核電站谓厘,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏寸谜。R本人自食惡果不足惜竟稳,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望熊痴。 院中可真熱鬧他爸,春花似錦、人聲如沸果善。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽巾陕。三九已至讨跟,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鄙煤,已是汗流浹背晾匠。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留梯刚,地道東北人凉馆。 一個月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像曹动,于是被迫代替她去往敵國和親滔悉。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評論 2 354

推薦閱讀更多精彩內(nèi)容