From: Ronald S. Bultje Date: Thu, 28 Jan 2010 16:08:13 +0000 (+0000) Subject: Add RTP/H.263 depacketizer by Martin Storsjö <$firstname () $firstname st>. X-Git-Tag: v0.6~1589 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=45aa90807fb312621c292ee9218305d41b09498d;p=platform%2Fupstream%2Flibav.git Add RTP/H.263 depacketizer by Martin Storsjö <$firstname () $firstname st>. Originally committed as revision 21512 to svn://svn.ffmpeg.org/ffmpeg/trunk --- diff --git a/Changelog b/Changelog index 4486858..c13294d 100644 --- a/Changelog +++ b/Changelog @@ -50,6 +50,7 @@ version : - Deluxe Paint Animation playback system - SIPR decoder - Adobe Filmstrip muxer and demuxer +- RTP depacketization of H.263 diff --git a/libavformat/Makefile b/libavformat/Makefile index 293f9d3..e2f81b8 100644 --- a/libavformat/Makefile +++ b/libavformat/Makefile @@ -213,6 +213,7 @@ OBJS-$(CONFIG_SDP_DEMUXER) += rtsp.o \ rdt.o \ rtp.o \ rtpdec.o \ + rtpdec_h263.o \ rtp_asf.o \ rtp_h264.o \ rtp_vorbis.o diff --git a/libavformat/avformat.h b/libavformat/avformat.h index 3754823..f654df8 100644 --- a/libavformat/avformat.h +++ b/libavformat/avformat.h @@ -22,7 +22,7 @@ #define AVFORMAT_AVFORMAT_H #define LIBAVFORMAT_VERSION_MAJOR 52 -#define LIBAVFORMAT_VERSION_MINOR 47 +#define LIBAVFORMAT_VERSION_MINOR 48 #define LIBAVFORMAT_VERSION_MICRO 0 #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \ diff --git a/libavformat/rtpdec.c b/libavformat/rtpdec.c index 79c3535..bacfc9a 100644 --- a/libavformat/rtpdec.c +++ b/libavformat/rtpdec.c @@ -33,6 +33,7 @@ #include "rtp_asf.h" #include "rtp_h264.h" #include "rtp_vorbis.h" +#include "rtpdec_h263.h" //#define DEBUG @@ -61,6 +62,8 @@ void av_register_rtp_dynamic_payload_handlers(void) { ff_register_dynamic_payload_handler(&mp4v_es_handler); ff_register_dynamic_payload_handler(&mpeg4_generic_handler); + ff_register_dynamic_payload_handler(&ff_h263_1998_dynamic_handler); + ff_register_dynamic_payload_handler(&ff_h263_2000_dynamic_handler); ff_register_dynamic_payload_handler(&ff_h264_dynamic_handler); ff_register_dynamic_payload_handler(&ff_vorbis_dynamic_handler); @@ -301,6 +304,7 @@ RTPDemuxContext *rtp_parse_open(AVFormatContext *s1, AVStream *st, URLContext *r case CODEC_ID_MP2: case CODEC_ID_MP3: case CODEC_ID_MPEG4: + case CODEC_ID_H263: case CODEC_ID_H264: st->need_parsing = AVSTREAM_PARSE_FULL; break; diff --git a/libavformat/rtpdec_h263.c b/libavformat/rtpdec_h263.c new file mode 100644 index 0000000..7d498f3 --- /dev/null +++ b/libavformat/rtpdec_h263.c @@ -0,0 +1,108 @@ +/* + * RTP H.263 Depacketizer, RFC 4629 + * Copyright (c) 2010 Martin Storsjo + * + * This file is part of FFmpeg. + * + * FFmpeg 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. + * + * FFmpeg 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 FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "avformat.h" +#include "rtpdec_h263.h" +#include "libavutil/intreadwrite.h" + +static int h263_handle_packet(AVFormatContext *ctx, + PayloadContext *data, + AVStream *st, + AVPacket * pkt, + uint32_t * timestamp, + const uint8_t * buf, + int len, int flags) +{ + uint8_t *ptr; + uint16_t header; + int startcode, vrc, picture_header; + + if (len < 2) { + av_log(ctx, AV_LOG_ERROR, "Too short H.263 RTP packet\n"); + return AVERROR_INVALIDDATA; + } + + /* Decode the 16 bit H.263+ payload header, as described in section + * 5.1 of RFC 4629. The fields of this header are: + * - 5 reserved bits, should be ignored. + * - One bit (P, startcode), indicating a picture start, picture segment + * start or video sequence end. If set, two zero bytes should be + * prepended to the payload. + * - One bit (V, vrc), indicating the presence of an 8 bit Video + * Redundancy Coding field after this 16 bit header. + * - 6 bits (PLEN, picture_header), the length (in bytes) of an extra + * picture header, following the VRC field. + * - 3 bits (PEBIT), the number of bits to ignore of the last byte + * of the extra picture header. (Not used at the moment.) + */ + header = AV_RB16(buf); + startcode = (header & 0x0400) >> 9; + vrc = header & 0x0200; + picture_header = (header & 0x01f8) >> 3; + buf += 2; + len -= 2; + + if (vrc) { + /* Skip VRC header if present, not used at the moment. */ + buf += 1; + len -= 1; + } + if (picture_header) { + /* Skip extra picture header if present, not used at the moment. */ + buf += picture_header; + len -= picture_header; + } + + if (len < 0) { + av_log(ctx, AV_LOG_ERROR, "Too short H.263 RTP packet\n"); + return AVERROR_INVALIDDATA; + } + + if (av_new_packet(pkt, len + startcode)) { + av_log(ctx, AV_LOG_ERROR, "Out of memory\n"); + return AVERROR_NOMEM; + } + pkt->stream_index = st->index; + ptr = pkt->data; + + if (startcode) { + *ptr++ = 0; + *ptr++ = 0; + } + memcpy(ptr, buf, len); + + return 0; +} + +RTPDynamicProtocolHandler ff_h263_1998_dynamic_handler = { + .enc_name = "H263-1998", + .codec_type = CODEC_TYPE_VIDEO, + .codec_id = CODEC_ID_H263, + .parse_packet = h263_handle_packet, +}; + +RTPDynamicProtocolHandler ff_h263_2000_dynamic_handler = { + .enc_name = "H263-2000", + .codec_type = CODEC_TYPE_VIDEO, + .codec_id = CODEC_ID_H263, + .parse_packet = h263_handle_packet, +}; + diff --git a/libavformat/rtpdec_h263.h b/libavformat/rtpdec_h263.h new file mode 100644 index 0000000..5b51128 --- /dev/null +++ b/libavformat/rtpdec_h263.h @@ -0,0 +1,30 @@ +/* + * RTP H.263 Depacketizer, RFC 4629 + * Copyright (c) 2010 Martin Storsjo + * + * This file is part of FFmpeg. + * + * FFmpeg 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. + * + * FFmpeg 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 FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVFORMAT_RTPDEC_H263_H +#define AVFORMAT_RTPDEC_H263_H + +#include "rtpdec.h" + +extern RTPDynamicProtocolHandler ff_h263_1998_dynamic_handler; +extern RTPDynamicProtocolHandler ff_h263_2000_dynamic_handler; + +#endif /* AVFORMAT_RTPDEC_H263_H */