00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "avformat.h"
00023 #include "rtpdec_formats.h"
00024 #include "libavutil/avstring.h"
00025
00026 static int ilbc_parse_fmtp(AVStream *stream, PayloadContext *data,
00027 char *attr, char *value)
00028 {
00029 if (!strcmp(attr, "mode")) {
00030 int mode = atoi(value);
00031 switch (mode) {
00032 case 20:
00033 stream->codec->block_align = 38;
00034 break;
00035 case 30:
00036 stream->codec->block_align = 50;
00037 break;
00038 default:
00039 av_log(NULL, AV_LOG_ERROR, "Unsupported iLBC mode %d\n", mode);
00040 return AVERROR(EINVAL);
00041 }
00042 }
00043 return 0;
00044 }
00045
00046 static int ilbc_parse_sdp_line(AVFormatContext *s, int st_index,
00047 PayloadContext *data, const char *line)
00048 {
00049 const char *p;
00050 AVStream *st;
00051
00052 if (st_index < 0)
00053 return 0;
00054 st = s->streams[st_index];
00055
00056 if (av_strstart(line, "fmtp:", &p)) {
00057 int ret = ff_parse_fmtp(st, data, p, ilbc_parse_fmtp);
00058 if (ret < 0)
00059 return ret;
00060 if (!st->codec->block_align) {
00061 av_log(s, AV_LOG_ERROR, "No iLBC mode set\n");
00062 return AVERROR(EINVAL);
00063 }
00064 }
00065 return 0;
00066 }
00067
00068 RTPDynamicProtocolHandler ff_ilbc_dynamic_handler = {
00069 .enc_name = "iLBC",
00070 .codec_type = AVMEDIA_TYPE_AUDIO,
00071 .codec_id = AV_CODEC_ID_ILBC,
00072 .parse_sdp_a_line = ilbc_parse_sdp_line,
00073 };