[FFmpeg-devel] [PATCH] http: try to detect live akamai streams and dont enable seeking for them
Reimar Döffinger
Reimar.Doeffinger at gmx.de
Mon Jun 4 07:45:48 CEST 2012
On 4 Jun 2012, at 02:28, Michael Niedermayer <michaelni at gmx.at> wrote:
> On Mon, Jun 04, 2012 at 02:25:57AM +0200, Michael Niedermayer wrote:
>> On Sun, Jun 03, 2012 at 10:38:14PM +0200, Reimar Döffinger wrote:
>>> On Sun, Jun 03, 2012 at 06:43:33PM +0200, Clément Bœsch wrote:
>>>> On Sun, Jun 03, 2012 at 06:36:34PM +0200, Michael Niedermayer wrote:
>>>>> Fixes ticket1320
>>>>>
>>>>> Signed-off-by: Michael Niedermayer <michaelni at gmx.at>
>>>>> ---
>>>>> libavformat/http.c | 6 +++++-
>>>>> 1 file changed, 5 insertions(+), 1 deletion(-)
>>>>>
>>>>> diff --git a/libavformat/http.c b/libavformat/http.c
>>>>> index 9a5ca62..28a777c 100644
>>>>> --- a/libavformat/http.c
>>>>> +++ b/libavformat/http.c
>>>>> @@ -57,6 +57,7 @@ typedef struct {
>>>>> int multiple_requests; /**< A flag which indicates if we use persistent connections. */
>>>>> uint8_t *post_data;
>>>>> int post_datalen;
>>>>> + int is_akamai;
>>>>> } HTTPContext;
>>>>>
>>>>> #define OFFSET(x) offsetof(HTTPContext, x)
>>>>> @@ -318,7 +319,8 @@ static int process_line(URLContext *h, char *line, int line_count,
>>>>> if ((slash = strchr(p, '/')) && strlen(slash) > 0)
>>>>> s->filesize = atoll(slash+1);
>>>>> }
>>>>> - h->is_streamed = 0; /* we _can_ in fact seek */
>>>>> + if (!s->is_akamai || s->filesize != 2147483647)
>>>>> + h->is_streamed = 0; /* we _can_ in fact seek */
>>>>> } else if (!av_strcasecmp(tag, "Accept-Ranges") && !strncmp(p, "bytes", 5)) {
>>>>> h->is_streamed = 0;
>>>>> } else if (!av_strcasecmp (tag, "Transfer-Encoding") && !av_strncasecmp(p, "chunked", 7)) {
>>>>> @@ -333,6 +335,8 @@ static int process_line(URLContext *h, char *line, int line_count,
>>>>> } else if (!av_strcasecmp (tag, "Connection")) {
>>>>> if (!strcmp(p, "close"))
>>>>> s->willclose = 1;
>>>>> + } else if (!av_strcasecmp (tag, "Server") && !av_strcasecmp (p, "AkamaiGHost")) {
>>>>> + s->is_akamai = 1;
>>>>> }
>>>>> }
>>>>
>>>> This reminds me of a similar issue Reimar fixed in MPlayer by adding
>>>> another exception (IIRC it was Youtube); this might be a fairly common
>>>> issue with some webservers, so maybe a more generic attribute could be
>>>> used? (broken_httpserver or something).
>>>
>>> I'm not sure if FFmpeg's http implementation can detect it in some other
>>> way, however it is true that in MPlayer we have two other broken cases
>>> (and we lack this one). YouTube and MakeMKV are those.
>>> (see stream/http.c:758).
>>
>> do you have testcases for the 2 ?
>> so we can check if ffmpeg needs such checks too ?
>
> s/we/i/
Not sure about YouTube, though I guess any video would have to do?
For MakeMKV you'd probably need a BluRay and run MakeMKV in web sever mode...
Note that these behave the other way round: the don't claim accept-ranges but you can actually seek. I think you can figure them out by making the original request for Range 0- and see that they actually accept that and answer with the proper Content-Range.
More information about the ffmpeg-devel
mailing list