annotate rtp_h264.c @ 4638:801468f16243 libavformat

Make RTSP-MS-over-UDP negotiation work. See "[PATCH] RTSP-MS 8/15: fix RTSP-MS UDP" thread on mailinglist. Basically, UDP setup needs to be done in a particular order (first rtx on two UDP ports (one for RTP, one for RTCP), then the other streams over one, single port for all of them together). Not doing this correctly results in a "461" error (invalid transport) during setup.
author rbultje
date Tue, 03 Mar 2009 16:52:35 +0000
parents 0c69b895a01f
children 304a0ea063f0
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 /**
4331
49c1d3b27727 Use full internal pathname in doxygen @file directives.
diego
parents: 4291
diff changeset
23 * @file libavformat/rtp_h264.c
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"
6f61c3b36632 Use full path for #includes from another directory.
diego
parents: 2941
diff changeset
41 #include "libavcodec/bitstream.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"
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
50 #include "rtp_h264.h"
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 */
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
72 static void sdp_parse_fmtp_config_h264(AVStream * stream,
3975
44561554cb7e Rename RTP payload contexts to PayloadContext, suggested by Luca in
rbultje
parents: 3292
diff changeset
73 PayloadContext * h264_data,
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
74 char *attr, char *value)
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];
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
123 uint32_t packet_size;
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));
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
136 if (packet_size) {
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
137 uint8_t *dest= av_malloc(packet_size+sizeof(start_sequence)+codec->extradata_size);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
138 if(dest)
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
139 {
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
140 if(codec->extradata_size)
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
141 {
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
142 // av_realloc?
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
143 memcpy(dest, codec->extradata, codec->extradata_size);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
144 av_free(codec->extradata);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
145 }
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
146
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
147 memcpy(dest+codec->extradata_size, start_sequence, sizeof(start_sequence));
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
148 memcpy(dest+codec->extradata_size+sizeof(start_sequence), decoded_packet, packet_size);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
149
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
150 codec->extradata= dest;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
151 codec->extradata_size+= sizeof(start_sequence)+packet_size;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
152 } else {
4628
e2fa3c2bc471 Add context to some av_log() calls.
benoit
parents: 4388
diff changeset
153 av_log(codec, AV_LOG_ERROR, "Unable to allocate memory for extradata!");
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
154 }
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
155 }
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
156 }
4628
e2fa3c2bc471 Add context to some av_log() calls.
benoit
parents: 4388
diff changeset
157 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
158 }
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 // 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
162 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
163 PayloadContext *data,
3976
64056a0c38ce Change function prototype of RTPDynamicPayloadHandler.parse_packet() to
rbultje
parents: 3975
diff changeset
164 AVStream *st,
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
165 AVPacket * pkt,
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
166 uint32_t * timestamp,
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
167 const uint8_t * buf,
2941
6da0564c9d02 Add a flags field to the RTPDynamicPayloadPacketHandlerProc (PKT_FLAG_*).
rbultje
parents: 2702
diff changeset
168 int len, int flags)
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
169 {
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
170 uint8_t nal = buf[0];
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
171 uint8_t type = (nal & 0x1f);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
172 int result= 0;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
173 uint8_t start_sequence[]= {0, 0, 1};
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
174
3292
7100924e2932 Fix non-debug build.
mmu_man
parents: 3286
diff changeset
175 #ifdef DEBUG
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
176 assert(data);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
177 assert(data->cookie == MAGIC_COOKIE);
3292
7100924e2932 Fix non-debug build.
mmu_man
parents: 3286
diff changeset
178 #endif
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
179 assert(buf);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
180
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
181 if (type >= 1 && type <= 23)
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
182 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
183 switch (type) {
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
184 case 0: // undefined;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
185 result= -1;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
186 break;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
187
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
188 case 1:
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
189 av_new_packet(pkt, len+sizeof(start_sequence));
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
190 memcpy(pkt->data, start_sequence, sizeof(start_sequence));
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
191 memcpy(pkt->data+sizeof(start_sequence), buf, len);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
192 #ifdef DEBUG
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
193 data->packet_types_received[nal & 0x1f]++;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
194 #endif
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
195 break;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
196
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
197 case 24: // STAP-A (one packet, multiple nals)
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
198 // consume the STAP-A NAL
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
199 buf++;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
200 len--;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
201 // first we are going to figure out the total size....
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
202 {
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
203 int pass= 0;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
204 int total_length= 0;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
205 uint8_t *dst= NULL;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
206
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
207 for(pass= 0; pass<2; pass++) {
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
208 const uint8_t *src= buf;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
209 int src_len= len;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
210
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
211 do {
1673
a782462e2497 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 1670
diff changeset
212 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
213
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
214 // consume the length of the aggregate...
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
215 src += 2;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
216 src_len -= 2;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
217
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
218 if (nal_size <= src_len) {
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
219 if(pass==0) {
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
220 // counting...
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
221 total_length+= sizeof(start_sequence)+nal_size;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
222 } else {
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
223 // copying
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
224 assert(dst);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
225 memcpy(dst, start_sequence, sizeof(start_sequence));
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
226 dst+= sizeof(start_sequence);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
227 memcpy(dst, src, nal_size);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
228 #ifdef DEBUG
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
229 data->packet_types_received[*src & 0x1f]++;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
230 #endif
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
231 dst+= nal_size;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
232 }
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
233 } else {
4628
e2fa3c2bc471 Add context to some av_log() calls.
benoit
parents: 4388
diff changeset
234 av_log(ctx, AV_LOG_ERROR,
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
235 "nal size exceeds length: %d %d\n", nal_size, src_len);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
236 }
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
237
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
238 // eat what we handled...
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
239 src += nal_size;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
240 src_len -= nal_size;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
241
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
242 if (src_len < 0)
4628
e2fa3c2bc471 Add context to some av_log() calls.
benoit
parents: 4388
diff changeset
243 av_log(ctx, AV_LOG_ERROR,
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
244 "Consumed more bytes than we got! (%d)\n", src_len);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
245 } while (src_len > 2); // because there could be rtp padding..
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
246
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
247 if(pass==0) {
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
248 // 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
249 av_new_packet(pkt, total_length);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
250 dst= pkt->data;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
251 } else {
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
252 assert(dst-pkt->data==total_length);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
253 }
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
254 }
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
255 }
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
256 break;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
257
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
258 case 25: // STAP-B
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
259 case 26: // MTAP-16
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
260 case 27: // MTAP-24
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
261 case 29: // FU-B
4628
e2fa3c2bc471 Add context to some av_log() calls.
benoit
parents: 4388
diff changeset
262 av_log(ctx, AV_LOG_ERROR,
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
263 "Unhandled type (%d) (See RFC for implementation details\n",
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
264 type);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
265 result= -1;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
266 break;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
267
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
268 case 28: // FU-A (fragmented nal)
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
269 buf++;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
270 len--; // skip the fu_indicator
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
271 {
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
272 // these are the same as above, we just redo them here for clarity...
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
273 uint8_t fu_indicator = nal;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
274 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
275 uint8_t start_bit = fu_header >> 7;
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
276 // uint8_t end_bit = (fu_header & 0x40) >> 6;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
277 uint8_t nal_type = (fu_header & 0x1f);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
278 uint8_t reconstructed_nal;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
279
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
280 // reconstruct this packet's true nal; only the data follows..
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
281 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
282 reconstructed_nal |= nal_type;
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
283
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
284 // skip the fu_header...
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
285 buf++;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
286 len--;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
287
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
288 #ifdef DEBUG
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
289 if (start_bit)
2156
cfd57cd5252b Remove the unnecessary masking when counting received packet types in the H.264
takis
parents: 2155
diff changeset
290 data->packet_types_received[nal_type]++;
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
291 #endif
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
292 if(start_bit) {
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
293 // copy in the start sequence, and the reconstructed nal....
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
294 av_new_packet(pkt, sizeof(start_sequence)+sizeof(nal)+len);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
295 memcpy(pkt->data, start_sequence, sizeof(start_sequence));
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
296 pkt->data[sizeof(start_sequence)]= reconstructed_nal;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
297 memcpy(pkt->data+sizeof(start_sequence)+sizeof(nal), buf, len);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
298 } else {
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
299 av_new_packet(pkt, len);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
300 memcpy(pkt->data, buf, len);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
301 }
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
302 }
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
303 break;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
304
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
305 case 30: // undefined
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
306 case 31: // undefined
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
307 default:
4628
e2fa3c2bc471 Add context to some av_log() calls.
benoit
parents: 4388
diff changeset
308 av_log(ctx, AV_LOG_ERROR, "Undefined type (%d)", type);
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
309 result= -1;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
310 break;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
311 }
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
312
4633
0c69b895a01f Don't let finalize_packet() touch pkt->stream_index. Instead, let individual
rbultje
parents: 4628
diff changeset
313 pkt->stream_index = st->index;
0c69b895a01f Don't let finalize_packet() touch pkt->stream_index. Instead, let individual
rbultje
parents: 4628
diff changeset
314
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
315 return result;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
316 }
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
317
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
318 /* ---------------- public code */
3975
44561554cb7e Rename RTP payload contexts to PayloadContext, suggested by Luca in
rbultje
parents: 3292
diff changeset
319 static PayloadContext *h264_new_extradata(void)
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
320 {
3975
44561554cb7e Rename RTP payload contexts to PayloadContext, suggested by Luca in
rbultje
parents: 3292
diff changeset
321 PayloadContext *data =
44561554cb7e Rename RTP payload contexts to PayloadContext, suggested by Luca in
rbultje
parents: 3292
diff changeset
322 av_mallocz(sizeof(PayloadContext) +
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
323 FF_INPUT_BUFFER_PADDING_SIZE);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
324
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
325 if (data) {
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
326 data->cookie = MAGIC_COOKIE;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
327 }
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
328
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
329 return data;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
330 }
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
331
3975
44561554cb7e Rename RTP payload contexts to PayloadContext, suggested by Luca in
rbultje
parents: 3292
diff changeset
332 static void h264_free_extradata(PayloadContext *data)
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
333 {
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
334 #ifdef DEBUG
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
335 int ii;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
336
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
337 for (ii = 0; ii < 32; ii++) {
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
338 if (data->packet_types_received[ii])
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
339 av_log(NULL, AV_LOG_DEBUG, "Received %d packets of type %d\n",
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
340 data->packet_types_received[ii], ii);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
341 }
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
342 #endif
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
343
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
344 assert(data);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
345 assert(data->cookie == MAGIC_COOKIE);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
346
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
347 // avoid stale pointers (assert)
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
348 data->cookie = DEAD_COOKIE;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
349
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
350 // and clear out this...
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
351 av_free(data);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
352 }
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
353
4067
8adccfc01be3 Change function prototype of the sdp_parse_a_line in DynamicProtocolHandler.
rbultje
parents: 3976
diff changeset
354 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
355 PayloadContext *h264_data, const char *line)
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
356 {
4067
8adccfc01be3 Change function prototype of the sdp_parse_a_line in DynamicProtocolHandler.
rbultje
parents: 3976
diff changeset
357 AVStream *stream = s->streams[st_index];
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
358 AVCodecContext *codec = stream->codec;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
359 const char *p = line;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
360
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
361 assert(h264_data->cookie == MAGIC_COOKIE);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
362
2193
5ce5fad0dfac replace the uses of old string functions that Reimar missed
mru
parents: 2156
diff changeset
363 if (av_strstart(p, "framesize:", &p)) {
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
364 char buf1[50];
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
365 char *dst = buf1;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
366
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
367 // remove the protocol identifier..
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
368 while (*p && *p == ' ') p++; // strip spaces.
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
369 while (*p && *p != ' ') p++; // eat protocol identifier
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
370 while (*p && *p == ' ') p++; // strip trailing spaces.
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
371 while (*p && *p != '-' && (buf1 - dst) < sizeof(buf1) - 1) {
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
372 *dst++ = *p++;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
373 }
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
374 *dst = '\0';
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
375
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
376 // a='framesize:96 320-240'
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
377 // set our parameters..
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
378 codec->width = atoi(buf1);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
379 codec->height = atoi(p + 1); // skip the -
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
380 codec->pix_fmt = PIX_FMT_YUV420P;
2193
5ce5fad0dfac replace the uses of old string functions that Reimar missed
mru
parents: 2156
diff changeset
381 } else if (av_strstart(p, "fmtp:", &p)) {
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
382 char attr[256];
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
383 char value[4096];
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
384
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
385 // remove the protocol identifier..
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
386 while (*p && *p == ' ') p++; // strip spaces.
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
387 while (*p && *p != ' ') p++; // eat protocol identifier
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
388 while (*p && *p == ' ') p++; // strip trailing spaces.
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
389
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
390 /* loop on each attribute */
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
391 while (rtsp_next_attr_and_value
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
392 (&p, attr, sizeof(attr), value, sizeof(value))) {
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
393 /* grab the codec extra_data from the config parameter of the fmtp line */
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
394 sdp_parse_fmtp_config_h264(stream, h264_data, attr, value);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
395 }
2193
5ce5fad0dfac replace the uses of old string functions that Reimar missed
mru
parents: 2156
diff changeset
396 } else if (av_strstart(p, "cliprect:", &p)) {
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
397 // could use this if we wanted.
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
398 }
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
399
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
400 av_set_pts_info(stream, 33, 1, 90000); // 33 should be right, because the pts is 64 bit? (done elsewhere; this is a one time thing)
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
401
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
402 return 0; // keep processing it the normal way...
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
403 }
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
404
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
405 /**
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
406 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
407 */
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
408 RTPDynamicProtocolHandler ff_h264_dynamic_handler = {
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
409 "H264",
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
410 CODEC_TYPE_VIDEO,
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
411 CODEC_ID_H264,
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
412 parse_h264_sdp_line,
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
413 h264_new_extradata,
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
414 h264_free_extradata,
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
415 h264_handle_packet
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
416 };