From patchwork Wed Nov 8 09:22:54 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Jeyapal, Karthick" X-Patchwork-Id: 5949 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.2.161.90 with SMTP id m26csp500236jah; Wed, 8 Nov 2017 01:23:17 -0800 (PST) X-Google-Smtp-Source: ABhQp+TgOigkhXi8x25k5q3gRRkK0RKVtnLfoKvIwy3POhgbuBUONKQvKUhVf57hlEbYw4ZHd5/N X-Received: by 10.28.228.197 with SMTP id b188mr1393114wmh.59.1510132997354; Wed, 08 Nov 2017 01:23:17 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1510132997; cv=none; d=google.com; s=arc-20160816; b=fMPNbG1hQFMAr3x2jXMH/Hhbl6yeByvjUfdzcL67X4PrO3AHFVEVA3medKa/HKshbo 5cbF1cHNN5mPBO/bPxL/fduyDCeYJXsRtskdSY8PUPeLbi8tNChxfFG7jIVNOgpfxlGG Du0hhYiKYhAd1VDyz0kSMvPD7Bx0P6z9qcD7NiUpv0xOR5qJM9bvVn+Z80m0dZPyCmwG b6105R62TM+so3E3Gosl6rq/nNVGdxk/azSXS/wZrGahKoRUkfBFOj9qs82AuXviqm5E tGxNYDQqRUpWvJz+mNGAG5rfx0qq0UWEJOgb6eBP5OkQbaVv9KMJoGDeDk6JdVzgOaD6 J1AQ== 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:feedback-id:message-id:date:to:from :dkim-signature:delivered-to:arc-authentication-results; bh=zVKNMeWMKsuHG9etgA9Qb95vcaU87yOHV7fHSsvpTJY=; b=Pm+agvkxbs13ToBpfBdfxuf6RK2pjtOAHguoe+vTurzNKHUc/n5O3gOg6OzPAhPP/B et7MP6KN9XMD9OmeIEBx8BaATlowa2M9JHkm3FMQcriQ910qlBNj1d4CT++HrBDQuumY 3RgFXKwO/n9s1FLaIe8bEn9a9s/DfR7s5kNgGGnFJmjRQGiG7AfP8m8/dHx8WCFum0bM jhME67g+4Sb0oLoEmj4c3aFqHh0WB/J1ZvdPXLosijYWKulWmMEhP/4exUBmY/Y/y2nb 6UBGxt4u5sgSDaKeEr0cJIKgi25P9ToYI1Yncoux8VOtf0svbQiecY1pSFD/qQ77kIk8 6V0w== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@smtpservice.net header.s=m78bu0.a1-4.dyn header.b=sU/c22VF; 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; dmarc=fail (p=QUARANTINE sp=NONE dis=NONE) header.from=akamai.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id l5si3130316wrf.98.2017.11.08.01.23.16; Wed, 08 Nov 2017 01:23:17 -0800 (PST) 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=@smtpservice.net header.s=m78bu0.a1-4.dyn header.b=sU/c22VF; 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; dmarc=fail (p=QUARANTINE sp=NONE dis=NONE) header.from=akamai.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id C5D7E689B83; Wed, 8 Nov 2017 11:23:02 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from a2i831.smtp2go.com (a2i831.smtp2go.com [103.47.207.63]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id E27386883A5 for ; Wed, 8 Nov 2017 11:22:55 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=smtpservice.net; s=m78bu0.a1-4.dyn; x=1510133894; h=Feedback-ID: X-Smtpcorp-Track:Message-Id:Date:Subject:To:From:Reply-To:Sender: List-Unsubscribe; bh=wuoDzAIxz16uS1fhVsN7T3/ZB1TXpN4bNgGPWWVvIrw=; b=sU/c22VF X/AKxPzjdC55Y9omGEmLhuC8/6i+OoVfxM5l2oQqoK0QPTq2NXiLEqZaAYqgiqmPqj4GNvoBWC93h RbGMNUsfklkJSicIcq2WDsFOwJxxKwfd2C0CkwdjITVfEcxRYpCVZPTBUvN/HgbPg29spFlsDCcIk A5KAUpNe30grA+iC3yFcBvNqm7R+TEPvfY7be0X8D/PIO38UbJpNGmcYT3jBX9dddHakSSjpCzD4k aQDA6JTYF5q2xU4vYC/KyVhcOT1H96rlYL1rv886plKAzT0JTHn5ReoluX9h7v/st6dbY4Zaf9JU5 jBh4ZCBhxXlGbiJHHBbL678M4w==; From: Karthick J To: ffmpeg-devel@ffmpeg.org Date: Wed, 8 Nov 2017 14:52:54 +0530 Message-Id: <1510132974-16590-1-git-send-email-kjeyapal@akamai.com> X-Mailer: git-send-email 1.9.1 X-Smtpcorp-Track: 1-CuZPRyIJ5vCR.joz2rWzVr Feedback-ID: 337386m:337386asVRLGB:337386s1iIATvcaF:SMTPCORP X-Report-Abuse: Please forward a copy of this message, including all headers, to Subject: [FFmpeg-devel] [PATCH 1/1] avformat/dashenc: Added configuration to override HTTP User-Agent 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: Karthick J MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" --- doc/muxers.texi | 2 ++ libavformat/dashenc.c | 22 +++++++++++++++++++--- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/doc/muxers.texi b/doc/muxers.texi index 91bbe67..412fede 100644 --- a/doc/muxers.texi +++ b/doc/muxers.texi @@ -247,6 +247,8 @@ DASH-templated name to used for the initialization segment. Default is "init-str DASH-templated name to used for the media segments. Default is "chunk-stream$RepresentationID$-$Number%05d$.m4s" @item -utc_timing_url @var{utc_url} URL of the page that will return the UTC timestamp in ISO format. Example: "https://time.akamai.com/?iso" +@item -http_user_agent @var{user_agent} +Override User-Agent field in HTTP header. Applicable only for HTTP output. @item -adaptation_sets @var{adaptation_sets} Assign streams to AdaptationSets. Syntax is "id=x,streams=a,b,c id=y,streams=d,e" with x and y being the IDs of the adaptation sets and a,b,c,d and e are the indices of the mapped streams. diff --git a/libavformat/dashenc.c b/libavformat/dashenc.c index 7813f44..a68f7fb 100644 --- a/libavformat/dashenc.c +++ b/libavformat/dashenc.c @@ -100,6 +100,7 @@ typedef struct DASHContext { const char *init_seg_name; const char *media_seg_name; const char *utc_timing_url; + const char *user_agent; } DASHContext; static struct codec_string { @@ -210,6 +211,12 @@ static int flush_dynbuf(OutputStream *os, int *range_length) return avio_open_dyn_buf(&os->ctx->pb); } +static void set_http_options(AVDictionary **options, DASHContext *c) +{ + if (c->user_agent) + av_dict_set(options, "user_agent", c->user_agent, 0); +} + static int flush_init_segment(AVFormatContext *s, OutputStream *os) { DASHContext *c = s->priv_data; @@ -575,16 +582,19 @@ static int write_manifest(AVFormatContext *s, int final) int use_rename = proto && !strcmp(proto, "file"); static unsigned int warned_non_file = 0; AVDictionaryEntry *title = av_dict_get(s->metadata, "title", NULL, 0); + AVDictionary *opts = NULL; if (!use_rename && !warned_non_file++) av_log(s, AV_LOG_ERROR, "Cannot use rename on non file protocol, this may lead to races and temporary partial files\n"); snprintf(temp_filename, sizeof(temp_filename), use_rename ? "%s.tmp" : "%s", s->filename); - ret = s->io_open(s, &out, temp_filename, AVIO_FLAG_WRITE, NULL); + set_http_options(&opts, c); + ret = s->io_open(s, &out, temp_filename, AVIO_FLAG_WRITE, &opts); if (ret < 0) { av_log(s, AV_LOG_ERROR, "Unable to open %s for writing\n", temp_filename); return ret; } + av_dict_free(&opts); avio_printf(out, "\n"); avio_printf(out, "initfile, sizeof(os->initfile), c->init_seg_name, i, 0, os->bit_rate, 0); } snprintf(filename, sizeof(filename), "%s%s", c->dirname, os->initfile); - ret = s->io_open(s, &os->out, filename, AVIO_FLAG_WRITE, NULL); + set_http_options(&opts, c); + ret = s->io_open(s, &os->out, filename, AVIO_FLAG_WRITE, &opts); if (ret < 0) return ret; + av_dict_free(&opts); os->init_start_pos = 0; if (!strcmp(os->format_name, "mp4")) { @@ -974,12 +986,15 @@ static int dash_flush(AVFormatContext *s, int final, int stream) } if (!c->single_file) { + AVDictionary *opts = NULL; ff_dash_fill_tmpl_params(filename, sizeof(filename), c->media_seg_name, i, os->segment_index, os->bit_rate, os->start_pts); snprintf(full_path, sizeof(full_path), "%s%s", c->dirname, filename); snprintf(temp_path, sizeof(temp_path), use_rename ? "%s.tmp" : "%s", full_path); - ret = s->io_open(s, &os->out, temp_path, AVIO_FLAG_WRITE, NULL); + set_http_options(&opts, c); + ret = s->io_open(s, &os->out, temp_path, AVIO_FLAG_WRITE, &opts); if (ret < 0) break; + av_dict_free(&opts); if (!strcmp(os->format_name, "mp4")) write_styp(os->ctx->pb); } else { @@ -1188,6 +1203,7 @@ static const AVOption options[] = { { "init_seg_name", "DASH-templated name to used for the initialization segment", OFFSET(init_seg_name), AV_OPT_TYPE_STRING, {.str = "init-stream$RepresentationID$.m4s"}, 0, 0, E }, { "media_seg_name", "DASH-templated name to used for the media segments", OFFSET(media_seg_name), AV_OPT_TYPE_STRING, {.str = "chunk-stream$RepresentationID$-$Number%05d$.m4s"}, 0, 0, E }, { "utc_timing_url", "URL of the page that will return the UTC timestamp in ISO format", OFFSET(utc_timing_url), AV_OPT_TYPE_STRING, { 0 }, 0, 0, E }, + { "http_user_agent", "override User-Agent field in HTTP header", OFFSET(user_agent), AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, E}, { NULL }, };