00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "avformat.h"
00023 #include "rtpdec_formats.h"
00024 #include "libavutil/intreadwrite.h"
00025
00026 int ff_h263_handle_packet(AVFormatContext *ctx, PayloadContext *data,
00027 AVStream *st, AVPacket *pkt, uint32_t *timestamp,
00028 const uint8_t *buf, int len, int flags)
00029 {
00030 uint8_t *ptr;
00031 uint16_t header;
00032 int startcode, vrc, picture_header;
00033
00034 if (len < 2) {
00035 av_log(ctx, AV_LOG_ERROR, "Too short H.263 RTP packet\n");
00036 return AVERROR_INVALIDDATA;
00037 }
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052 header = AV_RB16(buf);
00053 startcode = (header & 0x0400) >> 9;
00054 vrc = header & 0x0200;
00055 picture_header = (header & 0x01f8) >> 3;
00056 buf += 2;
00057 len -= 2;
00058
00059 if (vrc) {
00060
00061 buf += 1;
00062 len -= 1;
00063 }
00064 if (picture_header) {
00065
00066 buf += picture_header;
00067 len -= picture_header;
00068 }
00069
00070 if (len < 0) {
00071 av_log(ctx, AV_LOG_ERROR, "Too short H.263 RTP packet\n");
00072 return AVERROR_INVALIDDATA;
00073 }
00074
00075 if (av_new_packet(pkt, len + startcode)) {
00076 av_log(ctx, AV_LOG_ERROR, "Out of memory\n");
00077 return AVERROR(ENOMEM);
00078 }
00079 pkt->stream_index = st->index;
00080 ptr = pkt->data;
00081
00082 if (startcode) {
00083 *ptr++ = 0;
00084 *ptr++ = 0;
00085 }
00086 memcpy(ptr, buf, len);
00087
00088 return 0;
00089 }
00090
00091 RTPDynamicProtocolHandler ff_h263_1998_dynamic_handler = {
00092 .enc_name = "H263-1998",
00093 .codec_type = AVMEDIA_TYPE_VIDEO,
00094 .codec_id = CODEC_ID_H263,
00095 .parse_packet = ff_h263_handle_packet,
00096 };
00097
00098 RTPDynamicProtocolHandler ff_h263_2000_dynamic_handler = {
00099 .enc_name = "H263-2000",
00100 .codec_type = AVMEDIA_TYPE_VIDEO,
00101 .codec_id = CODEC_ID_H263,
00102 .parse_packet = ff_h263_handle_packet,
00103 };