aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJosh Allmann <joshua.allmann@gmail.com>2010-06-25 08:02:50 +0000
committerMartin Storsjö <martin@martin.st>2010-06-25 08:02:50 +0000
commitca937a5508ab6054ca4d6969232afcdcad39f701 (patch)
treece5bbad503a701f53ca8994944929397aaab0dc6
parent73e6c53e64836ef89532a98caae0f6d00027cd61 (diff)
downloadffmpeg-ca937a5508ab6054ca4d6969232afcdcad39f701.tar.gz
RTSP, rtpdec: Move RTPPayloadData into rtpdec_mpeg4 and remove all references to rtp_payload_data in rtpdec and rtsp
Patch by Josh Allmann, joshua dot allmann at gmail Originally committed as revision 23772 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r--libavformat/rtpdec.c7
-rw-r--r--libavformat/rtpdec.h33
-rw-r--r--libavformat/rtpdec_mpeg4.c85
-rw-r--r--libavformat/rtsp.c3
-rw-r--r--libavformat/rtsp.h5
5 files changed, 62 insertions, 71 deletions
diff --git a/libavformat/rtpdec.c b/libavformat/rtpdec.c
index 5c73ef834c..456e2e42de 100644
--- a/libavformat/rtpdec.c
+++ b/libavformat/rtpdec.c
@@ -315,9 +315,8 @@ void rtp_send_punch_packets(URLContext* rtp_handle)
* open a new RTP parse context for stream 'st'. 'st' can be NULL for
* MPEG2TS streams to indicate that they should be demuxed inside the
* rtp demux (otherwise CODEC_ID_MPEG2TS packets are returned)
- * TODO: change this to not take rtp_payload data, and use the new dynamic payload system.
*/
-RTPDemuxContext *rtp_parse_open(AVFormatContext *s1, AVStream *st, URLContext *rtpc, int payload_type, RTPPayloadData *rtp_payload_data)
+RTPDemuxContext *rtp_parse_open(AVFormatContext *s1, AVStream *st, URLContext *rtpc, int payload_type)
{
RTPDemuxContext *s;
@@ -329,7 +328,6 @@ RTPDemuxContext *rtp_parse_open(AVFormatContext *s1, AVStream *st, URLContext *r
s->first_rtcp_ntp_time = AV_NOPTS_VALUE;
s->ic = s1;
s->st = st;
- s->rtp_payload_data = rtp_payload_data;
rtp_init_statistics(&s->statistics, 0); // do we know the initial sequence from sdp?
if (!strcmp(ff_rtp_enc_name(payload_type), "MP2T")) {
s->ts = ff_mpegts_parse_open(s->ic);
@@ -528,9 +526,6 @@ int rtp_parse_packet(RTPDemuxContext *s, AVPacket *pkt,
void rtp_parse_close(RTPDemuxContext *s)
{
- // TODO: fold this into the protocol specific data fields.
- av_free(s->rtp_payload_data->mode);
- av_free(s->rtp_payload_data->au_headers);
if (!strcmp(ff_rtp_enc_name(s->payload_type), "MP2T")) {
ff_mpegts_parse_close(s->ts);
}
diff --git a/libavformat/rtpdec.h b/libavformat/rtpdec.h
index 477ab723f4..8a62034737 100644
--- a/libavformat/rtpdec.h
+++ b/libavformat/rtpdec.h
@@ -26,34 +26,6 @@
#include "avformat.h"
#include "rtp.h"
-/** Structure listing useful vars to parse RTP packet payload*/
-typedef struct rtp_payload_data
-{
- int sizelength;
- int indexlength;
- int indexdeltalength;
- int profile_level_id;
- int streamtype;
- int objecttype;
- char *mode;
-
- /** mpeg 4 AU headers */
- struct AUHeaders {
- int size;
- int index;
- int cts_flag;
- int cts;
- int dts_flag;
- int dts;
- int rap_flag;
- int streamstate;
- } *au_headers;
- int au_headers_allocated;
- int nb_au_headers;
- int au_headers_length_bytes;
- int cur_au_index;
-} RTPPayloadData;
-
typedef struct PayloadContext PayloadContext;
typedef struct RTPDynamicProtocolHandler_s RTPDynamicProtocolHandler;
@@ -61,7 +33,7 @@ typedef struct RTPDynamicProtocolHandler_s RTPDynamicProtocolHandler;
#define RTP_MAX_PACKET_LENGTH 1500 /* XXX: suppress this define */
typedef struct RTPDemuxContext RTPDemuxContext;
-RTPDemuxContext *rtp_parse_open(AVFormatContext *s1, AVStream *st, URLContext *rtpc, int payload_type, RTPPayloadData *rtp_payload_data);
+RTPDemuxContext *rtp_parse_open(AVFormatContext *s1, AVStream *st, URLContext *rtpc, int payload_type);
void rtp_parse_set_dynamic_protocol(RTPDemuxContext *s, PayloadContext *ctx,
RTPDynamicProtocolHandler *handler);
int rtp_parse_packet(RTPDemuxContext *s, AVPacket *pkt,
@@ -187,9 +159,6 @@ struct RTPDemuxContext {
uint8_t buf[RTP_MAX_PACKET_LENGTH];
uint8_t *buf_ptr;
- /* special infos for au headers parsing */
- RTPPayloadData *rtp_payload_data; // TODO: Move into dynamic payload handlers
-
/* dynamic payload stuff */
DynamicPayloadPacketHandlerProc parse_packet; ///< This is also copied from the dynamic protocol handler structure
PayloadContext *dynamic_protocol_context; ///< This is a copy from the values setup from the sdp parsing, in rtsp.c don't free me.
diff --git a/libavformat/rtpdec_mpeg4.c b/libavformat/rtpdec_mpeg4.c
index 8a94d6ed41..a4b3ae4997 100644
--- a/libavformat/rtpdec_mpeg4.c
+++ b/libavformat/rtpdec_mpeg4.c
@@ -33,7 +33,33 @@
#include "libavcodec/get_bits.h"
#include <strings.h>
-#include "rtsp.h" //XXX remove this dependency
+/** Structure listing useful vars to parse RTP packet payload*/
+struct PayloadContext
+{
+ int sizelength;
+ int indexlength;
+ int indexdeltalength;
+ int profile_level_id;
+ int streamtype;
+ int objecttype;
+ char *mode;
+
+ /** mpeg 4 AU headers */
+ struct AUHeaders {
+ int size;
+ int index;
+ int cts_flag;
+ int cts;
+ int dts_flag;
+ int dts;
+ int rap_flag;
+ int streamstate;
+ } *au_headers;
+ int au_headers_allocated;
+ int nb_au_headers;
+ int au_headers_length_bytes;
+ int cur_au_index;
+};
/* return the length and optionally the data */
static int hex_to_data(uint8_t *data, const char *p)
@@ -76,20 +102,40 @@ typedef struct {
static const AttrNameMap attr_names[]=
{
{ "SizeLength", ATTR_NAME_TYPE_INT,
- offsetof(RTPPayloadData, sizelength) },
+ offsetof(PayloadContext, sizelength) },
{ "IndexLength", ATTR_NAME_TYPE_INT,
- offsetof(RTPPayloadData, indexlength) },
+ offsetof(PayloadContext, indexlength) },
{ "IndexDeltaLength", ATTR_NAME_TYPE_INT,
- offsetof(RTPPayloadData, indexdeltalength) },
+ offsetof(PayloadContext, indexdeltalength) },
{ "profile-level-id", ATTR_NAME_TYPE_INT,
- offsetof(RTPPayloadData, profile_level_id) },
+ offsetof(PayloadContext, profile_level_id) },
{ "StreamType", ATTR_NAME_TYPE_INT,
- offsetof(RTPPayloadData, streamtype) },
+ offsetof(PayloadContext, streamtype) },
{ "mode", ATTR_NAME_TYPE_STR,
- offsetof(RTPPayloadData, mode) },
+ offsetof(PayloadContext, mode) },
{ NULL, -1, -1 },
};
+static PayloadContext *new_context(void)
+{
+ return av_mallocz(sizeof(PayloadContext));
+}
+
+static void free_context(PayloadContext * data)
+{
+ int i;
+ for (i = 0; i < data->nb_au_headers; i++) {
+ /* according to rtp_parse_mp4_au, we treat multiple
+ * au headers as one, so nb_au_headers is always 1.
+ * loop anyway in case this changes.
+ * (note: changes done carelessly might lead to a double free)
+ */
+ av_free(&data->au_headers[i]);
+ }
+ av_free(data->mode);
+ av_free(data);
+}
+
static int parse_fmtp_config(AVCodecContext * codec, char *value)
{
/* decode the hexa encoded parameter */
@@ -104,15 +150,10 @@ static int parse_fmtp_config(AVCodecContext * codec, char *value)
return 0;
}
-static int rtp_parse_mp4_au(RTSPStream *rtsp_st, const uint8_t *buf)
+static int rtp_parse_mp4_au(PayloadContext *infos, const uint8_t *buf)
{
int au_headers_length, au_header_size, i;
GetBitContext getbitcontext;
- RTPPayloadData *infos;
-
- infos = &rtsp_st->rtp_payload_data;
- if (infos == NULL)
- return -1;
/* decode the first 2 bytes where the AUHeader sections are stored
length in bits */
@@ -158,21 +199,15 @@ static int rtp_parse_mp4_au(RTSPStream *rtsp_st, const uint8_t *buf)
/* Follows RFC 3640 */
static int aac_parse_packet(AVFormatContext *ctx,
- PayloadContext *data,
+ PayloadContext *infos,
AVStream *st,
AVPacket *pkt,
uint32_t *timestamp,
const uint8_t *buf, int len, int flags)
{
- RTSPStream *rtsp_st = st->priv_data;
- RTPPayloadData *infos;
-
- if (rtp_parse_mp4_au(rtsp_st, buf))
+ if (rtp_parse_mp4_au(infos, buf))
return -1;
- infos = &rtsp_st->rtp_payload_data;
- if (infos == NULL)
- return -1;
buf += infos->au_headers_length_bytes + 2;
len -= infos->au_headers_length_bytes + 2;
@@ -186,15 +221,13 @@ static int aac_parse_packet(AVFormatContext *ctx,
}
static int parse_sdp_line(AVFormatContext *s, int st_index,
- PayloadContext *data, const char *line)
+ PayloadContext *rtp_payload_data, const char *line)
{
const char *p;
char value[4096], attr[25];
int res = 0, i;
AVStream *st = s->streams[st_index];
- RTSPStream *rtsp_st = st->priv_data;
AVCodecContext* codec = st->codec;
- RTPPayloadData *rtp_payload_data = &rtsp_st->rtp_payload_data;
if (av_strstart(line, "fmtp:", &p)) {
// remove protocol identifier
@@ -247,7 +280,7 @@ RTPDynamicProtocolHandler ff_mpeg4_generic_dynamic_handler = {
.codec_type = AVMEDIA_TYPE_AUDIO,
.codec_id = CODEC_ID_AAC,
.parse_sdp_a_line = parse_sdp_line,
- .open = NULL,
- .close = NULL,
+ .open = new_context,
+ .close = free_context,
.parse_packet = aac_parse_packet
};
diff --git a/libavformat/rtsp.c b/libavformat/rtsp.c
index 964144b3c6..bca3bd26fb 100644
--- a/libavformat/rtsp.c
+++ b/libavformat/rtsp.c
@@ -561,8 +561,7 @@ static int rtsp_open_transport_ctx(AVFormatContext *s, RTSPStream *rtsp_st)
rtsp_st->dynamic_handler);
else
rtsp_st->transport_priv = rtp_parse_open(s, st, rtsp_st->rtp_handle,
- rtsp_st->sdp_payload_type,
- &rtsp_st->rtp_payload_data);
+ rtsp_st->sdp_payload_type);
if (!rtsp_st->transport_priv) {
return AVERROR(ENOMEM);
diff --git a/libavformat/rtsp.h b/libavformat/rtsp.h
index 61b688d085..2853253e4b 100644
--- a/libavformat/rtsp.h
+++ b/libavformat/rtsp.h
@@ -323,11 +323,6 @@ typedef struct RTSPStream {
int sdp_payload_type; /**< payload type */
//@}
- /** rtp payload parsing infos from SDP (i.e. mapping between private
- * payload IDs and media-types (string), so that we can derive what
- * type of payload we're dealing with (and how to parse it). */
- RTPPayloadData rtp_payload_data;
-
/** The following are used for dynamic protocols (rtp_*.c/rdt.c) */
//@{
/** handler structure */