X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavformat%2Fmmst.c;h=4f896e0c4a130f777423386418050642f7f3fe8d;hb=857e6667f9061ae261c0b951113e4efc4329b05e;hp=cba65e2ee5de2f13bb05aef3248bd14d5b186923;hpb=e52a9145c8bf0748ae970e210e528ff56508964c;p=ffmpeg diff --git a/libavformat/mmst.c b/libavformat/mmst.c index cba65e2ee5d..4f896e0c4a1 100644 --- a/libavformat/mmst.c +++ b/libavformat/mmst.c @@ -1,7 +1,7 @@ /* * MMS protocol over TCP * Copyright (c) 2006,2007 Ryan Martell - * Copyright (c) 2007 Björn Axelsson + * Copyright (c) 2007 Björn Axelsson * Copyright (c) 2010 Zhentan Feng * * This file is part of Libav. @@ -144,9 +144,9 @@ static int send_command_packet(MMSTContext *mmst) av_log(NULL, AV_LOG_ERROR, "Failed to write data of length %d: %d (%s)\n", exact_length, write_result, - write_result < 0 ? strerror(write_result) : + write_result < 0 ? strerror(AVUNERROR(write_result)) : "The server closed the connection"); - return AVERROR_IO; + return AVERROR(EIO); } return 0; @@ -246,7 +246,7 @@ static MMSSCPacketType get_tcp_server_response(MMSTContext *mmst) if(read_result < 0) { av_log(NULL, AV_LOG_ERROR, "Error reading packet header: %d (%s)\n", - read_result, strerror(read_result)); + read_result, strerror(AVUNERROR(read_result))); packet_type = SC_PKT_CANCEL; } else { av_log(NULL, AV_LOG_ERROR, @@ -266,9 +266,9 @@ static MMSSCPacketType get_tcp_server_response(MMSTContext *mmst) av_log(NULL, AV_LOG_ERROR, "Reading command packet length failed: %d (%s)\n", read_result, - read_result < 0 ? strerror(read_result) : + read_result < 0 ? strerror(AVUNERROR(read_result)) : "The server closed the connection"); - return read_result < 0 ? read_result : AVERROR_IO; + return read_result < 0 ? read_result : AVERROR(EIO); } length_remaining= AV_RL32(mms->in_buffer+8) + 4; @@ -287,15 +287,15 @@ static MMSSCPacketType get_tcp_server_response(MMSTContext *mmst) av_log(NULL, AV_LOG_ERROR, "Reading pkt data (length=%d) failed: %d (%s)\n", length_remaining, read_result, - read_result < 0 ? strerror(read_result) : + read_result < 0 ? strerror(AVUNERROR(read_result)) : "The server closed the connection"); - return read_result < 0 ? read_result : AVERROR_IO; + return read_result < 0 ? read_result : AVERROR(EIO); } packet_type= AV_RL16(mms->in_buffer+36); if (read_result >= 44 && (hr = AV_RL32(mms->in_buffer + 40))) { av_log(NULL, AV_LOG_ERROR, "Server sent a message with packet type 0x%x and error status code 0x%08x\n", packet_type, hr); - return AVERROR_UNKNOWN; + return AVERROR(EINVAL); } } else { int length_remaining; @@ -324,23 +324,23 @@ static MMSSCPacketType get_tcp_server_response(MMSTContext *mmst) av_log(NULL, AV_LOG_ERROR, "Failed to read packet data of size %d: %d (%s)\n", length_remaining, read_result, - read_result < 0 ? strerror(read_result) : + read_result < 0 ? strerror(AVUNERROR(read_result)) : "The server closed the connection"); - return read_result < 0 ? read_result : AVERROR_IO; + return read_result < 0 ? read_result : AVERROR(EIO); } // if we successfully read everything. if(packet_id_type == mmst->header_packet_id) { + int err; packet_type = SC_PKT_ASF_HEADER; // Store the asf header if(!mms->header_parsed) { - void *p = av_realloc(mms->asf_header, - mms->asf_header_size + mms->remaining_in_len); - if (!p) { - av_freep(&mms->asf_header); - return AVERROR(ENOMEM); + if ((err = av_reallocp(&mms->asf_header, + mms->asf_header_size + + mms->remaining_in_len)) < 0) { + mms->asf_header_size = 0; + return err; } - mms->asf_header = p; memcpy(mms->asf_header + mms->asf_header_size, mms->read_in_ptr, mms->remaining_in_len); mms->asf_header_size += mms->remaining_in_len; @@ -470,7 +470,6 @@ static int mms_close(URLContext *h) /* free all separately allocated pointers in mms */ av_free(mms->streams); av_free(mms->asf_header); - av_freep(&h->priv_data); return 0; } @@ -502,15 +501,12 @@ static void clear_stream_buffers(MMSContext *mms) static int mms_open(URLContext *h, const char *uri, int flags) { - MMSTContext *mmst; + MMSTContext *mmst = h->priv_data; MMSContext *mms; int port, err; char tcpname[256]; h->is_streamed = 1; - mmst = h->priv_data = av_mallocz(sizeof(MMSTContext)); - if (!h->priv_data) - return AVERROR(ENOMEM); mms = &mmst->mms; // only for MMS over TCP, so set proto = NULL @@ -523,7 +519,8 @@ static int mms_open(URLContext *h, const char *uri, int flags) // establish tcp connection. ff_url_join(tcpname, sizeof(tcpname), "tcp", NULL, mmst->host, port, NULL); - err = ffurl_open(&mms->mms_hd, tcpname, URL_RDWR); + err = ffurl_open(&mms->mms_hd, tcpname, AVIO_FLAG_READ_WRITE, + &h->interrupt_callback, NULL); if (err) goto fail; @@ -550,7 +547,7 @@ static int mms_open(URLContext *h, const char *uri, int flags) if((mmst->incoming_flags != 0X08) && (mmst->incoming_flags != 0X0C)) { av_log(NULL, AV_LOG_ERROR, "The server does not support MMST (try MMSH or RTSP)\n"); - err = AVERROR_NOFMT; + err = AVERROR(EINVAL); goto fail; } err = ff_mms_asf_header_parser(mms); @@ -604,12 +601,12 @@ static int mms_read(URLContext *h, uint8_t *buf, int size) av_log(NULL, AV_LOG_ERROR, "Incoming pktlen %d is larger than ASF pktsize %d\n", mms->remaining_in_len, mms->asf_packet_len); - result= AVERROR_IO; + result= AVERROR(EIO); } else { // copy the data to the packet buffer. result = ff_mms_read_data(mms, buf, size); if (result == 0) { - av_dlog(NULL, "read asf media paket size is zero!\n"); + av_dlog(NULL, "Read ASF media packet size is zero!\n"); break; } } @@ -623,10 +620,10 @@ static int mms_read(URLContext *h, uint8_t *buf, int size) } URLProtocol ff_mmst_protocol = { - "mmst", - mms_open, - mms_read, - NULL, // write - NULL, // seek - mms_close, + .name = "mmst", + .url_open = mms_open, + .url_read = mms_read, + .url_close = mms_close, + .priv_data_size = sizeof(MMSTContext), + .flags = URL_PROTOCOL_FLAG_NETWORK, };