# HG changeset patch # User mstorsjo # Date 1277452805 0 # Node ID 3a0c63aea9e99b2a33f7a38c841760bc7a132b3b # Parent 5708c6d4223de3462914754dd232168ea36ac881 RTSP: Move more SDP/FMTP stuff from rtsp.c to rtpdec_mpeg4.c Patch by Josh Allmann, joshua dot allmann at gmail diff -r 5708c6d4223d -r 3a0c63aea9e9 rtpdec_mpeg4.c --- a/rtpdec_mpeg4.c Fri Jun 25 07:58:38 2010 +0000 +++ b/rtpdec_mpeg4.c Fri Jun 25 08:00:05 2010 +0000 @@ -30,6 +30,9 @@ #include "rtpdec_mpeg4.h" #include "internal.h" #include "libavutil/avstring.h" +#include + +#include "rtsp.h" //XXX remove this dependency /* return the length and optionally the data */ static int hex_to_data(uint8_t *data, const char *p) @@ -60,6 +63,32 @@ return len; } +typedef struct { + const char *str; + uint16_t type; + uint32_t offset; +} AttrNameMap; + +/* All known fmtp parameters and the corresponding RTPAttrTypeEnum */ +#define ATTR_NAME_TYPE_INT 0 +#define ATTR_NAME_TYPE_STR 1 +static const AttrNameMap attr_names[]= +{ + { "SizeLength", ATTR_NAME_TYPE_INT, + offsetof(RTPPayloadData, sizelength) }, + { "IndexLength", ATTR_NAME_TYPE_INT, + offsetof(RTPPayloadData, indexlength) }, + { "IndexDeltaLength", ATTR_NAME_TYPE_INT, + offsetof(RTPPayloadData, indexdeltalength) }, + { "profile-level-id", ATTR_NAME_TYPE_INT, + offsetof(RTPPayloadData, profile_level_id) }, + { "StreamType", ATTR_NAME_TYPE_INT, + offsetof(RTPPayloadData, streamtype) }, + { "mode", ATTR_NAME_TYPE_STR, + offsetof(RTPPayloadData, mode) }, + { NULL, -1, -1 }, +}; + static int parse_fmtp_config(AVCodecContext * codec, char *value) { /* decode the hexa encoded parameter */ @@ -79,8 +108,11 @@ { const char *p; char value[4096], attr[25]; - int res = 0; - AVCodecContext* codec = s->streams[st_index]->codec; + 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 @@ -97,6 +129,20 @@ if (res < 0) return res; } + + if (codec->codec_id == CODEC_ID_AAC) { + /* Looking for a known attribute */ + for (i = 0; attr_names[i].str; ++i) { + if (!strcasecmp(attr, attr_names[i].str)) { + if (attr_names[i].type == ATTR_NAME_TYPE_INT) { + *(int *)((char *)rtp_payload_data + + attr_names[i].offset) = atoi(value); + } else if (attr_names[i].type == ATTR_NAME_TYPE_STR) + *(char **)((char *)rtp_payload_data + + attr_names[i].offset) = av_strdup(value); + } + } + } } } diff -r 5708c6d4223d -r 3a0c63aea9e9 rtsp.c --- a/rtsp.c Fri Jun 25 07:58:38 2010 +0000 +++ b/rtsp.c Fri Jun 25 08:00:05 2010 +0000 @@ -158,32 +158,6 @@ return 0; } -typedef struct { - const char *str; - uint16_t type; - uint32_t offset; -} AttrNameMap; - -/* All known fmtp parameters and the corresponding RTPAttrTypeEnum */ -#define ATTR_NAME_TYPE_INT 0 -#define ATTR_NAME_TYPE_STR 1 -static const AttrNameMap attr_names[]= -{ - { "SizeLength", ATTR_NAME_TYPE_INT, - offsetof(RTPPayloadData, sizelength) }, - { "IndexLength", ATTR_NAME_TYPE_INT, - offsetof(RTPPayloadData, indexlength) }, - { "IndexDeltaLength", ATTR_NAME_TYPE_INT, - offsetof(RTPPayloadData, indexdeltalength) }, - { "profile-level-id", ATTR_NAME_TYPE_INT, - offsetof(RTPPayloadData, profile_level_id) }, - { "StreamType", ATTR_NAME_TYPE_INT, - offsetof(RTPPayloadData, streamtype) }, - { "mode", ATTR_NAME_TYPE_STR, - offsetof(RTPPayloadData, mode) }, - { NULL, -1, -1 }, -}; - /* parse the attribute line from the fmtp a line of an sdp response. This * is broken out as a function because it is used in rtp_h264.c, which is * forthcoming. */ @@ -203,32 +177,6 @@ return 0; } -/* parse a SDP line and save stream attributes */ -static void sdp_parse_fmtp(AVStream *st, const char *p) -{ - char attr[256]; - char value[4096]; - int i; - RTSPStream *rtsp_st = st->priv_data; - RTPPayloadData *rtp_payload_data = &rtsp_st->rtp_payload_data; - - /* loop on each attribute */ - while (ff_rtsp_next_attr_and_value(&p, attr, sizeof(attr), - value, sizeof(value))) { - /* Looking for a known attribute */ - for (i = 0; attr_names[i].str; ++i) { - if (!strcasecmp(attr, attr_names[i].str)) { - if (attr_names[i].type == ATTR_NAME_TYPE_INT) { - *(int *)((char *)rtp_payload_data + - attr_names[i].offset) = atoi(value); - } else if (attr_names[i].type == ATTR_NAME_TYPE_STR) - *(char **)((char *)rtp_payload_data + - attr_names[i].offset) = av_strdup(value); - } - } - } -} - /** Parse a string p in the form of Range:npt=xx-xx, and determine the start * and end time. * Used for seeking in the rtp stream. @@ -399,22 +347,9 @@ st = s->streams[s->nb_streams - 1]; rtsp_st = st->priv_data; sdp_parse_rtpmap(s, st->codec, rtsp_st, payload_type, p); - } else if (av_strstart(p, "fmtp:", &p)) { + } else if (av_strstart(p, "fmtp:", &p) || + av_strstart(p, "framesize:", &p)) { /* NOTE: fmtp is only supported AFTER the 'a=rtpmap:xxx' tag */ - get_word(buf1, sizeof(buf1), &p); - payload_type = atoi(buf1); - for (i = 0; i < s->nb_streams; i++) { - st = s->streams[i]; - rtsp_st = st->priv_data; - if (rtsp_st->sdp_payload_type == payload_type) { - if (!(rtsp_st->dynamic_handler && - rtsp_st->dynamic_handler->parse_sdp_a_line && - rtsp_st->dynamic_handler->parse_sdp_a_line(s, - i, rtsp_st->dynamic_protocol_context, buf))) - sdp_parse_fmtp(st, p); - } - } - } else if (av_strstart(p, "framesize:", &p)) { // let dynamic protocol handlers have a stab at the line. get_word(buf1, sizeof(buf1), &p); payload_type = atoi(buf1);