From patchwork Tue Apr 10 18:47:18 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: rshaffer@tunein.com X-Patchwork-Id: 8378 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.2.1.70 with SMTP id c67csp1404230jad; Tue, 10 Apr 2018 11:54:23 -0700 (PDT) X-Google-Smtp-Source: AIpwx4+dVE5HfYrjTF/6p//McnaYBo0HBLXLwj1y0XktyoOVlFySbohaCAshTmyqQS8cICLu7Jgl X-Received: by 10.28.178.72 with SMTP id b69mr465439wmf.112.1523386463209; Tue, 10 Apr 2018 11:54:23 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1523386463; cv=none; d=google.com; s=arc-20160816; b=Od+iPylnxntHHNxmZyIiTMU68OWJ9qJllTSWGRkny9l6XsSmyb9NETy8XlY3/rifqF GqYej+csC1JRVjeIxTyJNehgMh5lVdfCpzKIYf7azqITNl3/YTWcrdaolg0G2MnXaG6C 0ae0ltnSCQK+k/3uuZBKlghc4IrojWooO1gk4yq5EN5KKIe8mk95BG6+7+WQEw220Jol ps0jXJ3GDJTTx6ADp8JPtWH9QJcFdJ8C4JFBv/zaQ/mzXqyF9s30bjoh+tQ+RKcV/gx5 R3d1wvq1mcB/GtCFF7N5+4PX2wVyXJm1bftT2Kgqt1Cfa1X/BYSczakz5jCcaipFIHx1 /tgQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:message-id:date:to:from:dkim-signature :delivered-to:arc-authentication-results; bh=N8dw4130TquDBk9N0auLXNJEszH9k6x593wPARef6ds=; b=lko3N7p7skM/1fVseegrJjLehzvMN8Zb5FmoNkU6uNv4yLuF72T+YeBuAx4VsVR9PI 00rvHTYEHlilbSpU2zgN9GCTUdzpEqncWU0b5ZSzHXkX3NVPkc2zZKK1iZsvHkPEdmUr LT4W1jU0k+8+z1lFxIUk4G65PZvz/1LtJDs7H5jUdcZ2ELjcz3d7Euq9gSVFSbPAsaVP yPBVPQYgbWejxlLhZYjhBdFqpwjxQFwrRPHWXhelevF4NTmO7pT5eJggs2EJbmrLRX4W bekdsGy6IsFlKsZE5b7ENSWNOPOZ7/a6N9pHsp+ibSqEszQX9A7diTYsKwAEFxlX+Utp DBXw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@tunein-com.20150623.gappssmtp.com header.s=20150623 header.b=YBqs8gcT; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id g110si2438243wrd.78.2018.04.10.11.54.22; Tue, 10 Apr 2018 11:54:23 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@tunein-com.20150623.gappssmtp.com header.s=20150623 header.b=YBqs8gcT; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id D8650689FC7; Tue, 10 Apr 2018 21:53:56 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-vk0-f54.google.com (mail-vk0-f54.google.com [209.85.213.54]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id B345F689F16 for ; Tue, 10 Apr 2018 21:53:49 +0300 (EEST) Received: by mail-vk0-f54.google.com with SMTP id v134so7658433vkd.10 for ; Tue, 10 Apr 2018 11:54:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tunein-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id; bh=dBkUNCgh3vx4oypEHaE1DGpoCD5x7/tr0M+Fe6EUk2g=; b=YBqs8gcTYyAlUIEZGA2314ltu7iU+0dFXdwhjeV6zjGU5TJ5cifPk543w1RDYhAALx VHBMMwnWcAA7ftZ3LBQiLcu/07gXU4Pn7d303XSkHhn5aHPRJVO9vtdK4Xc9tsEk84i9 yhUrKlGscqJTaKMZU+h/KFoqTJLyzubm/C53LMwPxxprCuG5H7UV8SesxnlgbZvNm2c8 QDS96c+M0ASV9gG5ov/J4zl67SE3rGrqbPFrYMVRkTYWjDnJm00x7Hq/dNPAQDwfAtN1 cRaSats0P7Pyz09nLKaQ6J0ET3wxXIcC6GeUvvWxC/46lWGZuRlS7Ho8fO/3Up+o21l6 aZGA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=dBkUNCgh3vx4oypEHaE1DGpoCD5x7/tr0M+Fe6EUk2g=; b=CPFYjoqZCDWcVY5woPS0msTrvq4+nXWlmsqaDN8VPaiKJegfUMfx09maeKRgwwZjyO /CD0eIllODDanAMGwY9OfGvU0A9rLtft4Zxs0149MDXS5BRw0493rNhoahuX6BFFG26t 6Xl6wp8VAQb4brKwPrToEBklZvGmvgeZMZlkgUhT68E7PGrpXWKlcF4HNjQrlNE4QNqV t08Kfymg6Qk+F/TB8ntEAblQ/ywO/vvSyY6MOVoqxOsYSdvnqmFdFv0wAsf+n6ANDkTQ zUtuczs2cCM1S5dDYIb+AtXnOrnX6DjM469sQUo8CjWGqiVYnF3iFoudxVME6z9w1Tw6 Yq9g== X-Gm-Message-State: ALQs6tDzQMoHaIHLm/n/lIee+L3PWEqaNpHlWzxno/oCEynegulr6jsc VB1terBE2+B0AIx7tzlRK4GQA051 X-Received: by 10.31.220.1 with SMTP id t1mr1233260vkg.35.1523386105526; Tue, 10 Apr 2018 11:48:25 -0700 (PDT) Received: from 000984.tunein.corp ([38.140.202.59]) by smtp.gmail.com with ESMTPSA id g62sm2043082uag.11.2018.04.10.11.48.24 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 10 Apr 2018 11:48:24 -0700 (PDT) From: rshaffer@tunein.com To: ffmpeg-devel@ffmpeg.org Date: Tue, 10 Apr 2018 11:47:18 -0700 Message-Id: <20180410184718.41066-1-rshaffer@tunein.com> X-Mailer: git-send-email 2.15.1 (Apple Git-101) Subject: [FFmpeg-devel] [PATCH] avformat/hls: clean up duplicate option fields X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Cc: Richard Shaffer MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" From: Richard Shaffer The HLSContext struct contains fields which duplicate the data stored in the avio_opts field. This change removes those fields in favor of avio_opts, and updates the code accordingly. --- libavformat/hls.c | 74 +++++++------------------------------------------------ 1 file changed, 9 insertions(+), 65 deletions(-) diff --git a/libavformat/hls.c b/libavformat/hls.c index ef731c27ac..d5563e76b1 100644 --- a/libavformat/hls.c +++ b/libavformat/hls.c @@ -202,11 +202,6 @@ typedef struct HLSContext { int64_t first_timestamp; int64_t cur_timestamp; AVIOInterruptCB *interrupt_callback; - char *referer; ///< holds HTTP referer set as an AVOption to the HTTP protocol context - char *user_agent; ///< holds HTTP user agent set as an AVOption to the HTTP protocol context - char *cookies; ///< holds HTTP cookie values set in either the initial response or as an AVOption to the HTTP protocol context - char *headers; ///< holds HTTP headers set as an AVOption to the HTTP protocol context - char *http_proxy; ///< holds the address of the HTTP proxy server AVDictionary *avio_opts; int strict_std_compliance; char *allowed_extensions; @@ -275,10 +270,6 @@ static void free_playlist_list(HLSContext *c) av_free(pls); } av_freep(&c->playlists); - av_freep(&c->cookies); - av_freep(&c->user_agent); - av_freep(&c->headers); - av_freep(&c->http_proxy); c->n_playlists = 0; } @@ -601,14 +592,6 @@ static int ensure_playlist(HLSContext *c, struct playlist **pls, const char *url return 0; } -static void update_options(char **dest, const char *name, void *src) -{ - av_freep(dest); - av_opt_get(src, name, AV_OPT_SEARCH_CHILDREN, (uint8_t**)dest); - if (*dest && !strlen(*dest)) - av_freep(dest); -} - static int open_url_keepalive(AVFormatContext *s, AVIOContext **pb, const char *url) { @@ -692,12 +675,8 @@ static int open_url(AVFormatContext *s, AVIOContext **pb, const char *url, if (!(s->flags & AVFMT_FLAG_CUSTOM_IO)) av_opt_get(*pb, "cookies", AV_OPT_SEARCH_CHILDREN, (uint8_t**)&new_cookies); - if (new_cookies) { - av_free(c->cookies); - c->cookies = new_cookies; - } - - av_dict_set(&opts, "cookies", c->cookies, 0); + if (new_cookies) + av_dict_set(&opts, "cookies", new_cookies, 0); } av_dict_free(&tmp); @@ -744,14 +723,7 @@ static int parse_playlist(HLSContext *c, const char *url, if (!in) { AVDictionary *opts = NULL; - /* Some HLS servers don't like being sent the range header */ - av_dict_set(&opts, "seekable", "0", 0); - - // broker prior HTTP options that should be consistent across requests - av_dict_set(&opts, "user_agent", c->user_agent, 0); - av_dict_set(&opts, "cookies", c->cookies, 0); - av_dict_set(&opts, "headers", c->headers, 0); - av_dict_set(&opts, "http_proxy", c->http_proxy, 0); + av_dict_copy(&opts, c->avio_opts, 0); if (c->http_persistent) av_dict_set(&opts, "multiple_requests", "1", 0); @@ -1177,14 +1149,6 @@ static int open_input(HLSContext *c, struct playlist *pls, struct segment *seg, int ret; int is_http = 0; - // broker prior HTTP options that should be consistent across requests - av_dict_set(&opts, "user_agent", c->user_agent, 0); - av_dict_set(&opts, "referer", c->referer, 0); - av_dict_set(&opts, "cookies", c->cookies, 0); - av_dict_set(&opts, "headers", c->headers, 0); - av_dict_set(&opts, "http_proxy", c->http_proxy, 0); - av_dict_set(&opts, "seekable", "0", 0); - if (c->http_persistent) av_dict_set(&opts, "multiple_requests", "1", 0); @@ -1201,7 +1165,6 @@ static int open_input(HLSContext *c, struct playlist *pls, struct segment *seg, if (seg->key_type == KEY_NONE) { ret = open_url(pls->parent, in, seg->url, c->avio_opts, opts, &is_http); } else if (seg->key_type == KEY_AES_128) { - AVDictionary *opts2 = NULL; char iv[33], key[33], url[MAX_URL_SIZE]; if (strcmp(seg->key, pls->key_url)) { AVIOContext *pb = NULL; @@ -1226,14 +1189,10 @@ static int open_input(HLSContext *c, struct playlist *pls, struct segment *seg, else snprintf(url, sizeof(url), "crypto:%s", seg->url); - av_dict_copy(&opts2, c->avio_opts, 0); - av_dict_set(&opts2, "key", key, 0); - av_dict_set(&opts2, "iv", iv, 0); - - ret = open_url(pls->parent, in, url, opts2, opts, &is_http); - - av_dict_free(&opts2); + av_dict_set(&opts, "key", key, 0); + av_dict_set(&opts, "iv", iv, 0); + ret = open_url(pls->parent, in, url, c->avio_opts, opts, &is_http); if (ret < 0) { goto cleanup; } @@ -1789,7 +1748,6 @@ static int hls_close(AVFormatContext *s) static int hls_read_header(AVFormatContext *s) { - void *u = (s->flags & AVFMT_FLAG_CUSTOM_IO) ? NULL : s->pb; HLSContext *c = s->priv_data; int ret = 0, i; int highest_cur_seq_no = 0; @@ -1802,29 +1760,15 @@ static int hls_read_header(AVFormatContext *s) c->first_timestamp = AV_NOPTS_VALUE; c->cur_timestamp = AV_NOPTS_VALUE; - if (u) { - // get the previous user agent & set back to null if string size is zero - update_options(&c->user_agent, "user_agent", u); - - // get the previous cookies & set back to null if string size is zero - update_options(&c->cookies, "cookies", u); - - // get the previous headers & set back to null if string size is zero - update_options(&c->headers, "headers", u); - - // get the previous http proxt & set back to null if string size is zero - update_options(&c->http_proxy, "http_proxy", u); - } - - if ((ret = parse_playlist(c, s->url, NULL, s->pb)) < 0) - goto fail; - if ((ret = save_avio_options(s)) < 0) goto fail; /* Some HLS servers don't like being sent the range header */ av_dict_set(&c->avio_opts, "seekable", "0", 0); + if ((ret = parse_playlist(c, s->url, NULL, s->pb)) < 0) + goto fail; + if (c->n_variants == 0) { av_log(NULL, AV_LOG_WARNING, "Empty playlist\n"); ret = AVERROR_EOF;