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_jpeg.o \ | |||
| rtpdec_latm.o \ | |||
| rtpdec_mpeg12.o \ | |||
| rtpdec_mpeg4.o \ | |||
| rtpdec_mpegts.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_mp4a_latm_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_mpegts_dynamic_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, | |||
| const uint8_t *buf, int len) | |||
| { | |||
| unsigned int ssrc, h; | |||
| unsigned int ssrc; | |||
| int payload_type, seq, flags = 0; | |||
| int ext; | |||
| AVStream *st; | |||
| @@ -645,42 +647,8 @@ static int rtp_parse_packet_internal(RTPDemuxContext *s, AVPacket *pkt, | |||
| } else if (st) { | |||
| /* At this point, the RTP header has been stripped; | |||
| * 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; | |||
| } else { | |||
| return AVERROR(EINVAL); | |||
| @@ -49,6 +49,8 @@ extern RTPDynamicProtocolHandler ff_ilbc_dynamic_handler; | |||
| extern RTPDynamicProtocolHandler ff_jpeg_dynamic_handler; | |||
| extern RTPDynamicProtocolHandler ff_mp4a_latm_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_mpegts_dynamic_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, | |||
| }; | |||