Re: Issue with "bytes" Range Unit and live streaming

Craig Pratt <craig@ecaspia.com> Mon, 18 April 2016 20:34 UTC

Return-Path: <ietf-http-wg-request+bounce-httpbisa-archive-bis2juki=lists.ie@listhub.w3.org>
X-Original-To: ietfarch-httpbisa-archive-bis2Juki@ietfa.amsl.com
Delivered-To: ietfarch-httpbisa-archive-bis2Juki@ietfa.amsl.com
Received: from localhost (localhost [127.0.0.1]) by ietfa.amsl.com (Postfix) with ESMTP id C54AD12D765 for <ietfarch-httpbisa-archive-bis2Juki@ietfa.amsl.com>; Mon, 18 Apr 2016 13:34:12 -0700 (PDT)
X-Virus-Scanned: amavisd-new at amsl.com
X-Spam-Flag: NO
X-Spam-Score: -7.183
X-Spam-Level:
X-Spam-Status: No, score=-7.183 tagged_above=-999 required=5 tests=[BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, HEADER_FROM_DIFFERENT_DOMAINS=0.001, HTML_MESSAGE=0.001, MIME_HTML_ONLY=0.723, RCVD_IN_DNSWL_HI=-5, RCVD_IN_MSPIKE_H3=-0.01, RCVD_IN_MSPIKE_WL=-0.01, RP_MATCHES_RCVD=-0.996, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001, T_KAM_HTML_FONT_INVALID=0.01] autolearn=ham autolearn_force=no
Authentication-Results: ietfa.amsl.com (amavisd-new); dkim=pass (2048-bit key) header.d=ecaspia-com.20150623.gappssmtp.com
Received: from mail.ietf.org ([4.31.198.44]) by localhost (ietfa.amsl.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id p9WQzC9UTKlg for <ietfarch-httpbisa-archive-bis2Juki@ietfa.amsl.com>; Mon, 18 Apr 2016 13:34:10 -0700 (PDT)
Received: from frink.w3.org (frink.w3.org [128.30.52.56]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by ietfa.amsl.com (Postfix) with ESMTPS id B5E1912D6D2 for <httpbisa-archive-bis2Juki@lists.ietf.org>; Mon, 18 Apr 2016 13:34:10 -0700 (PDT)
Received: from lists by frink.w3.org with local (Exim 4.80) (envelope-from <ietf-http-wg-request@listhub.w3.org>) id 1asFng-0001hY-K4 for ietf-http-wg-dist@listhub.w3.org; Mon, 18 Apr 2016 20:29:40 +0000
Resent-Date: Mon, 18 Apr 2016 20:29:40 +0000
Resent-Message-Id: <E1asFng-0001hY-K4@frink.w3.org>
Received: from lisa.w3.org ([128.30.52.41]) by frink.w3.org with esmtps (TLS1.2:DHE_RSA_AES_128_CBC_SHA1:128) (Exim 4.80) (envelope-from <craig@caspiaconsulting.com>) id 1asFna-0001gO-45 for ietf-http-wg@listhub.w3.org; Mon, 18 Apr 2016 20:29:34 +0000
Received: from mail-pf0-f171.google.com ([209.85.192.171]) by lisa.w3.org with esmtps (TLS1.2:RSA_ARCFOUR_SHA1:128) (Exim 4.80) (envelope-from <craig@caspiaconsulting.com>) id 1asFnX-0007aM-Pl for ietf-http-wg@w3.org; Mon, 18 Apr 2016 20:29:33 +0000
Received: by mail-pf0-f171.google.com with SMTP id 184so84621805pff.0 for <ietf-http-wg@w3.org>; Mon, 18 Apr 2016 13:29:11 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ecaspia-com.20150623.gappssmtp.com; s=20150623; h=subject:to:references:cc:from:organization:message-id:date :user-agent:mime-version:in-reply-to:content-transfer-encoding; bh=HhS6nraPaEbzJ6qWv3sjcTsp6FRfMPaPJq6EnHnoxiI=; b=kZQuyOsjuQlFO7+mYV3TZyKviNIic+m0FcuQXH6lMXlAYGHiCpeRL9HPxi3gqRFR6o TCZfodcQD8VjzeUH92zCTlnk5NVpOLpZ08Od3WTajs8AAR5mQp9b6B7es/4U5t/A3QpO uTgJtME72CcqqQLsK1Qp6brO7qSFv9moQoRhlA0AKH0hsB28SLazn6/kupGT/DFhV9p7 rgr6er6jkziJjVyBwc6yEV1kry7x2BimN5CUQ58cusJrCADpNNFOye8PoSGfXD3LVROA m971tmrIVvCik2tW+Ig6AxWF35mU/ZKcwjQ2jBDOxRQ8yLIvGXPVIDxcf2dt+g85rsHk OYKA==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:subject:to:references:cc:from:organization :message-id:date:user-agent:mime-version:in-reply-to :content-transfer-encoding; bh=HhS6nraPaEbzJ6qWv3sjcTsp6FRfMPaPJq6EnHnoxiI=; b=YX30fAlaNiGSGhbtjj6AAae3zq0iDQCdGnhMkGpoa+m354EjA+9sqn6I8q0vd/PhYM L/nJtxrzXY8lXgz13/HVIYNXTzaMUsPxkfmI7Y7oPFrX611bdYf0KN96JaYDPKN2CzjG 0XH0Bciziwc1YUQviY2OxNDNE3k4YovW7jns95QKkoGwMpIaioxkf0v4YULh/U93twWF YTWvmyl1I7Hf7ECyJUjGuQH6h5hzBBqdXTnzHYxHEcWaC+nTHlf9QVfJCDfrpGW1xtAW VL4RhDqV8t90oPpJV/n6YDRIskWDoE9Q1fmvokc07wUIsnfMntVp71SLzySHBQCx8Va6 S/GQ==
X-Gm-Message-State: AOPr4FVzmBAMCrTFONWTiDsITa1KX7pP1c8JOfY7KtqYeGMcfmHr8T0Z5rJixDwPUsxMGw==
X-Received: by 10.98.42.150 with SMTP id q144mr52421477pfq.73.1461011345330; Mon, 18 Apr 2016 13:29:05 -0700 (PDT)
Received: from [10.10.1.104] (50-193-209-61-static.hfc.comcastbusiness.net. [50.193.209.61]) by smtp.googlemail.com with ESMTPSA id f17sm6770079pfj.60.2016.04.18.13.29.03 (version=TLSv1/SSLv3 cipher=OTHER); Mon, 18 Apr 2016 13:29:04 -0700 (PDT)
To: Thorsten Lohmar <thorsten.lohmar@ericsson.com>, "K.Morgan@iaea.org" <K.Morgan@iaea.org>, "fielding@gbiv.com" <fielding@gbiv.com>
References: <57102718.7010900@ecaspia.com> <571041E0.5020401@lebeausoftware.org> <2D09D61DDFA73D4C884805CC7865E61142655F7B@GAALPA1MSGUSRBF.ITServices.sbc.com> <D3370313.258AE%goran.ap.eriksson@ericsson.com> <57114878.1030606@ecaspia.com> <43C1ECE7-139E-4FC8-A46D-83887261B7BC@gbiv.com> <6AB4CBAA-E79D-4DAC-818D-65383B85B81B@gbiv.com> <0356EBBE092D394F9291DA01E8D28EC2021CEBE9AC@SEM001PD.sg.iaea.org> <5714A316.1080609@ecaspia.com> <9E953B010F1E974399030905C5DCB2E7183D2D4B@ESESSMB101.ericsson.se>
Cc: Göran Eriksson AP <goran.ap.eriksson@ericsson.com>, "bs7652@att.com" <bs7652@att.com>, "remy@lebeausoftware.org" <remy@lebeausoftware.org>, "ietf-http-wg@w3.org" <ietf-http-wg@w3.org>, "rodger@plexapp.com" <rodger@plexapp.com>, "julian.reschke@gmx.de" <julian.reschke@gmx.de>, "C.Brunhuber@iaea.org" <C.Brunhuber@iaea.org>, Darshak Thakore <d.thakore@cablelabs.com>, "STARK, BARBARA H" <bs7652@att.com>
From: Craig Pratt <craig@ecaspia.com>
Organization: Caspia Consulting
Message-ID: <5715438F.4030100@ecaspia.com>
Date: Mon, 18 Apr 2016 13:29:03 -0700
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:38.0) Gecko/20100101 Thunderbird/38.6.0
MIME-Version: 1.0
In-Reply-To: <9E953B010F1E974399030905C5DCB2E7183D2D4B@ESESSMB101.ericsson.se>
Content-Type: text/html; charset="windows-1252"
Content-Transfer-Encoding: 8bit
Received-SPF: pass client-ip=209.85.192.171; envelope-from=craig@caspiaconsulting.com; helo=mail-pf0-f171.google.com
X-W3C-Hub-Spam-Status: No, score=-3.9
X-W3C-Hub-Spam-Report: BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, HTML_MESSAGE=0.001, MIME_HTML_ONLY=0.723, RCVD_IN_DNSWL_LOW=-0.7, SPF_PASS=-0.001, W3C_AA=-1, W3C_WL=-1
X-W3C-Scan-Sig: lisa.w3.org 1asFnX-0007aM-Pl d960b3917cc26149fb1d58fbbebcc083
X-Original-To: ietf-http-wg@w3.org
Subject: Re: Issue with "bytes" Range Unit and live streaming
Archived-At: <http://www.w3.org/mid/5715438F.4030100@ecaspia.com>
Resent-From: ietf-http-wg@w3.org
X-Mailing-List: <ietf-http-wg@w3.org> archive/latest/31494
X-Loop: ietf-http-wg@w3.org
Resent-Sender: ietf-http-wg-request@w3.org
Precedence: list
List-Id: <ietf-http-wg.w3.org>
List-Help: <http://www.w3.org/Mail/>
List-Post: <mailto:ietf-http-wg@w3.org>
List-Unsubscribe: <mailto:ietf-http-wg-request@w3.org?subject=unsubscribe>

[cc-ing the co-authors]

Hi Thorsten,

I'm happy to help provide whatever answers I can.

Reply in-line.

cp

On 4/18/16 8:10 AM, Thorsten Lohmar wrote:

Hi Craig, all,

 

My colleague Göran asked me some question around the problem and I would like to raise these questions directly to you. Of course, there are some alternative solutions available, where the client can work out the different things from a manifest. But you seem to look for a simple solution, which works with non-segmented media on a single HTTP session.

 

When I understood it correctly, an HTTP server is making a live stream available using HTTP. A normal live stream can be opened with a single HTTP request and the server can serve data “from the live point” either with or without HTTP chunked delivery. The server cannot give a Content-Length, since this is an ongoing live stream of unknown size.

[cp] all correct.

 

Your use-case seem to be about recording of content. Client should access content from the recorded part, but should be able to jump to the live-point. I assume that you are not looking into sliding window recordings (i.e. timeshift). I assume that the a single program is continuous recording and the HTTP object is growing until the end of the live session, correct?

[cp] I didn't spell it out in the draft, but I would like to consider adding clarifications for the time-shift cases. This should just be a matter of a Client requesting one thing and getting another. e.g. "Range: bytes-live=0-*" results in "Content-Range: bytes-live 123456-*". In either case, you're correct: the end of the representation is moving forward in time until the end of the live session.

 

In any case, how does the client know “good” byte range offsets (i.e. service access points) to tune into the recording? Or is the assumption, that the client can synchronize to the media stream from any byte range?

[cp] For byte-level access, random access implementation is up to the client. For some containers this is easier than others. e.g. For MP4, the random access points can be established by reading the movie and fragment header(s). For something like MP2, it's trickier of course.

[cp] One major feature this draft allows is for retrieval of bytes just preceding the live point. So for example, a client can do a Range head request like "Range: bytes=0-", get a "Content-Range: bytes 0-1234567/*", then perform something like a "Range: bytes-live=1200000-*", and prime its framebuffer with 34567 bytes of data that precede the live point - allowing for the client to find an access point (e.g. mpeg2 start codes) and to allow live presentation to display much sooner than it would from the live point (without random access).

 

How should the client know, which byte ranges are already available on the server? When the client is playing back from the recorded part and would like to skip 5min forward, how does the client know, whether a normal range request is needed or whether the client should as for the live point? What type of HTTP Status code should be provided, when the range request is not yet available of the server?

[cp] We're not trying to come up with a universal solution for performing time-based seek on all media formats with this draft. So some of this is out of scope. But let me see if I can fill in some of the blanks.

[cp] Some applications of media streaming have time-based indexing facilities built-in. e.g. MP4 (ISO BMFF) containers allow time and data to be associated using the various internal, mandatory metadata "boxes". In other cases, applications may provide a separate resource that contains time-to-byte mappings (e.g. content index files). In either case, there's a facility for mapping time offsets to byte offsets - or sometimes the client incorporates heuristics to perform time skips (e.g. VLC will do this on some file formats).

[cp] In all these cases, there's some mechanism that maps time offsets to byte offsets.

[cp] When it comes to the available byte range, a client can know what data range is available by utilizing a HEAD request with a "Range: bytes=0-". The "Content-Range" response can contain something like "Content-Range: bytes 0-1234567/*" which tells the client both the current randomly accessible content range (via the "0-1234567") and that the content is of indeterminate length (via the "*").

[cp] Putting this all together, a client would implement a 5-minute skip by:
    (1) Adding 5 minutes to your current play time,
    (2) determining the byte offset for that given time using the appropriate index/heuristic (e.g. "3456789"),
    (3) if the time is outside the index, jump to the live point and update the time to the last-index time or other means (e.g. using "Range: bytes-live=340000-*" to pre-buffer/pre-prime the frame/sample buffer),
    (4) if the time is inside the index, either perform a standard bytes Range request to retrieve an implementation-specific quantum of time or data (e.g. "Range: bytes=3456789-3556789") and render.

[cp] Again, some of this is out of scope, but I hope that clarifies a common use case.

[cp] Regarding the status code, RFC7233 (section 4.4) indicates that code 416 (Range Not Satisfiable) must be returned when "the current extent of the selected resource or that the set of ranges requested has been rejected due to invalid ranges or an excessive request of small or overlapping ranges." This part of 4.4 applies to *all* Range requests - regardless of the Range Unit.

[cp] The bytes-live draft then goes on to say that "A bytes-live-range-specifier is considered unsatisfiable if the first-byte-pos is larger than the current length of the representation". This could probably be elaborated on a bit. But this is supposed to be the "hook" into the 4.4 language.

 

Can you please clarify the questions?

[cp] I hope I succeeded (at least partially). Apologies for the long response. I wanted to make sure I was answering your questions.

 

BR,

Thorsten

 

 

 

From: Craig Pratt [mailto:craig@ecaspia.com]
Sent: Monday, April 18, 2016 11:04 AM
To: K.Morgan@iaea.org; fielding@gbiv.com
Cc: Göran Eriksson AP; bs7652@att.com; remy@lebeausoftware.org; ietf-http-wg@w3.org; rodger@plexapp.com; julian.reschke@gmx.de; C.Brunhuber@iaea.org
Subject: Re: Issue with "bytes" Range Unit and live streaming

 

On 4/18/16 12:34 AM, K.Morgan@iaea.org wrote:

On Friday,15 April 2016 22:43, fielding@gbiv.com wrote:
Oh, never mind, now I see that you are referring to the second number being
fixed.
 
I think I would prefer that be solved by allowing last-byte-pos to be empty, just
like it is for the Range request.  I think such a fix is just as likely to be
interoperable as introducing a special range type (same failure cases).
 
....Roy
 
+1000
 
A very similar idea was proposed before [1] as an I-D [2] by Rodger Coombs. We've also brought this up informally with other members of the WG.
 
Alas, in our experience range requests don't seem to be a high priority :(  For example, the problem of combining gzip with range requests is still unsolved [3].
 
[1] https://lists.w3.org/Archives/Public/ietf-http-wg/2015AprJun/0122.html" rel="nofollow">https://lists.w3.org/Archives/Public/ietf-http-wg/2015AprJun/0122.html
[2] https://tools.ietf.org/html/draft-combs-http-indeterminate-range-01" rel="nofollow">https://tools.ietf.org/html/draft-combs-http-indeterminate-range-01
[3] https://lists.w3.org/Archives/Public/ietf-http-wg/2014AprJun/1327.html" rel="nofollow">https://lists.w3.org/Archives/Public/ietf-http-wg/2014AprJun/1327.html

[cp] Yeah, it's unfortunate that no solutions have moved forward for this widely-desired feature. I can only assume that people just started defining proprietary solutions - which is unfortunate. I'll try to be "persistent"... ;^J

[cp] As was mentioned, the issue with just arbitrarily allowing an open-ended Content-Range response (omitting last-byte-pos) is that there's no good way for a client to indicate it can support reception of a Content-Range without a last-byte-pos. So I would fully expect many clients to fail in "unpredictable ways" (disconnecting, crashing, etc).

[cp] I see that the indeterminate length proposal you referenced in your first citation introduces a "Accept-Indefinite-Ranges" header to prevent this issue. But I think this brings with it some other questions. e.g. Would this apply to any/all Range Units which may be introduced in the future? How can a Client issue a request that starts at the "live point"? It feels like it has one hand tied behind its back.

[cp] If I could, I would prefer to go back in time and advocate for an alternate ABNF for the bytes Range Unit. Seeing as that's not an option, I think using this well- and long-defined Range Unit extension mechanism seems like a good path forward as it should not create interoperability issues between clients and servers.

[cp] And I would hope adding a Range Unit would have a low/lower bar for acceptance. e.g. If a Range Unit fills a useful role, is well-defined, and isn't redundant, it seems reasonable that it should be accepted as it shouldn't impact existing HTTP/1.1 semantics. In fact, the gzip case (referenced in your third citation) seems like a perfect application of the Range Unit (better than bytes-live). If there's interest, I'll write up an RFC to demonstrate...

 
 
This email message is intended only for the use of the named recipient. Information contained in this email message and its attachments may be privileged, confidential and protected from disclosure. If you are not the intended recipient, please do not read, copy, use or disclose this communication to others. Also please notify the sender by replying to this message and then delete it from your system.

 

--

craig pratt

Caspia Consulting

craig@ecaspia.com

503.746.8008



 



--

craig pratt

Caspia Consulting

craig@ecaspia.com

503.746.8008