summaryrefslogtreecommitdiff
path: root/libavformat/mmsh.c
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2013-07-07 18:39:07 +0200
committerMichael Niedermayer <michaelni@gmx.at>2013-07-07 18:50:03 +0200
commitbe25614177ef98b7e9a347baddaf139a917c4710 (patch)
treedab315c80c9c940c61d74c21ea033b68fb7930b7 /libavformat/mmsh.c
parentc7cfd4cce98a858c08e880ac7075737c78f98be8 (diff)
mmsh: reimplement seeking
Fixes Ticket2682 Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavformat/mmsh.c')
-rw-r--r--libavformat/mmsh.c33
1 files changed, 17 insertions, 16 deletions
diff --git a/libavformat/mmsh.c b/libavformat/mmsh.c
index 358d40fb23..482ece4031 100644
--- a/libavformat/mmsh.c
+++ b/libavformat/mmsh.c
@@ -309,16 +309,14 @@ static int mmsh_open_internal(URLContext *h, const char *uri, int flags, int tim
return 0;
fail:
av_freep(&stream_selection);
+ mmsh_close(h);
av_dlog(NULL, "Connection failed with error %d\n", err);
return err;
}
static int mmsh_open(URLContext *h, const char *uri, int flags)
{
- int ret = mmsh_open_internal(h, uri, flags, 0, 0);
- if (ret < 0)
- mmsh_close(h);
- return ret;
+ return mmsh_open_internal(h, uri, flags, 0, 0);
}
static int handle_chunk_type(MMSHContext *mmsh)
@@ -370,23 +368,26 @@ static int mmsh_read(URLContext *h, uint8_t *buf, int size)
static int64_t mmsh_read_seek(URLContext *h, int stream_index,
int64_t timestamp, int flags)
{
- MMSHContext *mmsh = h->priv_data;
- MMSContext *mms = &mmsh->mms;
+ MMSHContext *mmsh_old = h->priv_data;
+ MMSHContext *mmsh = av_mallocz(sizeof(*mmsh));
int ret;
- ret= mmsh_open_internal(h, mmsh->location, 0, FFMAX(timestamp, 0), 0);
+ if (!mmsh)
+ return AVERROR(ENOMEM);
+ h->priv_data = mmsh;
+ ret= mmsh_open_internal(h, mmsh_old->location, 0, FFMAX(timestamp, 0), 0);
if(ret>=0){
- if (mms->mms_hd)
- ffurl_close(mms->mms_hd);
- av_freep(&mms->streams);
- av_freep(&mms->asf_header);
+ h->priv_data = mmsh_old;
+ mmsh_close(h);
+ h->priv_data = mmsh;
+ av_free(mmsh_old);
+ mmsh->mms.asf_header_read_size = mmsh->mms.asf_header_size;
+ }else {
+ h->priv_data = mmsh_old;
av_free(mmsh);
- mmsh = h->priv_data;
- mms = &mmsh->mms;
- mms->asf_header_read_size= mms->asf_header_size;
- }else
- h->priv_data= mmsh;
+ }
+
return ret;
}