Add RTP/ASF header parsing, which is part of the SDP of these streams. See

patch discussion in "[PATCH] RTSP-MS 10/15: ASF header parsing" thread.

Originally committed as revision 18023 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
Ronald S. Bultje 2009-03-17 12:34:57 +00:00
parent 6d050dd673
commit 1a30d5415f
5 changed files with 104 additions and 1 deletions

View File

@ -188,6 +188,7 @@ OBJS-$(CONFIG_ROQ_MUXER) += raw.o
OBJS-$(CONFIG_RPL_DEMUXER) += rpl.o
OBJS-$(CONFIG_RTP_MUXER) += rtp.o \
rtp_aac.o \
rtp_asf.o \
rtp_mpv.o \
rtpenc.o \
rtpenc_h264.o \

52
libavformat/rtp_asf.c Normal file
View File

@ -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;
}
}

35
libavformat/rtp_asf.h Normal file
View File

@ -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 */

View File

@ -36,6 +36,7 @@
#include "rtpdec.h"
#include "rdt.h"
#include "rtp_asf.h"
//#define DEBUG
//#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)) {
if (atoi(p) == 1)
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)
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(s, s->nb_streams - 1,
rtsp_st->dynamic_protocol_context, buf);
}
}
break;
}
@ -853,6 +858,10 @@ static void rtsp_close_streams(RTSPState *rt)
}
}
av_free(rt->rtsp_streams);
if (rt->asf_ctx) {
av_close_input_stream (rt->asf_ctx);
rt->asf_ctx = NULL;
}
}
static int

View File

@ -223,6 +223,12 @@ typedef struct RTSPState {
* before sending a new "Subscribe:" command. */
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;
/**