diff options
author | Ronald S. Bultje <rsbultje@gmail.com> | 2010-01-28 16:08:13 +0000 |
---|---|---|
committer | Ronald S. Bultje <rsbultje@gmail.com> | 2010-01-28 16:08:13 +0000 |
commit | 45aa90807fb312621c292ee9218305d41b09498d (patch) | |
tree | 07b5a7d2cd506903ca1a798a5bbbd0192e209dd0 | |
parent | 90d0379f5eddc549c7e0a2ea3f2dcf4471c25c51 (diff) | |
download | ffmpeg-45aa90807fb312621c292ee9218305d41b09498d.tar.gz |
Add RTP/H.263 depacketizer by Martin Storsjö <$firstname () $firstname st>.
Originally committed as revision 21512 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r-- | Changelog | 1 | ||||
-rw-r--r-- | libavformat/Makefile | 1 | ||||
-rw-r--r-- | libavformat/avformat.h | 2 | ||||
-rw-r--r-- | libavformat/rtpdec.c | 4 | ||||
-rw-r--r-- | libavformat/rtpdec_h263.c | 108 | ||||
-rw-r--r-- | libavformat/rtpdec_h263.h | 30 |
6 files changed, 145 insertions, 1 deletions
@@ -50,6 +50,7 @@ version <next>: - 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 293f9d36d0..e2f81b83c1 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 37548233fd..f654df8885 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 79c3535695..bacfc9a206 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 0000000000..7d498f3af0 --- /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 0000000000..5b51128680 --- /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 */ |