annotate rtpdec_h264.c @ 6455:3f50c7effad1 libavformat

rtsp: 10l, try to update the correct rtp stream This fixes a bug from rev 22917. Now RTSP streams where the individual RTCP sender reports aren't sent at the same time actually are synced properly.
author mstorsjo
date Fri, 03 Sep 2010 07:10:21 +0000
parents 491eea5c52d6
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
1 /*
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
2 * RTP H264 Protocol (RFC3984)
4251
77e0c7511d41 cosmetics: Remove pointless period after copyright statement non-sentences.
diego
parents: 4067
diff changeset
3 * Copyright (c) 2006 Ryan Martell
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
4 *
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
5 * This file is part of FFmpeg.
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
6 *
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
9 * License as published by the Free Software Foundation; either
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
10 * version 2.1 of the License, or (at your option) any later version.
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
11 *
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
15 * Lesser General Public License for more details.
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
16 *
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
17 * You should have received a copy of the GNU Lesser General Public
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
18 * License along with FFmpeg; if not, write to the Free Software
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
20 */
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
21
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
22 /**
5969
178de7695c6c Remove explicit filename from Doxygen @file commands.
diego
parents: 5910
diff changeset
23 * @file
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
24 * @brief H.264 / RTP Code (RFC3984)
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
25 * @author Ryan Martell <rdm4@martellventures.com>
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
26 *
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
27 * @note Notes:
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
28 * Notes:
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
29 * This currently supports packetization mode:
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
30 * Single Nal Unit Mode (0), or
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
31 * Non-Interleaved Mode (1). It currently does not support
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
32 * Interleaved Mode (2). (This requires implementing STAP-B, MTAP16, MTAP24, FU-B packet types)
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
33 *
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
34 * @note TODO:
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
35 * 1) RTCP sender reports for udp streams are required..
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
36 *
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
37 */
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
38
3286
6f61c3b36632 Use full path for #includes from another directory.
diego
parents: 2941
diff changeset
39 #include "libavutil/base64.h"
6f61c3b36632 Use full path for #includes from another directory.
diego
parents: 2941
diff changeset
40 #include "libavutil/avstring.h"
4872
304a0ea063f0 Rename bitstream.h to get_bits.h.
stefano
parents: 4633
diff changeset
41 #include "libavcodec/get_bits.h"
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
42 #include "avformat.h"
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
43 #include "mpegts.h"
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
44
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
45 #include <unistd.h>
1754
1f7a6dc01100 move networking #includes into separate file
mru
parents: 1673
diff changeset
46 #include "network.h"
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
47 #include <assert.h>
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
48
4388
80f21f72d7d6 Split rtp.h in rtp.h, rtpdec.h, and rtpenc.h
lucabe
parents: 4387
diff changeset
49 #include "rtpdec.h"
6339
491eea5c52d6 Remove mostly unnecessary rtpdec_*.h files, store the declarations in one file
mstorsjo
parents: 6251
diff changeset
50 #include "rtpdec_formats.h"
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
51
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
52 /**
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
53 RTP/H264 specific private data.
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
54 */
3975
44561554cb7e Rename RTP payload contexts to PayloadContext, suggested by Luca in
rbultje
parents: 3292
diff changeset
55 struct PayloadContext {
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
56 unsigned long cookie; ///< sanity check, to make sure we get the pointer we're expecting.
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
57
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
58 //sdp setup parameters
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
59 uint8_t profile_idc; ///< from the sdp setup parameters.
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
60 uint8_t profile_iop; ///< from the sdp setup parameters.
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
61 uint8_t level_idc; ///< from the sdp setup parameters.
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
62 int packetization_mode; ///< from the sdp setup parameters.
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
63 #ifdef DEBUG
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
64 int packet_types_received[32];
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
65 #endif
3975
44561554cb7e Rename RTP payload contexts to PayloadContext, suggested by Luca in
rbultje
parents: 3292
diff changeset
66 };
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
67
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
68 #define MAGIC_COOKIE (0xdeadbeef) ///< Cookie for the extradata; to verify we are what we think we are, and that we haven't been freed.
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
69 #define DEAD_COOKIE (0xdeaddead) ///< Cookie for the extradata; once it is freed.
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
70
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
71 /* ---------------- private code */
6188
34f4b569637f rtpdec: Return ENOMEM if H.264 RTP fails to allocate memory for SDP extradata
mstorsjo
parents: 6076
diff changeset
72 static int sdp_parse_fmtp_config_h264(AVStream * stream,
6189
ed6c50412998 Reindent
mstorsjo
parents: 6188
diff changeset
73 PayloadContext * h264_data,
ed6c50412998 Reindent
mstorsjo
parents: 6188
diff changeset
74 char *attr, char *value)
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
75 {
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
76 AVCodecContext *codec = stream->codec;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
77 assert(codec->codec_id == CODEC_ID_H264);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
78 assert(h264_data != NULL);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
79
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
80 if (!strcmp(attr, "packetization-mode")) {
4628
e2fa3c2bc471 Add context to some av_log() calls.
benoit
parents: 4388
diff changeset
81 av_log(codec, AV_LOG_DEBUG, "RTP Packetization Mode: %d\n", atoi(value));
2362
6d50c1518d8a fix the packetization mode parsing
lu_zero
parents: 2250
diff changeset
82 h264_data->packetization_mode = atoi(value);
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
83 /*
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
84 Packetization Mode:
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
85 0 or not present: Single NAL mode (Only nals from 1-23 are allowed)
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
86 1: Non-interleaved Mode: 1-23, 24 (STAP-A), 28 (FU-A) are allowed.
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
87 2: Interleaved Mode: 25 (STAP-B), 26 (MTAP16), 27 (MTAP24), 28 (FU-A), and 29 (FU-B) are allowed.
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
88 */
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
89 if (h264_data->packetization_mode > 1)
4628
e2fa3c2bc471 Add context to some av_log() calls.
benoit
parents: 4388
diff changeset
90 av_log(codec, AV_LOG_ERROR,
e2fa3c2bc471 Add context to some av_log() calls.
benoit
parents: 4388
diff changeset
91 "Interleaved RTP mode is not supported yet.");
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
92 } else if (!strcmp(attr, "profile-level-id")) {
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
93 if (strlen(value) == 6) {
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
94 char buffer[3];
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
95 // 6 characters=3 bytes, in hex.
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
96 uint8_t profile_idc;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
97 uint8_t profile_iop;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
98 uint8_t level_idc;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
99
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
100 buffer[0] = value[0]; buffer[1] = value[1]; buffer[2] = '\0';
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
101 profile_idc = strtol(buffer, NULL, 16);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
102 buffer[0] = value[2]; buffer[1] = value[3];
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
103 profile_iop = strtol(buffer, NULL, 16);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
104 buffer[0] = value[4]; buffer[1] = value[5];
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
105 level_idc = strtol(buffer, NULL, 16);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
106
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
107 // set the parameters...
4628
e2fa3c2bc471 Add context to some av_log() calls.
benoit
parents: 4388
diff changeset
108 av_log(codec, AV_LOG_DEBUG,
e2fa3c2bc471 Add context to some av_log() calls.
benoit
parents: 4388
diff changeset
109 "RTP Profile IDC: %x Profile IOP: %x Level: %x\n",
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
110 profile_idc, profile_iop, level_idc);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
111 h264_data->profile_idc = profile_idc;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
112 h264_data->profile_iop = profile_iop;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
113 h264_data->level_idc = level_idc;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
114 }
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
115 } else if (!strcmp(attr, "sprop-parameter-sets")) {
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
116 uint8_t start_sequence[]= { 0, 0, 1 };
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
117 codec->extradata_size= 0;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
118 codec->extradata= NULL;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
119
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
120 while (*value) {
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
121 char base64packet[1024];
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
122 uint8_t decoded_packet[1024];
6251
0db22f6ec19e Handle av_base64_decode return value
lu_zero
parents: 6190
diff changeset
123 int packet_size;
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
124 char *dst = base64packet;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
125
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
126 while (*value && *value != ','
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
127 && (dst - base64packet) < sizeof(base64packet) - 1) {
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
128 *dst++ = *value++;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
129 }
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
130 *dst++ = '\0';
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
131
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
132 if (*value == ',')
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
133 value++;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
134
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
135 packet_size= av_base64_decode(decoded_packet, base64packet, sizeof(decoded_packet));
6251
0db22f6ec19e Handle av_base64_decode return value
lu_zero
parents: 6190
diff changeset
136 if (packet_size > 0) {
5739
84bfac703b3a Properly pad H.264 extradata when taken from fmtp SDP attributes
mstorsjo
parents: 5726
diff changeset
137 uint8_t *dest = av_malloc(packet_size + sizeof(start_sequence) +
84bfac703b3a Properly pad H.264 extradata when taken from fmtp SDP attributes
mstorsjo
parents: 5726
diff changeset
138 codec->extradata_size +
84bfac703b3a Properly pad H.264 extradata when taken from fmtp SDP attributes
mstorsjo
parents: 5726
diff changeset
139 FF_INPUT_BUFFER_PADDING_SIZE);
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
140 if(dest)
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
141 {
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
142 if(codec->extradata_size)
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
143 {
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
144 // av_realloc?
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
145 memcpy(dest, codec->extradata, codec->extradata_size);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
146 av_free(codec->extradata);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
147 }
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
148
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
149 memcpy(dest+codec->extradata_size, start_sequence, sizeof(start_sequence));
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
150 memcpy(dest+codec->extradata_size+sizeof(start_sequence), decoded_packet, packet_size);
5739
84bfac703b3a Properly pad H.264 extradata when taken from fmtp SDP attributes
mstorsjo
parents: 5726
diff changeset
151 memset(dest+codec->extradata_size+sizeof(start_sequence)+
84bfac703b3a Properly pad H.264 extradata when taken from fmtp SDP attributes
mstorsjo
parents: 5726
diff changeset
152 packet_size, 0, FF_INPUT_BUFFER_PADDING_SIZE);
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
153
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
154 codec->extradata= dest;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
155 codec->extradata_size+= sizeof(start_sequence)+packet_size;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
156 } else {
4628
e2fa3c2bc471 Add context to some av_log() calls.
benoit
parents: 4388
diff changeset
157 av_log(codec, AV_LOG_ERROR, "Unable to allocate memory for extradata!");
6188
34f4b569637f rtpdec: Return ENOMEM if H.264 RTP fails to allocate memory for SDP extradata
mstorsjo
parents: 6076
diff changeset
158 return AVERROR(ENOMEM);
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
159 }
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
160 }
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
161 }
4628
e2fa3c2bc471 Add context to some av_log() calls.
benoit
parents: 4388
diff changeset
162 av_log(codec, AV_LOG_DEBUG, "Extradata set to %p (size: %d)!", codec->extradata, codec->extradata_size);
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
163 }
6188
34f4b569637f rtpdec: Return ENOMEM if H.264 RTP fails to allocate memory for SDP extradata
mstorsjo
parents: 6076
diff changeset
164 return 0;
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
165 }
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
166
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
167 // return 0 on packet, no more left, 1 on packet, 1 on partial packet...
4387
5c42816e12c6 Add "AVFormatContext *ctx" (that being the RTSP demuxer's) as first argument
rbultje
parents: 4331
diff changeset
168 static int h264_handle_packet(AVFormatContext *ctx,
5c42816e12c6 Add "AVFormatContext *ctx" (that being the RTSP demuxer's) as first argument
rbultje
parents: 4331
diff changeset
169 PayloadContext *data,
3976
64056a0c38ce Change function prototype of RTPDynamicPayloadHandler.parse_packet() to
rbultje
parents: 3975
diff changeset
170 AVStream *st,
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
171 AVPacket * pkt,
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
172 uint32_t * timestamp,
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
173 const uint8_t * buf,
2941
6da0564c9d02 Add a flags field to the RTPDynamicPayloadPacketHandlerProc (PKT_FLAG_*).
rbultje
parents: 2702
diff changeset
174 int len, int flags)
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
175 {
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
176 uint8_t nal = buf[0];
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
177 uint8_t type = (nal & 0x1f);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
178 int result= 0;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
179 uint8_t start_sequence[]= {0, 0, 1};
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
180
3292
7100924e2932 Fix non-debug build.
mmu_man
parents: 3286
diff changeset
181 #ifdef DEBUG
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
182 assert(data);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
183 assert(data->cookie == MAGIC_COOKIE);
3292
7100924e2932 Fix non-debug build.
mmu_man
parents: 3286
diff changeset
184 #endif
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
185 assert(buf);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
186
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
187 if (type >= 1 && type <= 23)
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
188 type = 1; // simplify the case. (these are all the nal types used internally by the h264 codec)
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
189 switch (type) {
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
190 case 0: // undefined;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
191 result= -1;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
192 break;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
193
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
194 case 1:
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
195 av_new_packet(pkt, len+sizeof(start_sequence));
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
196 memcpy(pkt->data, start_sequence, sizeof(start_sequence));
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
197 memcpy(pkt->data+sizeof(start_sequence), buf, len);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
198 #ifdef DEBUG
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
199 data->packet_types_received[nal & 0x1f]++;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
200 #endif
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
201 break;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
202
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
203 case 24: // STAP-A (one packet, multiple nals)
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
204 // consume the STAP-A NAL
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
205 buf++;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
206 len--;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
207 // first we are going to figure out the total size....
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
208 {
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
209 int pass= 0;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
210 int total_length= 0;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
211 uint8_t *dst= NULL;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
212
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
213 for(pass= 0; pass<2; pass++) {
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
214 const uint8_t *src= buf;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
215 int src_len= len;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
216
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
217 do {
1673
a782462e2497 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 1670
diff changeset
218 uint16_t nal_size = AV_RB16(src); // this going to be a problem if unaligned (can it be?)
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
219
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
220 // consume the length of the aggregate...
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
221 src += 2;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
222 src_len -= 2;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
223
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
224 if (nal_size <= src_len) {
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
225 if(pass==0) {
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
226 // counting...
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
227 total_length+= sizeof(start_sequence)+nal_size;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
228 } else {
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
229 // copying
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
230 assert(dst);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
231 memcpy(dst, start_sequence, sizeof(start_sequence));
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
232 dst+= sizeof(start_sequence);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
233 memcpy(dst, src, nal_size);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
234 #ifdef DEBUG
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
235 data->packet_types_received[*src & 0x1f]++;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
236 #endif
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
237 dst+= nal_size;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
238 }
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
239 } else {
4628
e2fa3c2bc471 Add context to some av_log() calls.
benoit
parents: 4388
diff changeset
240 av_log(ctx, AV_LOG_ERROR,
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
241 "nal size exceeds length: %d %d\n", nal_size, src_len);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
242 }
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
243
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
244 // eat what we handled...
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
245 src += nal_size;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
246 src_len -= nal_size;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
247
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
248 if (src_len < 0)
4628
e2fa3c2bc471 Add context to some av_log() calls.
benoit
parents: 4388
diff changeset
249 av_log(ctx, AV_LOG_ERROR,
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
250 "Consumed more bytes than we got! (%d)\n", src_len);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
251 } while (src_len > 2); // because there could be rtp padding..
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
252
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
253 if(pass==0) {
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
254 // now we know the total size of the packet (with the start sequences added)
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
255 av_new_packet(pkt, total_length);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
256 dst= pkt->data;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
257 } else {
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
258 assert(dst-pkt->data==total_length);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
259 }
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
260 }
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
261 }
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
262 break;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
263
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
264 case 25: // STAP-B
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
265 case 26: // MTAP-16
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
266 case 27: // MTAP-24
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
267 case 29: // FU-B
4628
e2fa3c2bc471 Add context to some av_log() calls.
benoit
parents: 4388
diff changeset
268 av_log(ctx, AV_LOG_ERROR,
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
269 "Unhandled type (%d) (See RFC for implementation details\n",
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
270 type);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
271 result= -1;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
272 break;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
273
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
274 case 28: // FU-A (fragmented nal)
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
275 buf++;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
276 len--; // skip the fu_indicator
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
277 {
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
278 // these are the same as above, we just redo them here for clarity...
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
279 uint8_t fu_indicator = nal;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
280 uint8_t fu_header = *buf; // read the fu_header.
2154
b849507913da Remove the unnecessary masking when extracting the start bit in the H.264 RTP
takis
parents: 1983
diff changeset
281 uint8_t start_bit = fu_header >> 7;
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
282 // uint8_t end_bit = (fu_header & 0x40) >> 6;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
283 uint8_t nal_type = (fu_header & 0x1f);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
284 uint8_t reconstructed_nal;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
285
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
286 // reconstruct this packet's true nal; only the data follows..
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
287 reconstructed_nal = fu_indicator & (0xe0); // the original nal forbidden bit and NRI are stored in this packet's nal;
2155
a661d4e7cab2 Remove the unnecessary masking when reconstructing the NAL unit header in the
takis
parents: 2154
diff changeset
288 reconstructed_nal |= nal_type;
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
289
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
290 // skip the fu_header...
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
291 buf++;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
292 len--;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
293
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
294 #ifdef DEBUG
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
295 if (start_bit)
2156
cfd57cd5252b Remove the unnecessary masking when counting received packet types in the H.264
takis
parents: 2155
diff changeset
296 data->packet_types_received[nal_type]++;
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
297 #endif
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
298 if(start_bit) {
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
299 // copy in the start sequence, and the reconstructed nal....
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
300 av_new_packet(pkt, sizeof(start_sequence)+sizeof(nal)+len);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
301 memcpy(pkt->data, start_sequence, sizeof(start_sequence));
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
302 pkt->data[sizeof(start_sequence)]= reconstructed_nal;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
303 memcpy(pkt->data+sizeof(start_sequence)+sizeof(nal), buf, len);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
304 } else {
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
305 av_new_packet(pkt, len);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
306 memcpy(pkt->data, buf, len);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
307 }
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
308 }
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
309 break;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
310
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
311 case 30: // undefined
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
312 case 31: // undefined
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
313 default:
4628
e2fa3c2bc471 Add context to some av_log() calls.
benoit
parents: 4388
diff changeset
314 av_log(ctx, AV_LOG_ERROR, "Undefined type (%d)", type);
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
315 result= -1;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
316 break;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
317 }
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
318
4633
0c69b895a01f Don't let finalize_packet() touch pkt->stream_index. Instead, let individual
rbultje
parents: 4628
diff changeset
319 pkt->stream_index = st->index;
0c69b895a01f Don't let finalize_packet() touch pkt->stream_index. Instead, let individual
rbultje
parents: 4628
diff changeset
320
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
321 return result;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
322 }
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
323
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
324 /* ---------------- public code */
5113
75e51cba276e Use named initializers and use new/free_context() instead of extradata()
rbultje
parents: 4872
diff changeset
325 static PayloadContext *h264_new_context(void)
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
326 {
3975
44561554cb7e Rename RTP payload contexts to PayloadContext, suggested by Luca in
rbultje
parents: 3292
diff changeset
327 PayloadContext *data =
44561554cb7e Rename RTP payload contexts to PayloadContext, suggested by Luca in
rbultje
parents: 3292
diff changeset
328 av_mallocz(sizeof(PayloadContext) +
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
329 FF_INPUT_BUFFER_PADDING_SIZE);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
330
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
331 if (data) {
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
332 data->cookie = MAGIC_COOKIE;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
333 }
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
334
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
335 return data;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
336 }
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
337
5113
75e51cba276e Use named initializers and use new/free_context() instead of extradata()
rbultje
parents: 4872
diff changeset
338 static void h264_free_context(PayloadContext *data)
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
339 {
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
340 #ifdef DEBUG
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
341 int ii;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
342
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
343 for (ii = 0; ii < 32; ii++) {
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
344 if (data->packet_types_received[ii])
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
345 av_log(NULL, AV_LOG_DEBUG, "Received %d packets of type %d\n",
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
346 data->packet_types_received[ii], ii);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
347 }
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
348 #endif
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
349
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
350 assert(data);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
351 assert(data->cookie == MAGIC_COOKIE);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
352
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
353 // avoid stale pointers (assert)
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
354 data->cookie = DEAD_COOKIE;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
355
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
356 // and clear out this...
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
357 av_free(data);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
358 }
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
359
4067
8adccfc01be3 Change function prototype of the sdp_parse_a_line in DynamicProtocolHandler.
rbultje
parents: 3976
diff changeset
360 static int parse_h264_sdp_line(AVFormatContext *s, int st_index,
8adccfc01be3 Change function prototype of the sdp_parse_a_line in DynamicProtocolHandler.
rbultje
parents: 3976
diff changeset
361 PayloadContext *h264_data, const char *line)
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
362 {
4067
8adccfc01be3 Change function prototype of the sdp_parse_a_line in DynamicProtocolHandler.
rbultje
parents: 3976
diff changeset
363 AVStream *stream = s->streams[st_index];
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
364 AVCodecContext *codec = stream->codec;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
365 const char *p = line;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
366
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
367 assert(h264_data->cookie == MAGIC_COOKIE);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
368
2193
5ce5fad0dfac replace the uses of old string functions that Reimar missed
mru
parents: 2156
diff changeset
369 if (av_strstart(p, "framesize:", &p)) {
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
370 char buf1[50];
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
371 char *dst = buf1;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
372
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
373 // remove the protocol identifier..
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
374 while (*p && *p == ' ') p++; // strip spaces.
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
375 while (*p && *p != ' ') p++; // eat protocol identifier
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
376 while (*p && *p == ' ') p++; // strip trailing spaces.
5352
c8a47f9a36a8 Fix a typo in rtp_h264.c:parse_h264_sdp_line(). Patch by Gordon Irlam
lucabe
parents: 5113
diff changeset
377 while (*p && *p != '-' && (dst - buf1) < sizeof(buf1) - 1) {
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
378 *dst++ = *p++;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
379 }
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
380 *dst = '\0';
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
381
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
382 // a='framesize:96 320-240'
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
383 // set our parameters..
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
384 codec->width = atoi(buf1);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
385 codec->height = atoi(p + 1); // skip the -
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
386 codec->pix_fmt = PIX_FMT_YUV420P;
2193
5ce5fad0dfac replace the uses of old string functions that Reimar missed
mru
parents: 2156
diff changeset
387 } else if (av_strstart(p, "fmtp:", &p)) {
6190
8ee715d46f99 rtpdec: Clean up FMTP parsing code in H.264 RTP depacketizer
mstorsjo
parents: 6189
diff changeset
388 return ff_parse_fmtp(stream, h264_data, p, sdp_parse_fmtp_config_h264);
2193
5ce5fad0dfac replace the uses of old string functions that Reimar missed
mru
parents: 2156
diff changeset
389 } else if (av_strstart(p, "cliprect:", &p)) {
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
390 // could use this if we wanted.
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
391 }
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
392
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
393 return 0; // keep processing it the normal way...
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
394 }
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
395
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
396 /**
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
397 This is the structure for expanding on the dynamic rtp protocols (makes everything static. yay!)
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
398 */
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
399 RTPDynamicProtocolHandler ff_h264_dynamic_handler = {
5113
75e51cba276e Use named initializers and use new/free_context() instead of extradata()
rbultje
parents: 4872
diff changeset
400 .enc_name = "H264",
5910
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5739
diff changeset
401 .codec_type = AVMEDIA_TYPE_VIDEO,
5113
75e51cba276e Use named initializers and use new/free_context() instead of extradata()
rbultje
parents: 4872
diff changeset
402 .codec_id = CODEC_ID_H264,
75e51cba276e Use named initializers and use new/free_context() instead of extradata()
rbultje
parents: 4872
diff changeset
403 .parse_sdp_a_line = parse_h264_sdp_line,
75e51cba276e Use named initializers and use new/free_context() instead of extradata()
rbultje
parents: 4872
diff changeset
404 .open = h264_new_context,
75e51cba276e Use named initializers and use new/free_context() instead of extradata()
rbultje
parents: 4872
diff changeset
405 .close = h264_free_context,
75e51cba276e Use named initializers and use new/free_context() instead of extradata()
rbultje
parents: 4872
diff changeset
406 .parse_packet = h264_handle_packet
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
407 };