annotate rtpdec_h264.c @ 5910:536e5527c1e0 libavformat

Define AVMediaType enum, and use it instead of enum CodecType, which is deprecated and will be dropped at the next major bump.
author stefano
date Tue, 30 Mar 2010 23:30:55 +0000
parents 84bfac703b3a
children 178de7695c6c
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 /**
5726
04b39763b51b Rename RTP depacketizer files from rtp_* to rtpdec_*
mstorsjo
parents: 5697
diff changeset
23 * @file libavformat/rtpdec_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"
4872
304a0ea063f0 Rename bitstream.h to get_bits.h.
stefano
parents: 4633
diff changeset
41 #include "libavcodec/get_bits.h"
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
42 #include "avformat.h"
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
43 #include "mpegts.h"
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
44
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
45 #include <unistd.h>
1754
1f7a6dc01100 move networking #includes into separate file
mru
parents: 1673
diff changeset
46 #include "network.h"
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
47 #include <assert.h>
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
48
4388
80f21f72d7d6 Split rtp.h in rtp.h, rtpdec.h, and rtpenc.h
lucabe
parents: 4387
diff changeset
49 #include "rtpdec.h"
5726
04b39763b51b Rename RTP depacketizer files from rtp_* to rtpdec_*
mstorsjo
parents: 5697
diff changeset
50 #include "rtpdec_h264.h"
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
51
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
52 /**
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
53 RTP/H264 specific private data.
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
54 */
3975
44561554cb7e Rename RTP payload contexts to PayloadContext, suggested by Luca in
rbultje
parents: 3292
diff changeset
55 struct PayloadContext {
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
56 unsigned long cookie; ///< sanity check, to make sure we get the pointer we're expecting.
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
57
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
58 //sdp setup parameters
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
59 uint8_t profile_idc; ///< from the sdp setup parameters.
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
60 uint8_t profile_iop; ///< from the sdp setup parameters.
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
61 uint8_t level_idc; ///< from the sdp setup parameters.
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
62 int packetization_mode; ///< from the sdp setup parameters.
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
63 #ifdef DEBUG
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
64 int packet_types_received[32];
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
65 #endif
3975
44561554cb7e Rename RTP payload contexts to PayloadContext, suggested by Luca in
rbultje
parents: 3292
diff changeset
66 };
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
67
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
68 #define MAGIC_COOKIE (0xdeadbeef) ///< Cookie for the extradata; to verify we are what we think we are, and that we haven't been freed.
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
69 #define DEAD_COOKIE (0xdeaddead) ///< Cookie for the extradata; once it is freed.
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
70
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
71 /* ---------------- private code */
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
72 static void sdp_parse_fmtp_config_h264(AVStream * stream,
3975
44561554cb7e Rename RTP payload contexts to PayloadContext, suggested by Luca in
rbultje
parents: 3292
diff changeset
73 PayloadContext * h264_data,
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
74 char *attr, char *value)
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
75 {
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
76 AVCodecContext *codec = stream->codec;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
77 assert(codec->codec_id == CODEC_ID_H264);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
78 assert(h264_data != NULL);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
79
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
80 if (!strcmp(attr, "packetization-mode")) {
4628
e2fa3c2bc471 Add context to some av_log() calls.
benoit
parents: 4388
diff changeset
81 av_log(codec, AV_LOG_DEBUG, "RTP Packetization Mode: %d\n", atoi(value));
2362
6d50c1518d8a fix the packetization mode parsing
lu_zero
parents: 2250
diff changeset
82 h264_data->packetization_mode = atoi(value);
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
83 /*
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
84 Packetization Mode:
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
85 0 or not present: Single NAL mode (Only nals from 1-23 are allowed)
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
86 1: Non-interleaved Mode: 1-23, 24 (STAP-A), 28 (FU-A) are allowed.
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
87 2: Interleaved Mode: 25 (STAP-B), 26 (MTAP16), 27 (MTAP24), 28 (FU-A), and 29 (FU-B) are allowed.
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
88 */
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
89 if (h264_data->packetization_mode > 1)
4628
e2fa3c2bc471 Add context to some av_log() calls.
benoit
parents: 4388
diff changeset
90 av_log(codec, AV_LOG_ERROR,
e2fa3c2bc471 Add context to some av_log() calls.
benoit
parents: 4388
diff changeset
91 "Interleaved RTP mode is not supported yet.");
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
92 } else if (!strcmp(attr, "profile-level-id")) {
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
93 if (strlen(value) == 6) {
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
94 char buffer[3];
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
95 // 6 characters=3 bytes, in hex.
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
96 uint8_t profile_idc;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
97 uint8_t profile_iop;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
98 uint8_t level_idc;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
99
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
100 buffer[0] = value[0]; buffer[1] = value[1]; buffer[2] = '\0';
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
101 profile_idc = strtol(buffer, NULL, 16);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
102 buffer[0] = value[2]; buffer[1] = value[3];
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
103 profile_iop = strtol(buffer, NULL, 16);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
104 buffer[0] = value[4]; buffer[1] = value[5];
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
105 level_idc = strtol(buffer, NULL, 16);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
106
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
107 // set the parameters...
4628
e2fa3c2bc471 Add context to some av_log() calls.
benoit
parents: 4388
diff changeset
108 av_log(codec, AV_LOG_DEBUG,
e2fa3c2bc471 Add context to some av_log() calls.
benoit
parents: 4388
diff changeset
109 "RTP Profile IDC: %x Profile IOP: %x Level: %x\n",
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
110 profile_idc, profile_iop, level_idc);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
111 h264_data->profile_idc = profile_idc;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
112 h264_data->profile_iop = profile_iop;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
113 h264_data->level_idc = level_idc;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
114 }
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
115 } else if (!strcmp(attr, "sprop-parameter-sets")) {
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
116 uint8_t start_sequence[]= { 0, 0, 1 };
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
117 codec->extradata_size= 0;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
118 codec->extradata= NULL;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
119
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
120 while (*value) {
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
121 char base64packet[1024];
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
122 uint8_t decoded_packet[1024];
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
123 uint32_t packet_size;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
124 char *dst = base64packet;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
125
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
126 while (*value && *value != ','
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
127 && (dst - base64packet) < sizeof(base64packet) - 1) {
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
128 *dst++ = *value++;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
129 }
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
130 *dst++ = '\0';
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
131
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
132 if (*value == ',')
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
133 value++;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
134
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
135 packet_size= av_base64_decode(decoded_packet, base64packet, sizeof(decoded_packet));
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
136 if (packet_size) {
5739
84bfac703b3a Properly pad H.264 extradata when taken from fmtp SDP attributes
mstorsjo
parents: 5726
diff changeset
137 uint8_t *dest = av_malloc(packet_size + sizeof(start_sequence) +
84bfac703b3a Properly pad H.264 extradata when taken from fmtp SDP attributes
mstorsjo
parents: 5726
diff changeset
138 codec->extradata_size +
84bfac703b3a Properly pad H.264 extradata when taken from fmtp SDP attributes
mstorsjo
parents: 5726
diff changeset
139 FF_INPUT_BUFFER_PADDING_SIZE);
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
140 if(dest)
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
141 {
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
142 if(codec->extradata_size)
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
143 {
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
144 // av_realloc?
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
145 memcpy(dest, codec->extradata, codec->extradata_size);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
146 av_free(codec->extradata);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
147 }
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
148
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
149 memcpy(dest+codec->extradata_size, start_sequence, sizeof(start_sequence));
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
150 memcpy(dest+codec->extradata_size+sizeof(start_sequence), decoded_packet, packet_size);
5739
84bfac703b3a Properly pad H.264 extradata when taken from fmtp SDP attributes
mstorsjo
parents: 5726
diff changeset
151 memset(dest+codec->extradata_size+sizeof(start_sequence)+
84bfac703b3a Properly pad H.264 extradata when taken from fmtp SDP attributes
mstorsjo
parents: 5726
diff changeset
152 packet_size, 0, FF_INPUT_BUFFER_PADDING_SIZE);
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
153
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
154 codec->extradata= dest;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
155 codec->extradata_size+= sizeof(start_sequence)+packet_size;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
156 } else {
4628
e2fa3c2bc471 Add context to some av_log() calls.
benoit
parents: 4388
diff changeset
157 av_log(codec, AV_LOG_ERROR, "Unable to allocate memory for extradata!");
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
158 }
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
159 }
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
160 }
4628
e2fa3c2bc471 Add context to some av_log() calls.
benoit
parents: 4388
diff changeset
161 av_log(codec, AV_LOG_DEBUG, "Extradata set to %p (size: %d)!", codec->extradata, codec->extradata_size);
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
162 }
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
163 }
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
164
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
165 // 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
166 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
167 PayloadContext *data,
3976
64056a0c38ce Change function prototype of RTPDynamicPayloadHandler.parse_packet() to
rbultje
parents: 3975
diff changeset
168 AVStream *st,
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
169 AVPacket * pkt,
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
170 uint32_t * timestamp,
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
171 const uint8_t * buf,
2941
6da0564c9d02 Add a flags field to the RTPDynamicPayloadPacketHandlerProc (PKT_FLAG_*).
rbultje
parents: 2702
diff changeset
172 int len, int flags)
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
173 {
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
174 uint8_t nal = buf[0];
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
175 uint8_t type = (nal & 0x1f);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
176 int result= 0;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
177 uint8_t start_sequence[]= {0, 0, 1};
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
178
3292
7100924e2932 Fix non-debug build.
mmu_man
parents: 3286
diff changeset
179 #ifdef DEBUG
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
180 assert(data);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
181 assert(data->cookie == MAGIC_COOKIE);
3292
7100924e2932 Fix non-debug build.
mmu_man
parents: 3286
diff changeset
182 #endif
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
183 assert(buf);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
184
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
185 if (type >= 1 && type <= 23)
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
186 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
187 switch (type) {
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
188 case 0: // undefined;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
189 result= -1;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
190 break;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
191
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
192 case 1:
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
193 av_new_packet(pkt, len+sizeof(start_sequence));
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
194 memcpy(pkt->data, start_sequence, sizeof(start_sequence));
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
195 memcpy(pkt->data+sizeof(start_sequence), buf, len);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
196 #ifdef DEBUG
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
197 data->packet_types_received[nal & 0x1f]++;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
198 #endif
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
199 break;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
200
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
201 case 24: // STAP-A (one packet, multiple nals)
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
202 // consume the STAP-A NAL
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
203 buf++;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
204 len--;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
205 // first we are going to figure out the total size....
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
206 {
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
207 int pass= 0;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
208 int total_length= 0;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
209 uint8_t *dst= NULL;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
210
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
211 for(pass= 0; pass<2; pass++) {
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
212 const uint8_t *src= buf;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
213 int src_len= len;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
214
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
215 do {
1673
a782462e2497 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 1670
diff changeset
216 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
217
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
218 // consume the length of the aggregate...
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
219 src += 2;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
220 src_len -= 2;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
221
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
222 if (nal_size <= src_len) {
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
223 if(pass==0) {
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
224 // counting...
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
225 total_length+= sizeof(start_sequence)+nal_size;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
226 } else {
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
227 // copying
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
228 assert(dst);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
229 memcpy(dst, start_sequence, sizeof(start_sequence));
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
230 dst+= sizeof(start_sequence);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
231 memcpy(dst, src, nal_size);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
232 #ifdef DEBUG
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
233 data->packet_types_received[*src & 0x1f]++;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
234 #endif
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
235 dst+= nal_size;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
236 }
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
237 } else {
4628
e2fa3c2bc471 Add context to some av_log() calls.
benoit
parents: 4388
diff changeset
238 av_log(ctx, AV_LOG_ERROR,
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
239 "nal size exceeds length: %d %d\n", nal_size, src_len);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
240 }
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
241
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
242 // eat what we handled...
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
243 src += nal_size;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
244 src_len -= nal_size;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
245
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
246 if (src_len < 0)
4628
e2fa3c2bc471 Add context to some av_log() calls.
benoit
parents: 4388
diff changeset
247 av_log(ctx, AV_LOG_ERROR,
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
248 "Consumed more bytes than we got! (%d)\n", src_len);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
249 } while (src_len > 2); // because there could be rtp padding..
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
250
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
251 if(pass==0) {
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
252 // 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
253 av_new_packet(pkt, total_length);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
254 dst= pkt->data;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
255 } else {
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
256 assert(dst-pkt->data==total_length);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
257 }
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
258 }
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
259 }
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
260 break;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
261
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
262 case 25: // STAP-B
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
263 case 26: // MTAP-16
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
264 case 27: // MTAP-24
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
265 case 29: // FU-B
4628
e2fa3c2bc471 Add context to some av_log() calls.
benoit
parents: 4388
diff changeset
266 av_log(ctx, AV_LOG_ERROR,
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
267 "Unhandled type (%d) (See RFC for implementation details\n",
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
268 type);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
269 result= -1;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
270 break;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
271
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
272 case 28: // FU-A (fragmented nal)
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
273 buf++;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
274 len--; // skip the fu_indicator
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
275 {
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
276 // these are the same as above, we just redo them here for clarity...
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
277 uint8_t fu_indicator = nal;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
278 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
279 uint8_t start_bit = fu_header >> 7;
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
280 // uint8_t end_bit = (fu_header & 0x40) >> 6;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
281 uint8_t nal_type = (fu_header & 0x1f);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
282 uint8_t reconstructed_nal;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
283
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
284 // reconstruct this packet's true nal; only the data follows..
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
285 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
286 reconstructed_nal |= nal_type;
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
287
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
288 // skip the fu_header...
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
289 buf++;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
290 len--;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
291
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
292 #ifdef DEBUG
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
293 if (start_bit)
2156
cfd57cd5252b Remove the unnecessary masking when counting received packet types in the H.264
takis
parents: 2155
diff changeset
294 data->packet_types_received[nal_type]++;
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
295 #endif
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
296 if(start_bit) {
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
297 // copy in the start sequence, and the reconstructed nal....
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
298 av_new_packet(pkt, sizeof(start_sequence)+sizeof(nal)+len);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
299 memcpy(pkt->data, start_sequence, sizeof(start_sequence));
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
300 pkt->data[sizeof(start_sequence)]= reconstructed_nal;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
301 memcpy(pkt->data+sizeof(start_sequence)+sizeof(nal), buf, len);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
302 } else {
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
303 av_new_packet(pkt, len);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
304 memcpy(pkt->data, buf, len);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
305 }
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
306 }
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
307 break;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
308
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
309 case 30: // undefined
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
310 case 31: // undefined
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
311 default:
4628
e2fa3c2bc471 Add context to some av_log() calls.
benoit
parents: 4388
diff changeset
312 av_log(ctx, AV_LOG_ERROR, "Undefined type (%d)", type);
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
313 result= -1;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
314 break;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
315 }
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
316
4633
0c69b895a01f Don't let finalize_packet() touch pkt->stream_index. Instead, let individual
rbultje
parents: 4628
diff changeset
317 pkt->stream_index = st->index;
0c69b895a01f Don't let finalize_packet() touch pkt->stream_index. Instead, let individual
rbultje
parents: 4628
diff changeset
318
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
319 return result;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
320 }
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
321
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
322 /* ---------------- public code */
5113
75e51cba276e Use named initializers and use new/free_context() instead of extradata()
rbultje
parents: 4872
diff changeset
323 static PayloadContext *h264_new_context(void)
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
324 {
3975
44561554cb7e Rename RTP payload contexts to PayloadContext, suggested by Luca in
rbultje
parents: 3292
diff changeset
325 PayloadContext *data =
44561554cb7e Rename RTP payload contexts to PayloadContext, suggested by Luca in
rbultje
parents: 3292
diff changeset
326 av_mallocz(sizeof(PayloadContext) +
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
327 FF_INPUT_BUFFER_PADDING_SIZE);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
328
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
329 if (data) {
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
330 data->cookie = MAGIC_COOKIE;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
331 }
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
332
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
333 return data;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
334 }
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
335
5113
75e51cba276e Use named initializers and use new/free_context() instead of extradata()
rbultje
parents: 4872
diff changeset
336 static void h264_free_context(PayloadContext *data)
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
337 {
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
338 #ifdef DEBUG
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
339 int ii;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
340
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
341 for (ii = 0; ii < 32; ii++) {
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
342 if (data->packet_types_received[ii])
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
343 av_log(NULL, AV_LOG_DEBUG, "Received %d packets of type %d\n",
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
344 data->packet_types_received[ii], ii);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
345 }
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
346 #endif
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
347
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
348 assert(data);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
349 assert(data->cookie == MAGIC_COOKIE);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
350
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
351 // avoid stale pointers (assert)
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
352 data->cookie = DEAD_COOKIE;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
353
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
354 // and clear out this...
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
355 av_free(data);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
356 }
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
357
4067
8adccfc01be3 Change function prototype of the sdp_parse_a_line in DynamicProtocolHandler.
rbultje
parents: 3976
diff changeset
358 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
359 PayloadContext *h264_data, const char *line)
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
360 {
4067
8adccfc01be3 Change function prototype of the sdp_parse_a_line in DynamicProtocolHandler.
rbultje
parents: 3976
diff changeset
361 AVStream *stream = s->streams[st_index];
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
362 AVCodecContext *codec = stream->codec;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
363 const char *p = line;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
364
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
365 assert(h264_data->cookie == MAGIC_COOKIE);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
366
2193
5ce5fad0dfac replace the uses of old string functions that Reimar missed
mru
parents: 2156
diff changeset
367 if (av_strstart(p, "framesize:", &p)) {
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
368 char buf1[50];
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
369 char *dst = buf1;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
370
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
371 // remove the protocol identifier..
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
372 while (*p && *p == ' ') p++; // strip spaces.
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
373 while (*p && *p != ' ') p++; // eat protocol identifier
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
374 while (*p && *p == ' ') p++; // strip trailing spaces.
5352
c8a47f9a36a8 Fix a typo in rtp_h264.c:parse_h264_sdp_line(). Patch by Gordon Irlam
lucabe
parents: 5113
diff changeset
375 while (*p && *p != '-' && (dst - buf1) < sizeof(buf1) - 1) {
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
376 *dst++ = *p++;
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
377 }
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
378 *dst = '\0';
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
379
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
380 // a='framesize:96 320-240'
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
381 // set our parameters..
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
382 codec->width = atoi(buf1);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
383 codec->height = atoi(p + 1); // skip the -
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
384 codec->pix_fmt = PIX_FMT_YUV420P;
2193
5ce5fad0dfac replace the uses of old string functions that Reimar missed
mru
parents: 2156
diff changeset
385 } else if (av_strstart(p, "fmtp:", &p)) {
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
386 char attr[256];
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
387 char value[4096];
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
388
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
389 // remove the protocol identifier..
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
390 while (*p && *p == ' ') p++; // strip spaces.
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
391 while (*p && *p != ' ') p++; // eat protocol identifier
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
392 while (*p && *p == ' ') p++; // strip trailing spaces.
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
393
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
394 /* loop on each attribute */
5697
484fceabfad2 Prefix non-static RTSP functions with ff_.
rbultje
parents: 5352
diff changeset
395 while (ff_rtsp_next_attr_and_value
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
396 (&p, attr, sizeof(attr), value, sizeof(value))) {
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
397 /* grab the codec extra_data from the config parameter of the fmtp line */
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
398 sdp_parse_fmtp_config_h264(stream, h264_data, attr, value);
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
399 }
2193
5ce5fad0dfac replace the uses of old string functions that Reimar missed
mru
parents: 2156
diff changeset
400 } else if (av_strstart(p, "cliprect:", &p)) {
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
401 // could use this if we wanted.
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 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
405
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
406 return 0; // keep processing it the normal way...
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
407 }
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
408
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
409 /**
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
410 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
411 */
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
412 RTPDynamicProtocolHandler ff_h264_dynamic_handler = {
5113
75e51cba276e Use named initializers and use new/free_context() instead of extradata()
rbultje
parents: 4872
diff changeset
413 .enc_name = "H264",
5910
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5739
diff changeset
414 .codec_type = AVMEDIA_TYPE_VIDEO,
5113
75e51cba276e Use named initializers and use new/free_context() instead of extradata()
rbultje
parents: 4872
diff changeset
415 .codec_id = CODEC_ID_H264,
75e51cba276e Use named initializers and use new/free_context() instead of extradata()
rbultje
parents: 4872
diff changeset
416 .parse_sdp_a_line = parse_h264_sdp_line,
75e51cba276e Use named initializers and use new/free_context() instead of extradata()
rbultje
parents: 4872
diff changeset
417 .open = h264_new_context,
75e51cba276e Use named initializers and use new/free_context() instead of extradata()
rbultje
parents: 4872
diff changeset
418 .close = h264_free_context,
75e51cba276e Use named initializers and use new/free_context() instead of extradata()
rbultje
parents: 4872
diff changeset
419 .parse_packet = h264_handle_packet
1460
234a04b906f9 add support for rtp/h264 streaming
gpoirier
parents:
diff changeset
420 };