This also adds checking of mallocs. Signed-off-by: Martin Storsjö <martin@martin.st>tags/n1.2
| @@ -34,6 +34,7 @@ OBJS-$(CONFIG_RTPDEC) += rdt.o \ | |||||
| rtpdec_ilbc.o \ | rtpdec_ilbc.o \ | ||||
| rtpdec_jpeg.o \ | rtpdec_jpeg.o \ | ||||
| rtpdec_latm.o \ | rtpdec_latm.o \ | ||||
| rtpdec_mpeg12.o \ | |||||
| rtpdec_mpeg4.o \ | rtpdec_mpeg4.o \ | ||||
| rtpdec_mpegts.o \ | rtpdec_mpegts.o \ | ||||
| rtpdec_qcelp.o \ | rtpdec_qcelp.o \ | ||||
| @@ -74,6 +74,8 @@ void av_register_rtp_dynamic_payload_handlers(void) | |||||
| ff_register_dynamic_payload_handler(&ff_jpeg_dynamic_handler); | ff_register_dynamic_payload_handler(&ff_jpeg_dynamic_handler); | ||||
| ff_register_dynamic_payload_handler(&ff_mp4a_latm_dynamic_handler); | ff_register_dynamic_payload_handler(&ff_mp4a_latm_dynamic_handler); | ||||
| ff_register_dynamic_payload_handler(&ff_mp4v_es_dynamic_handler); | ff_register_dynamic_payload_handler(&ff_mp4v_es_dynamic_handler); | ||||
| ff_register_dynamic_payload_handler(&ff_mpeg_audio_dynamic_handler); | |||||
| ff_register_dynamic_payload_handler(&ff_mpeg_video_dynamic_handler); | |||||
| ff_register_dynamic_payload_handler(&ff_mpeg4_generic_dynamic_handler); | ff_register_dynamic_payload_handler(&ff_mpeg4_generic_dynamic_handler); | ||||
| ff_register_dynamic_payload_handler(&ff_mpegts_dynamic_handler); | ff_register_dynamic_payload_handler(&ff_mpegts_dynamic_handler); | ||||
| ff_register_dynamic_payload_handler(&ff_ms_rtp_asf_pfv_handler); | ff_register_dynamic_payload_handler(&ff_ms_rtp_asf_pfv_handler); | ||||
| @@ -583,7 +585,7 @@ static void finalize_packet(RTPDemuxContext *s, AVPacket *pkt, uint32_t timestam | |||||
| static int rtp_parse_packet_internal(RTPDemuxContext *s, AVPacket *pkt, | static int rtp_parse_packet_internal(RTPDemuxContext *s, AVPacket *pkt, | ||||
| const uint8_t *buf, int len) | const uint8_t *buf, int len) | ||||
| { | { | ||||
| unsigned int ssrc, h; | |||||
| unsigned int ssrc; | |||||
| int payload_type, seq, flags = 0; | int payload_type, seq, flags = 0; | ||||
| int ext; | int ext; | ||||
| AVStream *st; | AVStream *st; | ||||
| @@ -645,42 +647,8 @@ static int rtp_parse_packet_internal(RTPDemuxContext *s, AVPacket *pkt, | |||||
| } else if (st) { | } else if (st) { | ||||
| /* At this point, the RTP header has been stripped; | /* At this point, the RTP header has been stripped; | ||||
| * This is ASSUMING that there is only 1 CSRC, which isn't wise. */ | * This is ASSUMING that there is only 1 CSRC, which isn't wise. */ | ||||
| switch (st->codec->codec_id) { | |||||
| case AV_CODEC_ID_MP2: | |||||
| case AV_CODEC_ID_MP3: | |||||
| /* better than nothing: skip MPEG audio RTP header */ | |||||
| if (len <= 4) | |||||
| return -1; | |||||
| h = AV_RB32(buf); | |||||
| len -= 4; | |||||
| buf += 4; | |||||
| av_new_packet(pkt, len); | |||||
| memcpy(pkt->data, buf, len); | |||||
| break; | |||||
| case AV_CODEC_ID_MPEG1VIDEO: | |||||
| case AV_CODEC_ID_MPEG2VIDEO: | |||||
| /* better than nothing: skip MPEG video RTP header */ | |||||
| if (len <= 4) | |||||
| return -1; | |||||
| h = AV_RB32(buf); | |||||
| buf += 4; | |||||
| len -= 4; | |||||
| if (h & (1 << 26)) { | |||||
| /* MPEG-2 */ | |||||
| if (len <= 4) | |||||
| return -1; | |||||
| buf += 4; | |||||
| len -= 4; | |||||
| } | |||||
| av_new_packet(pkt, len); | |||||
| memcpy(pkt->data, buf, len); | |||||
| break; | |||||
| default: | |||||
| av_new_packet(pkt, len); | |||||
| memcpy(pkt->data, buf, len); | |||||
| break; | |||||
| } | |||||
| av_new_packet(pkt, len); | |||||
| memcpy(pkt->data, buf, len); | |||||
| pkt->stream_index = st->index; | pkt->stream_index = st->index; | ||||
| } else { | } else { | ||||
| return AVERROR(EINVAL); | return AVERROR(EINVAL); | ||||
| @@ -49,6 +49,8 @@ extern RTPDynamicProtocolHandler ff_ilbc_dynamic_handler; | |||||
| extern RTPDynamicProtocolHandler ff_jpeg_dynamic_handler; | extern RTPDynamicProtocolHandler ff_jpeg_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_mpeg_audio_dynamic_handler; | |||||
| extern RTPDynamicProtocolHandler ff_mpeg_video_dynamic_handler; | |||||
| extern RTPDynamicProtocolHandler ff_mpeg4_generic_dynamic_handler; | extern RTPDynamicProtocolHandler ff_mpeg4_generic_dynamic_handler; | ||||
| extern RTPDynamicProtocolHandler ff_mpegts_dynamic_handler; | extern RTPDynamicProtocolHandler ff_mpegts_dynamic_handler; | ||||
| extern RTPDynamicProtocolHandler ff_ms_rtp_asf_pfa_handler; | extern RTPDynamicProtocolHandler ff_ms_rtp_asf_pfa_handler; | ||||
| @@ -0,0 +1,62 @@ | |||||
| /* | |||||
| * Common code for the RTP depacketization of MPEG-1/2 formats. | |||||
| * Copyright (c) 2002 Fabrice Bellard | |||||
| * | |||||
| * 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 "rtpdec_formats.h" | |||||
| #include "libavutil/intreadwrite.h" | |||||
| static int mpeg_parse_packet(AVFormatContext *ctx, PayloadContext *data, | |||||
| AVStream *st, AVPacket *pkt, uint32_t *timestamp, | |||||
| const uint8_t *buf, int len, uint16_t seq, | |||||
| int flags) | |||||
| { | |||||
| unsigned int h; | |||||
| if (len <= 4) | |||||
| return AVERROR_INVALIDDATA; | |||||
| h = AV_RB32(buf); | |||||
| buf += 4; | |||||
| len -= 4; | |||||
| if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO && h & (1 << 26)) { | |||||
| /* MPEG-2 */ | |||||
| if (len <= 4) | |||||
| return AVERROR_INVALIDDATA; | |||||
| buf += 4; | |||||
| len -= 4; | |||||
| } | |||||
| if (av_new_packet(pkt, len) < 0) | |||||
| return AVERROR(ENOMEM); | |||||
| memcpy(pkt->data, buf, len); | |||||
| pkt->stream_index = st->index; | |||||
| return 0; | |||||
| } | |||||
| RTPDynamicProtocolHandler ff_mpeg_audio_dynamic_handler = { | |||||
| .codec_type = AVMEDIA_TYPE_AUDIO, | |||||
| .codec_id = AV_CODEC_ID_MP3, | |||||
| .parse_packet = mpeg_parse_packet, | |||||
| .static_payload_id = 14, | |||||
| }; | |||||
| RTPDynamicProtocolHandler ff_mpeg_video_dynamic_handler = { | |||||
| .codec_type = AVMEDIA_TYPE_VIDEO, | |||||
| .codec_id = AV_CODEC_ID_MPEG2VIDEO, | |||||
| .parse_packet = mpeg_parse_packet, | |||||
| .static_payload_id = 32, | |||||
| }; | |||||