patch discussion in "[PATCH] RTSP-MS 10/15: ASF header parsing" thread. Originally committed as revision 18023 to svn://svn.ffmpeg.org/ffmpeg/trunktags/v0.6
@@ -188,6 +188,7 @@ OBJS-$(CONFIG_ROQ_MUXER) += raw.o | |||||
OBJS-$(CONFIG_RPL_DEMUXER) += rpl.o | OBJS-$(CONFIG_RPL_DEMUXER) += rpl.o | ||||
OBJS-$(CONFIG_RTP_MUXER) += rtp.o \ | OBJS-$(CONFIG_RTP_MUXER) += rtp.o \ | ||||
rtp_aac.o \ | rtp_aac.o \ | ||||
rtp_asf.o \ | |||||
rtp_mpv.o \ | rtp_mpv.o \ | ||||
rtpenc.o \ | rtpenc.o \ | ||||
rtpenc_h264.o \ | rtpenc_h264.o \ | ||||
@@ -0,0 +1,52 @@ | |||||
/* | |||||
* Microsoft RTP/ASF support. | |||||
* Copyright (c) 2008 Ronald S. Bultje | |||||
* | |||||
* This file is part of FFmpeg. | |||||
* | |||||
* FFmpeg 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, | |||||
* 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 | |||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |||||
*/ | |||||
/** | |||||
* @file rtp-asf.c | |||||
* @brief Microsoft RTP/ASF support | |||||
* @author Ronald S. Bultje <rbultje@ronald.bitfreak.net> | |||||
*/ | |||||
#include <libavutil/base64.h> | |||||
#include <libavutil/avstring.h> | |||||
#include "rtp_asf.h" | |||||
#include "rtsp.h" | |||||
#include "asf.h" | |||||
void ff_wms_parse_sdp_a_line(AVFormatContext *s, const char *p) | |||||
{ | |||||
if (av_strstart(p, "pgmpu:data:application/vnd.ms.wms-hdr.asfv1;base64,", &p)) { | |||||
ByteIOContext pb; | |||||
RTSPState *rt = s->priv_data; | |||||
int len = strlen(p) * 6 / 8; | |||||
char *buf = av_mallocz(len); | |||||
av_base64_decode(buf, p, len); | |||||
init_put_byte(&pb, buf, len, 0, NULL, NULL, NULL, NULL); | |||||
if (rt->asf_ctx) { | |||||
av_close_input_stream(rt->asf_ctx); | |||||
rt->asf_ctx = NULL; | |||||
} | |||||
av_open_input_stream(&rt->asf_ctx, &pb, "", &asf_demuxer, NULL); | |||||
av_free(buf); | |||||
rt->asf_ctx->pb = NULL; | |||||
} | |||||
} |
@@ -0,0 +1,35 @@ | |||||
/* | |||||
* Microsoft RTP/ASF support. | |||||
* Copyright (c) 2008 Ronald S. Bultje | |||||
* | |||||
* This file is part of FFmpeg. | |||||
* | |||||
* FFmpeg 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, | |||||
* 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 | |||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |||||
*/ | |||||
#ifndef AVFORMAT_RTP_ASF_H | |||||
#define AVFORMAT_RTP_ASF_H | |||||
#include "avformat.h" | |||||
/** | |||||
* Parse a Windows Media Server-specific SDP line | |||||
* | |||||
* @param s RTSP demux context | |||||
* @param line the SDP line to be parsed | |||||
*/ | |||||
void ff_wms_parse_sdp_a_line(AVFormatContext *s, const char *p); | |||||
#endif /* AVFORMAT_RTP_ASF_H */ |
@@ -36,6 +36,7 @@ | |||||
#include "rtpdec.h" | #include "rtpdec.h" | ||||
#include "rdt.h" | #include "rdt.h" | ||||
#include "rtp_asf.h" | |||||
//#define DEBUG | //#define DEBUG | ||||
//#define DEBUG_RTP_TCP | //#define DEBUG_RTP_TCP | ||||
@@ -496,7 +497,10 @@ static void sdp_parse_line(AVFormatContext *s, SDPParseState *s1, | |||||
} else if (av_strstart(p, "IsRealDataType:integer;",&p)) { | } else if (av_strstart(p, "IsRealDataType:integer;",&p)) { | ||||
if (atoi(p) == 1) | if (atoi(p) == 1) | ||||
rt->transport = RTSP_TRANSPORT_RDT; | rt->transport = RTSP_TRANSPORT_RDT; | ||||
} else if (s->nb_streams > 0) { | |||||
} else { | |||||
if (rt->server_type == RTSP_SERVER_WMS) | |||||
ff_wms_parse_sdp_a_line(s, p); | |||||
if (s->nb_streams > 0) { | |||||
if (rt->server_type == RTSP_SERVER_REAL) | if (rt->server_type == RTSP_SERVER_REAL) | ||||
ff_real_parse_sdp_a_line(s, s->nb_streams - 1, p); | ff_real_parse_sdp_a_line(s, s->nb_streams - 1, p); | ||||
@@ -505,6 +509,7 @@ static void sdp_parse_line(AVFormatContext *s, SDPParseState *s1, | |||||
rtsp_st->dynamic_handler->parse_sdp_a_line) | rtsp_st->dynamic_handler->parse_sdp_a_line) | ||||
rtsp_st->dynamic_handler->parse_sdp_a_line(s, s->nb_streams - 1, | rtsp_st->dynamic_handler->parse_sdp_a_line(s, s->nb_streams - 1, | ||||
rtsp_st->dynamic_protocol_context, buf); | rtsp_st->dynamic_protocol_context, buf); | ||||
} | |||||
} | } | ||||
break; | break; | ||||
} | } | ||||
@@ -853,6 +858,10 @@ static void rtsp_close_streams(RTSPState *rt) | |||||
} | } | ||||
} | } | ||||
av_free(rt->rtsp_streams); | av_free(rt->rtsp_streams); | ||||
if (rt->asf_ctx) { | |||||
av_close_input_stream (rt->asf_ctx); | |||||
rt->asf_ctx = NULL; | |||||
} | |||||
} | } | ||||
static int | static int | ||||
@@ -223,6 +223,12 @@ typedef struct RTSPState { | |||||
* before sending a new "Subscribe:" command. */ | * before sending a new "Subscribe:" command. */ | ||||
char last_subscription[1024]; | char last_subscription[1024]; | ||||
//@} | //@} | ||||
/** The following are used for RTP/ASF streams */ | |||||
//@{ | |||||
/** ASF demuxer context for the embedded ASF stream from WMS servers */ | |||||
AVFormatContext *asf_ctx; | |||||
//@} | |||||
} RTSPState; | } RTSPState; | ||||
/** | /** | ||||