Signed-off-by: Martin Storsjö <martin@martin.st>tags/n1.0
| @@ -264,6 +264,7 @@ OBJS-$(CONFIG_RTPDEC) += rdt.o \ | |||||
| rtpdec_h263.o \ | rtpdec_h263.o \ | ||||
| rtpdec_h263_rfc2190.o \ | rtpdec_h263_rfc2190.o \ | ||||
| rtpdec_h264.o \ | rtpdec_h264.o \ | ||||
| rtpdec_ilbc.o \ | |||||
| rtpdec_latm.o \ | rtpdec_latm.o \ | ||||
| rtpdec_mpeg4.o \ | rtpdec_mpeg4.o \ | ||||
| rtpdec_qcelp.o \ | rtpdec_qcelp.o \ | ||||
| @@ -68,6 +68,7 @@ void av_register_rtp_dynamic_payload_handlers(void) | |||||
| ff_register_dynamic_payload_handler(&ff_h263_2000_dynamic_handler); | ff_register_dynamic_payload_handler(&ff_h263_2000_dynamic_handler); | ||||
| ff_register_dynamic_payload_handler(&ff_h263_rfc2190_dynamic_handler); | ff_register_dynamic_payload_handler(&ff_h263_rfc2190_dynamic_handler); | ||||
| ff_register_dynamic_payload_handler(&ff_h264_dynamic_handler); | ff_register_dynamic_payload_handler(&ff_h264_dynamic_handler); | ||||
| ff_register_dynamic_payload_handler(&ff_ilbc_dynamic_handler); | |||||
| ff_register_dynamic_payload_handler(&ff_vorbis_dynamic_handler); | ff_register_dynamic_payload_handler(&ff_vorbis_dynamic_handler); | ||||
| ff_register_dynamic_payload_handler(&ff_theora_dynamic_handler); | ff_register_dynamic_payload_handler(&ff_theora_dynamic_handler); | ||||
| ff_register_dynamic_payload_handler(&ff_qdm2_dynamic_handler); | ff_register_dynamic_payload_handler(&ff_qdm2_dynamic_handler); | ||||
| @@ -45,6 +45,7 @@ extern RTPDynamicProtocolHandler ff_h263_1998_dynamic_handler; | |||||
| extern RTPDynamicProtocolHandler ff_h263_2000_dynamic_handler; | extern RTPDynamicProtocolHandler ff_h263_2000_dynamic_handler; | ||||
| extern RTPDynamicProtocolHandler ff_h263_rfc2190_dynamic_handler; | extern RTPDynamicProtocolHandler ff_h263_rfc2190_dynamic_handler; | ||||
| extern RTPDynamicProtocolHandler ff_h264_dynamic_handler; | extern RTPDynamicProtocolHandler ff_h264_dynamic_handler; | ||||
| extern RTPDynamicProtocolHandler ff_ilbc_dynamic_handler; | |||||
| extern RTPDynamicProtocolHandler ff_mp4a_latm_dynamic_handler; | extern RTPDynamicProtocolHandler ff_mp4a_latm_dynamic_handler; | ||||
| extern RTPDynamicProtocolHandler ff_mp4v_es_dynamic_handler; | extern RTPDynamicProtocolHandler ff_mp4v_es_dynamic_handler; | ||||
| extern RTPDynamicProtocolHandler ff_mpeg4_generic_dynamic_handler; | extern RTPDynamicProtocolHandler ff_mpeg4_generic_dynamic_handler; | ||||
| @@ -0,0 +1,73 @@ | |||||
| /* | |||||
| * RTP iLBC Depacketizer, RFC 3952 | |||||
| * Copyright (c) 2012 Martin Storsjo | |||||
| * | |||||
| * This file is part of Libav. | |||||
| * | |||||
| * Libav 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. | |||||
| * | |||||
| * Libav 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 Libav; if not, write to the Free Software | |||||
| * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |||||
| */ | |||||
| #include "avformat.h" | |||||
| #include "rtpdec_formats.h" | |||||
| #include "libavutil/avstring.h" | |||||
| static int ilbc_parse_fmtp(AVStream *stream, PayloadContext *data, | |||||
| char *attr, char *value) | |||||
| { | |||||
| if (!strcmp(attr, "mode")) { | |||||
| int mode = atoi(value); | |||||
| switch (mode) { | |||||
| case 20: | |||||
| stream->codec->block_align = 38; | |||||
| break; | |||||
| case 30: | |||||
| stream->codec->block_align = 50; | |||||
| break; | |||||
| default: | |||||
| av_log(NULL, AV_LOG_ERROR, "Unsupported iLBC mode %d\n", mode); | |||||
| return AVERROR(EINVAL); | |||||
| } | |||||
| } | |||||
| return 0; | |||||
| } | |||||
| static int ilbc_parse_sdp_line(AVFormatContext *s, int st_index, | |||||
| PayloadContext *data, const char *line) | |||||
| { | |||||
| const char *p; | |||||
| AVStream *st; | |||||
| if (st_index < 0) | |||||
| return 0; | |||||
| st = s->streams[st_index]; | |||||
| if (av_strstart(line, "fmtp:", &p)) { | |||||
| int ret = ff_parse_fmtp(st, data, p, ilbc_parse_fmtp); | |||||
| if (ret < 0) | |||||
| return ret; | |||||
| if (!st->codec->block_align) { | |||||
| av_log(s, AV_LOG_ERROR, "No iLBC mode set\n"); | |||||
| return AVERROR(EINVAL); | |||||
| } | |||||
| } | |||||
| return 0; | |||||
| } | |||||
| RTPDynamicProtocolHandler ff_ilbc_dynamic_handler = { | |||||
| .enc_name = "iLBC", | |||||
| .codec_type = AVMEDIA_TYPE_AUDIO, | |||||
| .codec_id = CODEC_ID_ILBC, | |||||
| .parse_sdp_a_line = ilbc_parse_sdp_line, | |||||
| }; | |||||
| @@ -31,7 +31,7 @@ | |||||
| #define LIBAVFORMAT_VERSION_MAJOR 54 | #define LIBAVFORMAT_VERSION_MAJOR 54 | ||||
| #define LIBAVFORMAT_VERSION_MINOR 5 | #define LIBAVFORMAT_VERSION_MINOR 5 | ||||
| #define LIBAVFORMAT_VERSION_MICRO 0 | |||||
| #define LIBAVFORMAT_VERSION_MICRO 1 | |||||
| #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \ | #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \ | ||||
| LIBAVFORMAT_VERSION_MINOR, \ | LIBAVFORMAT_VERSION_MINOR, \ | ||||