annotate rtp_h264.c @ 4387:5c42816e12c6 libavformat

Add "AVFormatContext *ctx" (that being the RTSP demuxer's) as first argument to the parse_packet() function pointer in RTPDynamicProtocolHandlers. This allows these functions to peek back and retrieve values from the demuxer's context (or RTSPState). The ASF/RTP payload parser will use this to be able to parse SDP values (which occur even before the payload ID is given), store them in the RTSPState and then retrieve them while parsing payload data. See "[PATCH] RTSP-MS 13/15: add RTSP demuxer AVFormatContext to parse_packet() function pointer (was: transport context)" mailinglist thread.
author rbultje
date Fri, 06 Feb 2009 01:37:19 +0000
parents 49c1d3b27727
children 80f21f72d7d6
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
4291
f49e5d92ab26 Merge rtp_internal.h in rtp.h, and remove rtp_internal.h
lucabe
parents: 4251
diff changeset
49 #include "rtp.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")) {
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...
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 {
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
234 av_log(NULL, AV_LOG_ERROR,
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)
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
243 av_log(NULL, AV_LOG_ERROR,
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
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
262 av_log(NULL, AV_LOG_ERROR,
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:
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
308 av_log(NULL, AV_LOG_ERROR, "Undefined type (%d)", type);
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
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
313 return result;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
314 }
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
315
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
316 /* ---------------- public code */
3975
44561554cb7e Rename RTP payload contexts to PayloadContext, suggested by Luca in
rbultje
parents: 3292
diff changeset
317 static PayloadContext *h264_new_extradata(void)
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
318 {
3975
44561554cb7e Rename RTP payload contexts to PayloadContext, suggested by Luca in
rbultje
parents: 3292
diff changeset
319 PayloadContext *data =
44561554cb7e Rename RTP payload contexts to PayloadContext, suggested by Luca in
rbultje
parents: 3292
diff changeset
320 av_mallocz(sizeof(PayloadContext) +
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
321 FF_INPUT_BUFFER_PADDING_SIZE);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
322
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
323 if (data) {
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
324 data->cookie = MAGIC_COOKIE;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
325 }
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
326
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
327 return data;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
328 }
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
329
3975
44561554cb7e Rename RTP payload contexts to PayloadContext, suggested by Luca in
rbultje
parents: 3292
diff changeset
330 static void h264_free_extradata(PayloadContext *data)
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
331 {
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
332 #ifdef DEBUG
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
333 int ii;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
334
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
335 for (ii = 0; ii < 32; ii++) {
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
336 if (data->packet_types_received[ii])
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
337 av_log(NULL, AV_LOG_DEBUG, "Received %d packets of type %d\n",
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
338 data->packet_types_received[ii], ii);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
339 }
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
340 #endif
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
341
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
342 assert(data);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
343 assert(data->cookie == MAGIC_COOKIE);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
344
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
345 // avoid stale pointers (assert)
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
346 data->cookie = DEAD_COOKIE;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
347
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
348 // and clear out this...
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
349 av_free(data);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
350 }
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
351
4067
8adccfc01be3 Change function prototype of the sdp_parse_a_line in DynamicProtocolHandler.
rbultje
parents: 3976
diff changeset
352 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
353 PayloadContext *h264_data, const char *line)
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
354 {
4067
8adccfc01be3 Change function prototype of the sdp_parse_a_line in DynamicProtocolHandler.
rbultje
parents: 3976
diff changeset
355 AVStream *stream = s->streams[st_index];
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
356 AVCodecContext *codec = stream->codec;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
357 const char *p = line;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
358
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
359 assert(h264_data->cookie == MAGIC_COOKIE);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
360
2193
5ce5fad0dfac replace the uses of old string functions that Reimar missed
mru
parents: 2156
diff changeset
361 if (av_strstart(p, "framesize:", &p)) {
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
362 char buf1[50];
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
363 char *dst = buf1;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
364
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
365 // remove the protocol identifier..
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
366 while (*p && *p == ' ') p++; // strip spaces.
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
367 while (*p && *p != ' ') p++; // eat protocol identifier
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
368 while (*p && *p == ' ') p++; // strip trailing spaces.
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
369 while (*p && *p != '-' && (buf1 - dst) < sizeof(buf1) - 1) {
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
370 *dst++ = *p++;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
371 }
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
372 *dst = '\0';
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
373
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
374 // a='framesize:96 320-240'
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
375 // set our parameters..
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
376 codec->width = atoi(buf1);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
377 codec->height = atoi(p + 1); // skip the -
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
378 codec->pix_fmt = PIX_FMT_YUV420P;
2193
5ce5fad0dfac replace the uses of old string functions that Reimar missed
mru
parents: 2156
diff changeset
379 } else if (av_strstart(p, "fmtp:", &p)) {
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
380 char attr[256];
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
381 char value[4096];
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
382
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
383 // remove the protocol identifier..
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
384 while (*p && *p == ' ') p++; // strip spaces.
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
385 while (*p && *p != ' ') p++; // eat protocol identifier
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
386 while (*p && *p == ' ') p++; // strip trailing spaces.
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
387
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
388 /* loop on each attribute */
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
389 while (rtsp_next_attr_and_value
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
390 (&p, attr, sizeof(attr), value, sizeof(value))) {
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
391 /* grab the codec extra_data from the config parameter of the fmtp line */
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
392 sdp_parse_fmtp_config_h264(stream, h264_data, attr, value);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
393 }
2193
5ce5fad0dfac replace the uses of old string functions that Reimar missed
mru
parents: 2156
diff changeset
394 } else if (av_strstart(p, "cliprect:", &p)) {
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
395 // could use this if we wanted.
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
396 }
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
397
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
398 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
399
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
400 return 0; // keep processing it the normal way...
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
401 }
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
402
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
403 /**
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
404 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
405 */
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
406 RTPDynamicProtocolHandler ff_h264_dynamic_handler = {
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
407 "H264",
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
408 CODEC_TYPE_VIDEO,
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
409 CODEC_ID_H264,
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
410 parse_h264_sdp_line,
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
411 h264_new_extradata,
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
412 h264_free_extradata,
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
413 h264_handle_packet
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
414 };