mirror of
https://gitee.com/openharmony/third_party_ffmpeg
synced 2024-11-23 11:19:55 +00:00
RTSP: Move more SDP/FMTP stuff from rtsp.c to rtpdec_mpeg4.c
Patch by Josh Allmann, joshua dot allmann at gmail Originally committed as revision 23770 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
parent
9b3788efc3
commit
7fc8ac7fd8
@ -30,6 +30,9 @@
|
||||
#include "rtpdec_mpeg4.h"
|
||||
#include "internal.h"
|
||||
#include "libavutil/avstring.h"
|
||||
#include <strings.h>
|
||||
|
||||
#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 @@ static int hex_to_data(uint8_t *data, const char *p)
|
||||
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 @@ static int parse_sdp_line(AVFormatContext *s, int st_index,
|
||||
{
|
||||
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 @@ static int parse_sdp_line(AVFormatContext *s, int st_index,
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -158,32 +158,6 @@ static int sdp_parse_rtpmap(AVFormatContext *s,
|
||||
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 @@ int ff_rtsp_next_attr_and_value(const char **p, char *attr, int attr_size,
|
||||
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 @@ static void sdp_parse_line(AVFormatContext *s, SDPParseState *s1,
|
||||
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);
|
||||
|
Loading…
Reference in New Issue
Block a user