summaryrefslogtreecommitdiff
path: root/libavformat/http.c
diff options
context:
space:
mode:
authorwm4 <nfxjfg@googlemail.com>2013-11-03 18:17:45 +0100
committerMichael Niedermayer <michaelni@gmx.at>2013-11-03 22:57:56 +0100
commit3220a894f794607efab96ec3837e4c64f19f75ea (patch)
tree05d1205644048bcbbdc792abcae5462a578c5693 /libavformat/http.c
parent336a1902d6be08c2f25fe0f15722f7c65f060866 (diff)
http: add hack to make streams served by MediaGateway not seekable
These streams are reported as seekable, but all tests show they are not, and the server merely pretends the streams are seekable. The server responds with: content-range: bytes 0-1999999999/2000000000 Range requests seem to be correctly answered, but the actual data returned at the same offset is different. Assume this is a bug in the server software. The server identifies itself as: Server: MediaGateway 3.5.2-001 Add a hack that checks the server name, and disables seeking in this case. Test URL: http://8283.live.streamtheworld.com:80/CBC_R1_VCR_H_SC Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavformat/http.c')
-rw-r--r--libavformat/http.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/libavformat/http.c b/libavformat/http.c
index 9be1181f30..72834774fe 100644
--- a/libavformat/http.c
+++ b/libavformat/http.c
@@ -68,6 +68,7 @@ typedef struct {
uint8_t *post_data;
int post_datalen;
int is_akamai;
+ int is_mediagateway;
char *mime_type;
char *cookies; ///< holds newline (\n) delimited Set-Cookie header field values (without the "Set-Cookie: " field name)
int icy;
@@ -386,8 +387,12 @@ 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;
+ } else if (!av_strcasecmp (tag, "Server")) {
+ if (!av_strcasecmp (p, "AkamaiGHost")) {
+ s->is_akamai = 1;
+ } else if (!av_strncasecmp (p, "MediaGateway", 12)) {
+ s->is_mediagateway = 1;
+ }
} else if (!av_strcasecmp (tag, "Content-Type")) {
av_free(s->mime_type); s->mime_type = av_strdup(p);
} else if (!av_strcasecmp (tag, "Set-Cookie")) {
@@ -570,6 +575,9 @@ static int http_read_header(URLContext *h, int *new_location)
s->line_count++;
}
+ if (s->seekable == -1 && s->is_mediagateway && s->filesize == 2000000000)
+ h->is_streamed = 1; /* we can in fact _not_ seek */
+
return err;
}