#include <string.h>
#include "libavutil/intreadwrite.h"
#include "libavutil/avstring.h"
+#include "libavutil/opt.h"
#include "internal.h"
#include "mms.h"
#include "asf.h"
// see Ref 2.2.1.8
#define USERAGENT "User-Agent: NSPlayer/4.1.0.3856\r\n"
// see Ref 2.2.1.4.33
-// the guid value can be changed to any valid value.
+// the GUID value can be changed to any valid value.
#define CLIENTGUID "Pragma: xClientGUID={c77e7400-738a-11d2-9add-0020af0a3278}\r\n"
// see Ref 2.2.3 for packet type define:
CHUNK_TYPE_STREAM_CHANGE = 0x4324,
} ChunkType;
-typedef struct {
+typedef struct MMSHContext {
MMSContext mms;
int request_seq; ///< request packet sequence
int chunk_seq; ///< data packet sequence
ffurl_close(mms->mms_hd);
av_free(mms->streams);
av_free(mms->asf_header);
- av_freep(&h->priv_data);
return 0;
}
return AVERROR(EIO);
}
res = ffurl_read_complete(mms->mms_hd, mms->in_buffer, len);
- av_dlog(NULL, "Data packet len = %d\n", len);
+ av_log(NULL, AV_LOG_TRACE, "Data packet len = %d\n", len);
if (res != len) {
av_log(NULL, AV_LOG_ERROR, "Read data packet failed!\n");
return AVERROR(EIO);
if (mms->asf_header) {
if (len != mms->asf_header_size) {
mms->asf_header_size = len;
- av_dlog(NULL, "Header len changed from %d to %d\n",
+ av_log(NULL, AV_LOG_TRACE, "Header len changed from %d to %d\n",
mms->asf_header_size, len);
av_freep(&mms->asf_header);
}
av_log(NULL, AV_LOG_ERROR, "Read other chunk type data failed!\n");
return AVERROR(EIO);
} else {
- av_dlog(NULL, "Skip chunk type %d \n", chunk_type);
+ av_log(NULL, AV_LOG_TRACE, "Skip chunk type %d \n", chunk_type);
continue;
}
}
}
}
- return 0;
}
static int mmsh_open(URLContext *h, const char *uri, int flags)
char httpname[256], path[256], host[128], location[1024];
char *stream_selection = NULL;
char headers[1024];
- MMSHContext *mmsh;
+ MMSHContext *mmsh = h->priv_data;
MMSContext *mms;
- mmsh = h->priv_data = av_mallocz(sizeof(MMSHContext));
- if (!h->priv_data)
- return AVERROR(ENOMEM);
mmsh->request_seq = h->is_streamed = 1;
mms = &mmsh->mms;
av_strlcpy(location, uri, sizeof(location));
port = 80; // default mmsh protocol port
ff_url_join(httpname, sizeof(httpname), "http", NULL, host, port, "%s", path);
- if (ffurl_alloc(&mms->mms_hd, httpname, AVIO_FLAG_READ) < 0) {
+ if (ffurl_alloc(&mms->mms_hd, httpname, AVIO_FLAG_READ,
+ &h->interrupt_callback, h->protocols) < 0) {
return AVERROR(EIO);
}
CLIENTGUID
"Connection: Close\r\n\r\n",
host, port, mmsh->request_seq++);
- ff_http_set_headers(mms->mms_hd, headers);
+ av_opt_set(mms->mms_hd->priv_data, "headers", headers, 0);
- err = ffurl_connect(mms->mms_hd);
+ err = ffurl_connect(mms->mms_hd, NULL);
if (err) {
goto fail;
}
// close the socket and then reopen it for sending the second play request.
ffurl_close(mms->mms_hd);
memset(headers, 0, sizeof(headers));
- if (ffurl_alloc(&mms->mms_hd, httpname, AVIO_FLAG_READ) < 0) {
- return AVERROR(EIO);
+ if ((err = ffurl_alloc(&mms->mms_hd, httpname, AVIO_FLAG_READ,
+ &h->interrupt_callback, h->protocols)) < 0) {
+ goto fail;
}
stream_selection = av_mallocz(mms->stream_num * 19 + 1);
if (!stream_selection)
av_log(NULL, AV_LOG_ERROR, "Build play request failed!\n");
goto fail;
}
- av_dlog(NULL, "out_buffer is %s", headers);
- ff_http_set_headers(mms->mms_hd, headers);
+ av_log(NULL, AV_LOG_TRACE, "out_buffer is %s", headers);
+ av_opt_set(mms->mms_hd->priv_data, "headers", headers, 0);
- err = ffurl_connect(mms->mms_hd);
+ err = ffurl_connect(mms->mms_hd, NULL);
if (err) {
goto fail;
}
goto fail;
}
- av_dlog(NULL, "Connection successfully open\n");
+ av_log(NULL, AV_LOG_TRACE, "Connection successfully open\n");
return 0;
fail:
av_freep(&stream_selection);
mmsh_close(h);
- av_dlog(NULL, "Connection failed with error %d\n", err);
+ av_log(NULL, AV_LOG_TRACE, "Connection failed with error %d\n", err);
return err;
}
return res;
}
-URLProtocol ff_mmsh_protocol = {
- .name = "mmsh",
- .url_open = mmsh_open,
- .url_read = mmsh_read,
- .url_write = NULL,
- .url_seek = NULL,
- .url_close = mmsh_close,
+const URLProtocol ff_mmsh_protocol = {
+ .name = "mmsh",
+ .url_open = mmsh_open,
+ .url_read = mmsh_read,
+ .url_close = mmsh_close,
+ .priv_data_size = sizeof(MMSHContext),
+ .flags = URL_PROTOCOL_FLAG_NETWORK,
};