annotate rtp_h264.c @ 3957:9f943bb755f9 libavformat

Rename RTSPProtocol to RTSPLowerTransport, so that its name properly tells us that it only describes the lower-level transport (TCP vs. UDP) and not the actual data layout (e.g. RDT vs. RTP). See discussion in "Realmedia patch" thread on ML.
author rbultje
date Tue, 30 Sep 2008 13:18:41 +0000
parents 7100924e2932
children 44561554cb7e
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)
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
3 * Copyright (c) 2006 Ryan Martell.
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 /**
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
23 * @file rtp_h264.c
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
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
49 #include "rtp_internal.h"
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 */
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
55 typedef struct h264_rtp_extra_data {
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
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
66 } h264_rtp_extra_data;
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,
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
73 h264_rtp_extra_data * h264_data,
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")) {
2362
6d50c1518d8a fix the packetization mode parsing
lu_zero
parents: 2250
diff changeset
81 av_log(NULL, AV_LOG_DEBUG, "H.264/RTP Packetization Mode: %d\n", atoi(value));
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)
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
90 av_log(stream, AV_LOG_ERROR,
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
91 "H.264/RTP Interleaved RTP mode is not supported yet.");
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...
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
108 av_log(NULL, AV_LOG_DEBUG,
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
109 "H.264/RTP Profile IDC: %x Profile IOP: %x Level: %x\n",
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 {
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
153 av_log(NULL, AV_LOG_ERROR, "H.264/RTP Unable to allocate memory for extradata!");
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 }
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
157 av_log(NULL, AV_LOG_DEBUG, "H.264/RTP Extradata set to %p (size: %d)!", codec->extradata, codec->extradata_size);
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...
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
162 static int h264_handle_packet(RTPDemuxContext * s,
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
163 AVPacket * pkt,
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
164 uint32_t * timestamp,
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
165 const uint8_t * buf,
2941
6da0564c9d02 Add a flags field to the RTPDynamicPayloadPacketHandlerProc (PKT_FLAG_*).
rbultje
parents: 2702
diff changeset
166 int len, int flags)
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
167 {
2702
6a7b82888880 Enable debug variable only when debug code is enabled, fixes the warning:
diego
parents: 2362
diff changeset
168 #ifdef DEBUG
1888
f794ef55fafe Corrections so that builds with DEBUG work
mbardiaux
parents: 1754
diff changeset
169 h264_rtp_extra_data *data = s->dynamic_protocol_context;
2702
6a7b82888880 Enable debug variable only when debug code is enabled, fixes the warning:
diego
parents: 2362
diff changeset
170 #endif
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
171 uint8_t nal = buf[0];
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
172 uint8_t type = (nal & 0x1f);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
173 int result= 0;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
174 uint8_t start_sequence[]= {0, 0, 1};
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
175
3292
7100924e2932 Fix non-debug build.
mmu_man
parents: 3286
diff changeset
176 #ifdef DEBUG
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
177 assert(data);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
178 assert(data->cookie == MAGIC_COOKIE);
3292
7100924e2932 Fix non-debug build.
mmu_man
parents: 3286
diff changeset
179 #endif
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
180 assert(buf);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
181
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
182 if (type >= 1 && type <= 23)
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
183 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
184 switch (type) {
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
185 case 0: // undefined;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
186 result= -1;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
187 break;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
188
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
189 case 1:
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
190 av_new_packet(pkt, len+sizeof(start_sequence));
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
191 memcpy(pkt->data, start_sequence, sizeof(start_sequence));
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
192 memcpy(pkt->data+sizeof(start_sequence), buf, len);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
193 #ifdef DEBUG
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
194 data->packet_types_received[nal & 0x1f]++;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
195 #endif
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
196 break;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
197
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
198 case 24: // STAP-A (one packet, multiple nals)
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
199 // consume the STAP-A NAL
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
200 buf++;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
201 len--;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
202 // first we are going to figure out the total size....
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
203 {
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
204 int pass= 0;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
205 int total_length= 0;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
206 uint8_t *dst= NULL;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
207
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
208 for(pass= 0; pass<2; pass++) {
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
209 const uint8_t *src= buf;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
210 int src_len= len;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
211
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
212 do {
1673
a782462e2497 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 1670
diff changeset
213 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
214
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
215 // consume the length of the aggregate...
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
216 src += 2;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
217 src_len -= 2;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
218
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
219 if (nal_size <= src_len) {
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
220 if(pass==0) {
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
221 // counting...
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
222 total_length+= sizeof(start_sequence)+nal_size;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
223 } else {
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
224 // copying
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
225 assert(dst);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
226 memcpy(dst, start_sequence, sizeof(start_sequence));
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
227 dst+= sizeof(start_sequence);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
228 memcpy(dst, src, nal_size);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
229 #ifdef DEBUG
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
230 data->packet_types_received[*src & 0x1f]++;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
231 #endif
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
232 dst+= nal_size;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
233 }
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
234 } else {
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
235 av_log(NULL, AV_LOG_ERROR,
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
236 "nal size exceeds length: %d %d\n", nal_size, src_len);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
237 }
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
238
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
239 // eat what we handled...
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
240 src += nal_size;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
241 src_len -= nal_size;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
242
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
243 if (src_len < 0)
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
244 av_log(NULL, AV_LOG_ERROR,
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
245 "Consumed more bytes than we got! (%d)\n", src_len);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
246 } while (src_len > 2); // because there could be rtp padding..
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(pass==0) {
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
249 // 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
250 av_new_packet(pkt, total_length);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
251 dst= pkt->data;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
252 } else {
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
253 assert(dst-pkt->data==total_length);
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 }
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
257 break;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
258
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
259 case 25: // STAP-B
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
260 case 26: // MTAP-16
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
261 case 27: // MTAP-24
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
262 case 29: // FU-B
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
263 av_log(NULL, AV_LOG_ERROR,
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
264 "Unhandled type (%d) (See RFC for implementation details\n",
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
265 type);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
266 result= -1;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
267 break;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
268
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
269 case 28: // FU-A (fragmented nal)
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
270 buf++;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
271 len--; // skip the fu_indicator
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
272 {
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
273 // these are the same as above, we just redo them here for clarity...
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
274 uint8_t fu_indicator = nal;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
275 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
276 uint8_t start_bit = fu_header >> 7;
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
277 // uint8_t end_bit = (fu_header & 0x40) >> 6;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
278 uint8_t nal_type = (fu_header & 0x1f);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
279 uint8_t reconstructed_nal;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
280
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
281 // reconstruct this packet's true nal; only the data follows..
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
282 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
283 reconstructed_nal |= nal_type;
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
284
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
285 // skip the fu_header...
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
286 buf++;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
287 len--;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
288
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
289 #ifdef DEBUG
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
290 if (start_bit)
2156
cfd57cd5252b Remove the unnecessary masking when counting received packet types in the H.264
takis
parents: 2155
diff changeset
291 data->packet_types_received[nal_type]++;
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
292 #endif
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
293 if(start_bit) {
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
294 // copy in the start sequence, and the reconstructed nal....
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
295 av_new_packet(pkt, sizeof(start_sequence)+sizeof(nal)+len);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
296 memcpy(pkt->data, start_sequence, sizeof(start_sequence));
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
297 pkt->data[sizeof(start_sequence)]= reconstructed_nal;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
298 memcpy(pkt->data+sizeof(start_sequence)+sizeof(nal), buf, len);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
299 } else {
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
300 av_new_packet(pkt, len);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
301 memcpy(pkt->data, buf, len);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
302 }
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
303 }
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
304 break;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
305
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
306 case 30: // undefined
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
307 case 31: // undefined
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
308 default:
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
309 av_log(NULL, AV_LOG_ERROR, "Undefined type (%d)", type);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
310 result= -1;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
311 break;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
312 }
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
313
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
314 return result;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
315 }
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
316
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
317 /* ---------------- public code */
1983
fbc66bf1f15d changes some function declarations from () to (void) as per ansi c.
gpoirier
parents: 1888
diff changeset
318 static void *h264_new_extradata(void)
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
319 {
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
320 h264_rtp_extra_data *data =
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
321 av_mallocz(sizeof(h264_rtp_extra_data) +
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
322 FF_INPUT_BUFFER_PADDING_SIZE);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
323
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
324 if (data) {
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
325 data->cookie = MAGIC_COOKIE;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
326 }
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
327
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
328 return data;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
329 }
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
330
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
331 static void h264_free_extradata(void *d)
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
332 {
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
333 h264_rtp_extra_data *data = (h264_rtp_extra_data *) d;
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
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
354 static int parse_h264_sdp_line(AVStream * stream, void *data,
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
355 const char *line)
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
356 {
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
357 AVCodecContext *codec = stream->codec;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
358 h264_rtp_extra_data *h264_data = (h264_rtp_extra_data *) data;
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 };