From patchwork Wed Jan 17 03:00:27 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Colin NG X-Patchwork-Id: 7307 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.2.78.2 with SMTP id r2csp5001829jaa; Tue, 16 Jan 2018 19:00:37 -0800 (PST) X-Google-Smtp-Source: ACJfBosoW59nn/DTlh7awpKmiZp39QMBCyhgUS3bS9Gtc09D8+m8qpXa+9Ja1NJi9k/W83KN9Jol X-Received: by 10.28.198.132 with SMTP id w126mr786029wmf.37.1516158037325; Tue, 16 Jan 2018 19:00:37 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1516158037; cv=none; d=google.com; s=arc-20160816; b=BRre7FPRGs9kU/AMRq67jEB40NWnCibs8pGRUZ86NTRGqxYI+B2/TSoSiyhBoxkQ9D TQ7ZGbw9lwwhBePS4T1xCulGoWzQXpN5UcPJrOn63VpTV+HRQb32qgI+9eGQACxMaUln F+SPCinM6UYmoCT9d+JaRLQxR6bOps1ddy6c+vIJ35hfSGSjK8P6wkmDYFExVozjLrAW 3U2VWTNXtzTDMcQZUaZYzknSqvF5j0Id5N0l8hvzf+jyNMSmKgeiCNP3a4KpKcNh46Du pCm8S1RsrtOoGWKfaNqqY41SxjX3IoEtxOEspqe/4N7TEK/LqgFYO7WiR3Xldja/fX97 J/VQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:spamdiagnosticmetadata :spamdiagnosticoutput:content-language:accept-language:message-id :date:thread-index:thread-topic:to:from:dkim-signature:delivered-to :arc-authentication-results; bh=DrDcm2qx4JaxNeM4HmgyqOIIQaP4ceadG/eOUbdmMqY=; b=Kjk+jL2V+Dd84SMA+E8pnqYpYHE7yk4GxUaTci4IUx069rjT1HjyKDaHmcLs082tqw xaCNMO53g8u3DfjKZT173fyjDuDe7WBKyU6VfTFBlkLHAmziEWUp9UpyPfNudZSrJWn3 codiApecZ9C7lvpuUFNTkYPq4CcgVDUxEBYPcdGvBRL+g8yZtWm2KHIszhwzeu5ResUa QnybYJuwSI046DomSM8IfBBoXUIRiZ4HIL+6yrjogpfWiRleLMVmkJqK0kpmsj035tnq ZuLLOWvMCsEi7T3Ib7Vkn9aLC9kBpwimYeLNhRcv1hELBKDLZA4/3z3eQDfIIXXZ251v JJcw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@hotmail.com header.s=selector1 header.b=lcSORQvp; 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=NONE sp=QUARANTINE dis=NONE) header.from=hotmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id z66si2989315wmd.40.2018.01.16.19.00.36; Tue, 16 Jan 2018 19:00:37 -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=@hotmail.com header.s=selector1 header.b=lcSORQvp; 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=NONE sp=QUARANTINE dis=NONE) header.from=hotmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id AB45F689CF6; Wed, 17 Jan 2018 05:00:33 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from NAM03-BY2-obe.outbound.protection.outlook.com (mail-oln040092006035.outbound.protection.outlook.com [40.92.6.35]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id F3FCB68831F for ; Wed, 17 Jan 2018 05:00:26 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=hotmail.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=KfjRzxMi1fnR5SQXehMdkoEtI61NnVBNrHoClNZctt0=; b=lcSORQvps+1412D/c95jzL3ZTIHtSZgCQ+67+V38Ysw0T3P2N5YkDyqunc9jZHuiZ1Kzt9LbbEH3WNlYdaJZuiFSaMwYjB+W0k8rxiltOkhCJ95gPBRDJGh+qPUsm/St/dcCSV+6Ly9XroQhcfsJ8y1cL2nW70l9Tiq5ltt0FasbY9lvkbPBDt4bwPa4N4eZ26kMq7YzMXPmcJHB7JpHPxHzylhorS9g9qMZceL5HwLYDk4RpEgWJIrmb9J/ON9h3gO5P4mEFUSmbtPaRjS1BRjDwKY0ytjw5P/aclp0w+1dY5jTAwrwhxnNJwtGLDJAK+Qi56oyYIh+8CdTYE4phg== Received: from DM3NAM03FT015.eop-NAM03.prod.protection.outlook.com (10.152.82.58) by DM3NAM03HT129.eop-NAM03.prod.protection.outlook.com (10.152.83.170) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.345.5; Wed, 17 Jan 2018 03:00:27 +0000 Received: from DM5PR22MB0681.namprd22.prod.outlook.com (10.152.82.56) by DM3NAM03FT015.mail.protection.outlook.com (10.152.82.195) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.345.5 via Frontend Transport; Wed, 17 Jan 2018 03:00:27 +0000 Received: from DM5PR22MB0681.namprd22.prod.outlook.com ([10.172.189.151]) by DM5PR22MB0681.namprd22.prod.outlook.com ([10.172.189.151]) with mapi id 15.20.0407.012; Wed, 17 Jan 2018 03:00:27 +0000 From: Colin NG To: "ffmpeg-devel@ffmpeg.org" Thread-Topic: [PATCH 2/3] libavformat/dashdec: Fix for ticket 6658 (Dash demuxer segfault) Thread-Index: AQHTjz9TPpRkEOfBL0qpBzKB4oNI7A== Date: Wed, 17 Jan 2018 03:00:27 +0000 Message-ID: Accept-Language: en-CA, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-incomingtopheadermarker: OriginalChecksum:BBF6FF0424AAA8B8D1326AC11ED68CCE96F506DD4A9504739037AF82B520C13E; UpperCasedChecksum:AFCEFCCDD4990D857E1657236C7FBBAC2D7265C738F9A0B19136E47C8A933F53; SizeAsReceived:6964; Count:45 x-ms-exchange-messagesentrepresentingtype: 1 x-tmn: [J2VLZH0Hl+J/7Sro2/byJgUbNq522yp5] x-ms-publictraffictype: Email x-microsoft-exchange-diagnostics: 1; DM3NAM03HT129; 6:+IMigSdWEBV9Atz1jR5k9ZLpcJOWzhkNWmDMjNZwZkccOVpgy69BW8ZG/C9c8WyjHzQS+AWPJ0JnulJbtZGnVaZcRpX43fOdmbTXZUTNAJW9CXTKUXVZXn4I4RgwY91eZgGhK4Rv5U65/6R0DIlNV24pT9gXlS/Outzy4avJGjg8MKtqXm/jIfped8TxqN7asq9NnVGKzx+DmnwNdo0NEBfqY5EZeNvAEg50effXS7RAJXD1VMb8zAJN/TjSCaBQPkhQQNh1R8TxHLSOunPlRPS6UWDTeZoJQlTzjsMMLtxCsw5q0qC3CeKXs8uJeFsjRdDpDOe2Z+QjBGVb5lMKzaG5AVcW9wR/xR71xoezNE0=; 5:nvlIFkxFfFIeWmnTNgpfzULjGvZ8cRldLucDH7SbB4w4wBpllaRfcGiKliFpjSrO2Q/m61vf4RAcNbiaBwWX2nRy7tdt8ecyXsdiEMO8VnOJ2vUJy83r9EXJ2NO4bVZyKHOwU29EUTZa/CqlwTOlqzyX8pX+28mHmj4qOzfHhK0=; 24:iGzsTpdq8dpCuoDerHnVyjhTRHt0+hZ18j2HdpY4QPJmmM4gnj4vsZAi4XdgIG80xu9KzYWAZghN7cTivj0ZDJWAWucxeQOf6TJrz+FXNwQ=; 7:aTpF9sxmlu4VX6OP3NXW1H2Rc1xJAPJo3ua3j964R98eSKDR98Ul0gC4LWatwJ0Td2mxrydYJ/rFvb6wXQv6hKaMNjCAS0i2geaMB6eB+xjklWlpCGxcZ4mvjb/mHtFQuNcBDyW1PPvtrE7aHfwxDMZn9bA6UvD9eybT4a+uyEZFrHDmFNWilQ3psKHgz+E6fOS21kCR8KHkvU28PbFs2kzOGk4NQejIW1Rm4TV3fKId4eh96lBqutVJgtfcfy3f x-incomingheadercount: 45 x-eopattributedmessage: 0 x-microsoft-antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(201702061074)(5061506573)(5061507331)(1603103135)(2017031320274)(2017031324274)(2017031323274)(201702181274)(2017031322404)(1603101448)(1601125374)(1701031045); SRVR:DM3NAM03HT129; x-ms-exchange-slblob-mailprops: +LiGfBxqLEvlgu6+AwO4YSg/JLtxBSblijtr40Zzj+hNj9C1X+vG2zdU58N52vjF+PX/XDGaBhvFvhx7nf+so1p7hYoFUJI0329KCFMfFZUN1SLevusXIDhhW5lv7hBX3zsba7XBpmjELnJOA91tXbi+M10gECpBYlApav042AQfWozhreGIppy+sC31xiP5LhGGCeFPt1u8KtpZBiE7SBQ2MuorXwXFVuLSKXGPQ99znGAG0ZXB+72StStruCX66CskwmTGmWfxcVJ4Iz+Alb0S0ycz43DzZ6/h7V7gIHAMx/KMcyHm7b62SWZzzx3usUm6QC1uBBpmo+DhtmDMmtjvoE9VN5R95wBAwZPZpPEuQiK5BRqxOieX8U6LBFBKOnsHaygH+wa2SZ7RHlFg0qICRD58tfU+E/nNFsFKpM9LajFpdgxJ5KXp4+vJ/m4gHXquK/F827emuOxaaT3V30Wn8b1Uq+bHVP8PITuO4xyRYrverJtF0ZDrH0M1y+qrURdW5kgmpevghnn/HL77LedkQTD881oQHApaGgyaLJ8kyzf2iqCWXgIJb3jiGYqQ5iH7IkMzGMB2zzc2/GrHAy3/ZEqsYcqpa/pndYU6P5fDv5d9BtQwIRK5qQXmONPI8EhOHQS8QsmK/hRsd3EISew78M/LDG855dTVYwG2jETUWSLBF5zvG2VVJgyXRLG5rIhKv+6BRjj+/HtHFkhR6oWCe3cJ6ozZFWoWH1mBDj4nJvaR8TEONqDfdNU4Uhk252z7D5bkoCrRU3wIZMbBGLGxHH4w4F+A x-ms-traffictypediagnostic: DM3NAM03HT129: x-ms-office365-filtering-correlation-id: daadf9d1-7e8f-45b8-9da3-08d55d567595 x-exchange-antispam-report-cfa-test: BCL:0; PCL:0; RULEID:(444000031); SRVR:DM3NAM03HT129; BCL:0; PCL:0; RULEID:(100000803101)(100110400095); SRVR:DM3NAM03HT129; x-forefront-prvs: 0555EC8317 x-forefront-antispam-report: SFV:NSPM; SFS:(7070007)(98901004); DIR:OUT; SFP:1901; SCL:1; SRVR:DM3NAM03HT129; H:DM5PR22MB0681.namprd22.prod.outlook.com; FPR:; SPF:None; LANG:; spamdiagnosticoutput: 1:99 spamdiagnosticmetadata: NSPM MIME-Version: 1.0 X-OriginatorOrg: hotmail.com X-MS-Exchange-CrossTenant-Network-Message-Id: daadf9d1-7e8f-45b8-9da3-08d55d567595 X-MS-Exchange-CrossTenant-originalarrivaltime: 17 Jan 2018 03:00:27.2853 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Internet X-MS-Exchange-CrossTenant-id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM3NAM03HT129 Subject: [FFmpeg-devel] [PATCH 2/3] libavformat/dashdec: Fix for ticket 6658 (Dash demuxer segfault) 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: Colin NG Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" - Add function 'resolve_content_path' to propagate the baseURL from upper level nodes. * if no baseURL is available, the path of mpd file will be set as the baseURL. - Remove checking for newly established connection. - Establish the communication protocol in each connection rather than applying one protocol to all connection. --- libavformat/dashdec.c | 128 +++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 115 insertions(+), 13 deletions(-) diff --git a/libavformat/dashdec.c b/libavformat/dashdec.c index 67a92d6..1d520d4 100644 --- a/libavformat/dashdec.c +++ b/libavformat/dashdec.c @@ -149,6 +149,11 @@ typedef struct DASHContext { AVDictionary *avio_opts; } DASHContext; +static int ishttp(char *url) { + const char *proto_name = avio_find_protocol_name(url); + return av_strstart(proto_name, "http", NULL); +} + static uint64_t get_current_time_in_sec(void) { return av_gettime() / 1000000; @@ -420,7 +425,8 @@ static int open_url(AVFormatContext *s, AVIOContext **pb, const char *url, else if (strcmp(proto_name, "file") || !strncmp(url, "file,", 5)) return AVERROR_INVALIDDATA; - ret = s->io_open(s, pb, url, AVIO_FLAG_READ, &tmp); + av_freep(pb); + ret = avio_open2(pb, url, AVIO_FLAG_READ, c->interrupt_callback, &tmp); if (ret >= 0) { // update cookies on http response with setcookies. char *new_cookies = NULL; @@ -564,6 +570,7 @@ static struct fragment * get_Fragment(char *range) seg->url_offset = strtoll(str_offset, NULL, 10); seg->size = strtoll(str_end_offset, NULL, 10) - seg->url_offset; } + return seg; } @@ -591,6 +598,7 @@ static int parse_manifest_segmenturlnode(AVFormatContext *s, struct representati rep_id_val, rep_bandwidth_val, initialization_val); + if (!rep->init_section->url) { av_free(rep->init_section); xmlFree(initialization_val); @@ -665,6 +673,105 @@ static int parse_manifest_segmenttimeline(AVFormatContext *s, struct representat return 0; } +static int resolve_content_path(AVFormatContext *s, const char *url, xmlNodePtr *baseurl_nodes, int n_baseurl_nodes) { + + char *tmp_str = NULL; + char *path = NULL; + char *mpdName = NULL; + xmlNodePtr node = NULL; + char *baseurl = NULL; + char *root_url = NULL; + char *text = NULL; + + int isRootHttp = 0; + char token ='/'; + int start = 0; + int rootId = 0; + int updated = 0; + int size = 0; + int i; + int max_url_size = strlen(url); + + for (i = n_baseurl_nodes-1; i >= 0 ; i--) { + text = xmlNodeGetContent(baseurl_nodes[i]); + if (!text) + continue; + max_url_size += strlen(text); + if (ishttp(text)) { + xmlFree(text); + break; + } + xmlFree(text); + } + + text = av_mallocz(max_url_size); + if (!text) { + updated = AVERROR(ENOMEM); + goto end; + } + av_strlcpy(text, url, strlen(url)+1); + while (mpdName = av_strtok(text, "/", &text)) { + size = strlen(mpdName); + } + + path = av_mallocz(max_url_size); + tmp_str = av_mallocz(max_url_size); + if (!tmp_str || !path) { + updated = AVERROR(ENOMEM); + goto end; + } + + av_strlcpy (path, url, strlen(url) - size + 1); + for (rootId = n_baseurl_nodes - 1; rootId > 0; rootId --) { + if (!(node = baseurl_nodes[rootId])) { + continue; + } + if (ishttp(xmlNodeGetContent(node))) { + break; + } + } + + node = baseurl_nodes[rootId]; + baseurl = xmlNodeGetContent(node); + root_url = (av_strcasecmp(baseurl, "")) ? baseurl : path; + if (node) { + xmlNodeSetContent(node, root_url); + updated = 1; + } + + size = strlen(root_url); + isRootHttp = ishttp(root_url); + + if (root_url[size - 1] != token) { + av_strlcat(root_url, "/", size + 2); + size += 2; + } + + for (i = 0; i < n_baseurl_nodes; ++i) { + if (i == rootId) { + continue; + } + text = xmlNodeGetContent(baseurl_nodes[i]); + if (text) { + memset(tmp_str, 0, strlen(tmp_str)); + if (!ishttp(text) && isRootHttp) { + av_strlcpy(tmp_str, root_url, size + 1); + } + start = (text[0] == token); + av_strlcat(tmp_str, text + start, max_url_size); + xmlNodeSetContent(baseurl_nodes[i], tmp_str); + updated = 1; + xmlFree(text); + } + } + +end: + av_free(path); + av_free(tmp_str); + return updated; + +} + static int parse_manifest_representation(AVFormatContext *s, const char *url, xmlNodePtr node, xmlNodePtr adaptionset_node, @@ -727,6 +834,10 @@ static int parse_manifest_representation(AVFormatContext *s, const char *url, baseurl_nodes[2] = adaptionset_baseurl_node; baseurl_nodes[3] = representation_baseurl_node; + ret = resolve_content_path(s, url, baseurl_nodes, 4); + if (ret == AVERROR(ENOMEM) || (ret == 0)) { + goto end; + } if (representation_segmenttemplate_node || fragment_template_node || period_segmenttemplate_node) { fragment_timeline_node = NULL; fragment_templates_tab[0] = representation_segmenttemplate_node; @@ -1038,6 +1149,9 @@ static int parse_manifest(AVFormatContext *s, const char *url, AVIOContext *in) } mpd_baseurl_node = find_child_node_by_name(node, "BaseURL"); + if (!mpd_baseurl_node) { + mpd_baseurl_node = xmlNewNode(NULL, "BaseURL"); + } // at now we can handle only one period, with the longest duration node = xmlFirstElementChild(node); @@ -1405,18 +1519,6 @@ static int open_input(DASHContext *c, struct representation *pls, struct fragmen goto cleanup; } - /* Seek to the requested position. If this was a HTTP request, the offset - * should already be where want it to, but this allows e.g. local testing - * without a HTTP server. */ - if (!ret && seg->url_offset) { - int64_t seekret = avio_seek(pls->input, seg->url_offset, SEEK_SET); - if (seekret < 0) { - av_log(pls->parent, AV_LOG_ERROR, "Unable to seek to offset %"PRId64" of DASH fragment '%s'\n", seg->url_offset, seg->url); - ret = (int) seekret; - ff_format_io_close(pls->parent, &pls->input); - } - } - cleanup: av_dict_free(&opts); pls->cur_seg_offset = 0;