X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavformat%2Fmmsh.c;h=9a40002e053afeab7d0ab6d926a0d47736cca220;hb=e02de9df4b218bd6e1e927b67fd4075741545688;hp=4214b0e111cacd39f6ea47a89ba5ff7c80986d7b;hpb=37c506e8b94d2691539bc29ef861903503a99b82;p=ffmpeg diff --git a/libavformat/mmsh.c b/libavformat/mmsh.c index 4214b0e111c..9a40002e053 100644 --- a/libavformat/mmsh.c +++ b/libavformat/mmsh.c @@ -2,20 +2,20 @@ * MMS protocol over HTTP * Copyright (c) 2010 Zhentan Feng * - * This file is part of FFmpeg. + * This file is part of Libav. * - * FFmpeg is free software; you can redistribute it and/or + * Libav is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * - * FFmpeg is distributed in the hope that it will be useful, + * Libav is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with FFmpeg; if not, write to the Free Software + * License along with Libav; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ @@ -28,10 +28,12 @@ #include #include "libavutil/intreadwrite.h" #include "libavutil/avstring.h" -#include "libavformat/internal.h" +#include "libavutil/opt.h" +#include "internal.h" #include "mms.h" #include "asf.h" #include "http.h" +#include "url.h" #define CHUNK_HEADER_LENGTH 4 // 2bytes chunk type and 2bytes chunk length. #define EXT_HEADER_LENGTH 8 // 4bytes sequence, 2bytes useless and 2bytes chunk length. @@ -52,7 +54,7 @@ typedef enum { 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 @@ -63,10 +65,9 @@ static int mmsh_close(URLContext *h) MMSHContext *mmsh = (MMSHContext *)h->priv_data; MMSContext *mms = &mmsh->mms; if (mms->mms_hd) - url_close(mms->mms_hd); + ffurl_close(mms->mms_hd); av_free(mms->streams); av_free(mms->asf_header); - av_freep(&h->priv_data); return 0; } @@ -78,7 +79,7 @@ static ChunkType get_chunk_header(MMSHContext *mmsh, int *len) ChunkType chunk_type; int chunk_len, res, ext_header_len; - res = url_read_complete(mms->mms_hd, chunk_header, CHUNK_HEADER_LENGTH); + res = ffurl_read_complete(mms->mms_hd, chunk_header, CHUNK_HEADER_LENGTH); if (res != CHUNK_HEADER_LENGTH) { av_log(NULL, AV_LOG_ERROR, "Read data packet header failed!\n"); return AVERROR(EIO); @@ -100,7 +101,7 @@ static ChunkType get_chunk_header(MMSHContext *mmsh, int *len) return AVERROR_INVALIDDATA; } - res = url_read_complete(mms->mms_hd, ext_header, ext_header_len); + res = ffurl_read_complete(mms->mms_hd, ext_header, ext_header_len); if (res != ext_header_len) { av_log(NULL, AV_LOG_ERROR, "Read ext header failed!\n"); return AVERROR(EIO); @@ -117,12 +118,12 @@ static int read_data_packet(MMSHContext *mmsh, const int len) int res; if (len > sizeof(mms->in_buffer)) { av_log(NULL, AV_LOG_ERROR, - "Data packet length %d exceeds the in_buffer size %d\n", + "Data packet length %d exceeds the in_buffer size %zu\n", len, sizeof(mms->in_buffer)); return AVERROR(EIO); } - res = url_read_complete(mms->mms_hd, mms->in_buffer, len); - dprintf(NULL, "Data packet len = %d\n", len); + res = ffurl_read_complete(mms->mms_hd, mms->in_buffer, 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); @@ -147,16 +148,16 @@ static int get_http_header_data(MMSHContext *mmsh) for (;;) { len = 0; - chunk_type = get_chunk_header(mmsh, &len); - if (chunk_type < 0) { - return chunk_type; + res = chunk_type = get_chunk_header(mmsh, &len); + if (res < 0) { + return res; } else if (chunk_type == CHUNK_TYPE_ASF_HEADER){ // get asf header and stored it if (!mms->header_parsed) { if (mms->asf_header) { if (len != mms->asf_header_size) { mms->asf_header_size = len; - dprintf(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); } @@ -173,7 +174,7 @@ static int get_http_header_data(MMSHContext *mmsh) len, mms->asf_header_size); return AVERROR(EIO); } - res = url_read_complete(mms->mms_hd, mms->asf_header, len); + res = ffurl_read_complete(mms->mms_hd, mms->asf_header, len); if (res != len) { av_log(NULL, AV_LOG_ERROR, "Recv asf header data len %d != expected len %d\n", res, len); @@ -192,22 +193,21 @@ static int get_http_header_data(MMSHContext *mmsh) if (len) { if (len > sizeof(mms->in_buffer)) { av_log(NULL, AV_LOG_ERROR, - "Other packet len = %d exceed the in_buffer size %d\n", + "Other packet len = %d exceed the in_buffer size %zu\n", len, sizeof(mms->in_buffer)); return AVERROR(EIO); } - res = url_read_complete(mms->mms_hd, mms->in_buffer, len); + res = ffurl_read_complete(mms->mms_hd, mms->in_buffer, len); if (res != len) { av_log(NULL, AV_LOG_ERROR, "Read other chunk type data failed!\n"); return AVERROR(EIO); } else { - dprintf(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) @@ -216,12 +216,9 @@ 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)); @@ -230,9 +227,10 @@ static int mmsh_open(URLContext *h, const char *uri, int flags) host, sizeof(host), &port, path, sizeof(path), location); if (port<0) port = 80; // default mmsh protocol port - ff_url_join(httpname, sizeof(httpname), "http", NULL, host, port, path); + ff_url_join(httpname, sizeof(httpname), "http", NULL, host, port, "%s", path); - if (url_alloc(&mms->mms_hd, httpname, URL_RDONLY) < 0) { + if (ffurl_alloc(&mms->mms_hd, httpname, AVIO_FLAG_READ, + &h->interrupt_callback) < 0) { return AVERROR(EIO); } @@ -245,9 +243,9 @@ static int mmsh_open(URLContext *h, const char *uri, int flags) 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 = url_connect(mms->mms_hd); + err = ffurl_connect(mms->mms_hd, NULL); if (err) { goto fail; } @@ -258,10 +256,11 @@ static int mmsh_open(URLContext *h, const char *uri, int flags) } // close the socket and then reopen it for sending the second play request. - url_close(mms->mms_hd); + ffurl_close(mms->mms_hd); memset(headers, 0, sizeof(headers)); - if (url_alloc(&mms->mms_hd, httpname, URL_RDONLY) < 0) { - return AVERROR(EIO); + if ((err = ffurl_alloc(&mms->mms_hd, httpname, AVIO_FLAG_READ, + &h->interrupt_callback)) < 0) { + goto fail; } stream_selection = av_mallocz(mms->stream_num * 19 + 1); if (!stream_selection) @@ -290,10 +289,10 @@ static int mmsh_open(URLContext *h, const char *uri, int flags) av_log(NULL, AV_LOG_ERROR, "Build play request failed!\n"); goto fail; } - dprintf(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 = url_connect(mms->mms_hd); + err = ffurl_connect(mms->mms_hd, NULL); if (err) { goto fail; } @@ -304,12 +303,12 @@ static int mmsh_open(URLContext *h, const char *uri, int flags) goto fail; } - dprintf(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); - dprintf(NULL, "Connection failed with error %d\n", err); + av_log(NULL, AV_LOG_TRACE, "Connection failed with error %d\n", err); return err; } @@ -359,11 +358,11 @@ static int mmsh_read(URLContext *h, uint8_t *buf, int size) return res; } -URLProtocol mmsh_protocol = { - .name = "mmsh", - .url_open = mmsh_open, - .url_read = mmsh_read, - .url_write = NULL, - .url_seek = NULL, - .url_close = mmsh_close, +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, };