winlin

extract ISrsCodec for code and decode object.

@@ -29,6 +29,14 @@ using namespace std; @@ -29,6 +29,14 @@ using namespace std;
29 #include <srs_kernel_error.hpp> 29 #include <srs_kernel_error.hpp>
30 #include <srs_kernel_utility.hpp> 30 #include <srs_kernel_utility.hpp>
31 31
  32 +ISrsCodec::ISrsCodec()
  33 +{
  34 +}
  35 +
  36 +ISrsCodec::~ISrsCodec()
  37 +{
  38 +}
  39 +
32 SrsBuffer::SrsBuffer() 40 SrsBuffer::SrsBuffer()
33 { 41 {
34 p = bytes = NULL; 42 p = bytes = NULL;
@@ -33,11 +33,60 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. @@ -33,11 +33,60 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
33 #include <sys/types.h> 33 #include <sys/types.h>
34 #include <string> 34 #include <string>
35 35
  36 +class SrsBuffer;
  37 +
36 /** 38 /**
37 -* bytes utility, used to:  
38 -* convert basic types to bytes,  
39 -* build basic types from bytes.  
40 -*/ 39 + * the srs codec, to code and decode object with bytes:
  40 + * code: to encode/serialize object to bytes in buffer,
  41 + * decode: to decode/deserialize object from bytes in buffer.
  42 + * we use SrsBuffer as bytes helper utility,
  43 + * for example, to code:
  44 + * ISrsCodec* obj = ...
  45 + * char* bytes = new char[obj->size()];
  46 + *
  47 + * SrsBuffer* buf = new SrsBuffer();
  48 + * buf->initialize(bytes, obj->size())
  49 + *
  50 + * obj->encode(buf);
  51 + * for example, to decode:
  52 + * int nb_bytes = ...
  53 + * char* bytes = ...
  54 + *
  55 + * SrsBuffer* buf = new Srsbuffer();
  56 + * buf->initialize(bytes, nb_bytes);
  57 + *
  58 + * ISrsCodec* obj = ...
  59 + * obj->decode(buf);
  60 + * @remark protocol or amf0 or json should implements this interface.
  61 + */
  62 +// TODO: FIXME: protocol, amf0, json should implements it.
  63 +class ISrsCodec
  64 +{
  65 +public:
  66 + ISrsCodec();
  67 + virtual ~ISrsCodec();
  68 +public:
  69 + /**
  70 + * get the size of object to encode object to bytes.
  71 + */
  72 + virtual int size() = 0;
  73 + /**
  74 + * encode object to bytes in SrsBuffer.
  75 + */
  76 + virtual int encode(SrsBuffer* buf) = 0;
  77 +public:
  78 + /**
  79 + * decode object from bytes in SrsBuffer.
  80 + */
  81 + virtual int decode(SrsBuffer* buf) = 0;
  82 +};
  83 +
  84 +/**
  85 + * bytes utility, used to:
  86 + * convert basic types to bytes,
  87 + * build basic types from bytes.
  88 + * @remark the buffer never mange the bytes, user must manage it.
  89 + */
41 class SrsBuffer 90 class SrsBuffer
42 { 91 {
43 private: 92 private:
@@ -157,7 +206,8 @@ public: @@ -157,7 +206,8 @@ public:
157 }; 206 };
158 207
159 /** 208 /**
160 - * the bit stream. 209 + * the bit stream, base on SrsBuffer,
  210 + * for exmaple, the h.264 avc stream is bit stream.
161 */ 211 */
162 class SrsBitBuffer 212 class SrsBitBuffer
163 { 213 {
@@ -28,6 +28,7 @@ using namespace std; @@ -28,6 +28,7 @@ using namespace std;
28 28
29 #include <srs_kernel_error.hpp> 29 #include <srs_kernel_error.hpp>
30 #include <srs_core_autofree.hpp> 30 #include <srs_core_autofree.hpp>
  31 +#include <srs_kernel_log.hpp>
31 32
32 #ifdef SRS_AUTO_KAFKA 33 #ifdef SRS_AUTO_KAFKA
33 34
@@ -103,7 +104,7 @@ int SrsKafkaBytes::total_size() @@ -103,7 +104,7 @@ int SrsKafkaBytes::total_size()
103 104
104 SrsKafkaRequestHeader::SrsKafkaRequestHeader() 105 SrsKafkaRequestHeader::SrsKafkaRequestHeader()
105 { 106 {
106 - size = 0; 107 + _size = 0;
107 api_key = api_version = 0; 108 api_key = api_version = 0;
108 correlation_id = 0; 109 correlation_id = 0;
109 client_id = new SrsKafkaString(); 110 client_id = new SrsKafkaString();
@@ -121,12 +122,12 @@ int SrsKafkaRequestHeader::header_size() @@ -121,12 +122,12 @@ int SrsKafkaRequestHeader::header_size()
121 122
122 int SrsKafkaRequestHeader::message_size() 123 int SrsKafkaRequestHeader::message_size()
123 { 124 {
124 - return size - header_size(); 125 + return _size - header_size();
125 } 126 }
126 127
127 int SrsKafkaRequestHeader::total_size() 128 int SrsKafkaRequestHeader::total_size()
128 { 129 {
129 - return 4 + size; 130 + return 4 + _size;
130 } 131 }
131 132
132 bool SrsKafkaRequestHeader::is_producer_request() 133 bool SrsKafkaRequestHeader::is_producer_request()
@@ -169,9 +170,28 @@ void SrsKafkaRequestHeader::set_api_key(SrsKafkaApiKey key) @@ -169,9 +170,28 @@ void SrsKafkaRequestHeader::set_api_key(SrsKafkaApiKey key)
169 api_key = (int16_t)key; 170 api_key = (int16_t)key;
170 } 171 }
171 172
  173 +int SrsKafkaRequestHeader::size()
  174 +{
  175 + return 4 + _size;
  176 +}
  177 +
  178 +int SrsKafkaRequestHeader::encode(SrsBuffer* buf)
  179 +{
  180 + int ret = ERROR_SUCCESS;
  181 + // TODO: FIXME: implements it.
  182 + return ret;
  183 +}
  184 +
  185 +int SrsKafkaRequestHeader::decode(SrsBuffer* buf)
  186 +{
  187 + int ret = ERROR_SUCCESS;
  188 + // TODO: FIXME: implements it.
  189 + return ret;
  190 +}
  191 +
172 SrsKafkaResponseHeader::SrsKafkaResponseHeader() 192 SrsKafkaResponseHeader::SrsKafkaResponseHeader()
173 { 193 {
174 - size = 0; 194 + _size = 0;
175 correlation_id = 0; 195 correlation_id = 0;
176 } 196 }
177 197
@@ -186,12 +206,31 @@ int SrsKafkaResponseHeader::header_size() @@ -186,12 +206,31 @@ int SrsKafkaResponseHeader::header_size()
186 206
187 int SrsKafkaResponseHeader::message_size() 207 int SrsKafkaResponseHeader::message_size()
188 { 208 {
189 - return size - header_size(); 209 + return _size - header_size();
190 } 210 }
191 211
192 int SrsKafkaResponseHeader::total_size() 212 int SrsKafkaResponseHeader::total_size()
193 { 213 {
194 - return 4 + size; 214 + return 4 + _size;
  215 +}
  216 +
  217 +int SrsKafkaResponseHeader::size()
  218 +{
  219 + return 4 + _size;
  220 +}
  221 +
  222 +int SrsKafkaResponseHeader::encode(SrsBuffer* buf)
  223 +{
  224 + int ret = ERROR_SUCCESS;
  225 + // TODO: FIXME: implements it.
  226 + return ret;
  227 +}
  228 +
  229 +int SrsKafkaResponseHeader::decode(SrsBuffer* buf)
  230 +{
  231 + int ret = ERROR_SUCCESS;
  232 + // TODO: FIXME: implements it.
  233 + return ret;
195 } 234 }
196 235
197 SrsKafkaRawMessage::SrsKafkaRawMessage() 236 SrsKafkaRawMessage::SrsKafkaRawMessage()
@@ -233,6 +272,21 @@ SrsKafkaRequest::~SrsKafkaRequest() @@ -233,6 +272,21 @@ SrsKafkaRequest::~SrsKafkaRequest()
233 { 272 {
234 } 273 }
235 274
  275 +int SrsKafkaRequest::size()
  276 +{
  277 + return header.size();
  278 +}
  279 +
  280 +int SrsKafkaRequest::encode(SrsBuffer* buf)
  281 +{
  282 + return header.encode(buf);
  283 +}
  284 +
  285 +int SrsKafkaRequest::decode(SrsBuffer* buf)
  286 +{
  287 + return header.decode(buf);
  288 +}
  289 +
236 SrsKafkaResponse::SrsKafkaResponse() 290 SrsKafkaResponse::SrsKafkaResponse()
237 { 291 {
238 } 292 }
@@ -241,6 +295,21 @@ SrsKafkaResponse::~SrsKafkaResponse() @@ -241,6 +295,21 @@ SrsKafkaResponse::~SrsKafkaResponse()
241 { 295 {
242 } 296 }
243 297
  298 +int SrsKafkaResponse::size()
  299 +{
  300 + return header.size();
  301 +}
  302 +
  303 +int SrsKafkaResponse::encode(SrsBuffer* buf)
  304 +{
  305 + return header.encode(buf);
  306 +}
  307 +
  308 +int SrsKafkaResponse::decode(SrsBuffer* buf)
  309 +{
  310 + return header.decode(buf);
  311 +}
  312 +
244 SrsKafkaTopicMetadataRequest::SrsKafkaTopicMetadataRequest() 313 SrsKafkaTopicMetadataRequest::SrsKafkaTopicMetadataRequest()
245 { 314 {
246 header.set_api_key(SrsKafkaApiKeyMetadataRequest); 315 header.set_api_key(SrsKafkaApiKeyMetadataRequest);
@@ -255,6 +324,27 @@ void SrsKafkaTopicMetadataRequest::add_topic(string topic) @@ -255,6 +324,27 @@ void SrsKafkaTopicMetadataRequest::add_topic(string topic)
255 topics.append(new SrsKafkaString(topic)); 324 topics.append(new SrsKafkaString(topic));
256 } 325 }
257 326
  327 +int SrsKafkaTopicMetadataRequest::size()
  328 +{
  329 + int ret = ERROR_SUCCESS;
  330 + // TODO: FIXME: implements it.
  331 + return ret;
  332 +}
  333 +
  334 +int SrsKafkaTopicMetadataRequest::encode(SrsBuffer* buf)
  335 +{
  336 + int ret = ERROR_SUCCESS;
  337 + // TODO: FIXME: implements it.
  338 + return ret;
  339 +}
  340 +
  341 +int SrsKafkaTopicMetadataRequest::decode(SrsBuffer* buf)
  342 +{
  343 + int ret = ERROR_SUCCESS;
  344 + // TODO: FIXME: implements it.
  345 + return ret;
  346 +}
  347 +
258 SrsKafkaTopicMetadataResponse::SrsKafkaTopicMetadataResponse() 348 SrsKafkaTopicMetadataResponse::SrsKafkaTopicMetadataResponse()
259 { 349 {
260 } 350 }
@@ -263,6 +353,27 @@ SrsKafkaTopicMetadataResponse::~SrsKafkaTopicMetadataResponse() @@ -263,6 +353,27 @@ SrsKafkaTopicMetadataResponse::~SrsKafkaTopicMetadataResponse()
263 { 353 {
264 } 354 }
265 355
  356 +int SrsKafkaTopicMetadataResponse::size()
  357 +{
  358 + int ret = ERROR_SUCCESS;
  359 + // TODO: FIXME: implements it.
  360 + return ret;
  361 +}
  362 +
  363 +int SrsKafkaTopicMetadataResponse::encode(SrsBuffer* buf)
  364 +{
  365 + int ret = ERROR_SUCCESS;
  366 + // TODO: FIXME: implements it.
  367 + return ret;
  368 +}
  369 +
  370 +int SrsKafkaTopicMetadataResponse::decode(SrsBuffer* buf)
  371 +{
  372 + int ret = ERROR_SUCCESS;
  373 + // TODO: FIXME: implements it.
  374 + return ret;
  375 +}
  376 +
266 SrsKafkaProtocol::SrsKafkaProtocol(ISrsProtocolReaderWriter* io) 377 SrsKafkaProtocol::SrsKafkaProtocol(ISrsProtocolReaderWriter* io)
267 { 378 {
268 skt = io; 379 skt = io;
@@ -296,10 +407,14 @@ int SrsKafkaClient::fetch_metadata(string topic) @@ -296,10 +407,14 @@ int SrsKafkaClient::fetch_metadata(string topic)
296 int ret = ERROR_SUCCESS; 407 int ret = ERROR_SUCCESS;
297 408
298 SrsKafkaTopicMetadataRequest* req = new SrsKafkaTopicMetadataRequest(); 409 SrsKafkaTopicMetadataRequest* req = new SrsKafkaTopicMetadataRequest();
299 - SrsAutoFree(SrsKafkaTopicMetadataRequest, req);  
300 410
301 req->add_topic(topic); 411 req->add_topic(topic);
302 412
  413 + if ((ret = protocol->send_and_free_message(req)) != ERROR_SUCCESS) {
  414 + srs_error("kafka send message failed. ret=%d", ret);
  415 + return ret;
  416 + }
  417 +
303 // TODO: FIXME: implements it. 418 // TODO: FIXME: implements it.
304 419
305 return ret; 420 return ret;
@@ -32,6 +32,8 @@ @@ -32,6 +32,8 @@
32 #include <vector> 32 #include <vector>
33 #include <string> 33 #include <string>
34 34
  35 +#include <srs_kernel_buffer.hpp>
  36 +
35 class ISrsProtocolReaderWriter; 37 class ISrsProtocolReaderWriter;
36 38
37 #ifdef SRS_AUTO_KAFKA 39 #ifdef SRS_AUTO_KAFKA
@@ -136,7 +138,7 @@ public: @@ -136,7 +138,7 @@ public:
136 * the header of request, includes the size of request. 138 * the header of request, includes the size of request.
137 * @see https://cwiki.apache.org/confluence/display/KAFKA/A+Guide+To+The+Kafka+Protocol#AGuideToTheKafkaProtocol-Requests 139 * @see https://cwiki.apache.org/confluence/display/KAFKA/A+Guide+To+The+Kafka+Protocol#AGuideToTheKafkaProtocol-Requests
138 */ 140 */
139 -class SrsKafkaRequestHeader 141 +class SrsKafkaRequestHeader : public ISrsCodec
140 { 142 {
141 private: 143 private:
142 /** 144 /**
@@ -145,7 +147,7 @@ private: @@ -145,7 +147,7 @@ private:
145 * size as an integer N, and then reading and parsing the subsequent N bytes 147 * size as an integer N, and then reading and parsing the subsequent N bytes
146 * of the request. 148 * of the request.
147 */ 149 */
148 - int32_t size; 150 + int32_t _size;
149 private: 151 private:
150 /** 152 /**
151 * This is a numeric id for the API being invoked (i.e. is it 153 * This is a numeric id for the API being invoked (i.e. is it
@@ -179,13 +181,13 @@ private: @@ -179,13 +181,13 @@ private:
179 public: 181 public:
180 SrsKafkaRequestHeader(); 182 SrsKafkaRequestHeader();
181 virtual ~SrsKafkaRequestHeader(); 183 virtual ~SrsKafkaRequestHeader();
182 -public: 184 +private:
183 /** 185 /**
184 * the layout of request: 186 * the layout of request:
185 * +-----------+----------------------------------+ 187 * +-----------+----------------------------------+
186 - * | 4B size | [size] bytes | 188 + * | 4B _size | [_size] bytes |
187 * +-----------+------------+---------------------+ 189 * +-----------+------------+---------------------+
188 - * | 4B size | header | message | 190 + * | 4B _size | header | message |
189 * +-----------+------------+---------------------+ 191 * +-----------+------------+---------------------+
190 * | total size = 4 + header + message | 192 * | total size = 4 + header + message |
191 * +----------------------------------------------+ 193 * +----------------------------------------------+
@@ -215,6 +217,11 @@ public: @@ -215,6 +217,11 @@ public:
215 virtual bool is_consumer_metadata_request(); 217 virtual bool is_consumer_metadata_request();
216 // set the api key. 218 // set the api key.
217 virtual void set_api_key(SrsKafkaApiKey key); 219 virtual void set_api_key(SrsKafkaApiKey key);
  220 +// interface ISrsCodec
  221 +public:
  222 + virtual int size();
  223 + virtual int encode(SrsBuffer* buf);
  224 + virtual int decode(SrsBuffer* buf);
218 }; 225 };
219 226
220 /** 227 /**
@@ -223,7 +230,7 @@ public: @@ -223,7 +230,7 @@ public:
223 * send a MetadataResponse in return to a MetadataRequest). 230 * send a MetadataResponse in return to a MetadataRequest).
224 * @see https://cwiki.apache.org/confluence/display/KAFKA/A+Guide+To+The+Kafka+Protocol#AGuideToTheKafkaProtocol-Responses 231 * @see https://cwiki.apache.org/confluence/display/KAFKA/A+Guide+To+The+Kafka+Protocol#AGuideToTheKafkaProtocol-Responses
225 */ 232 */
226 -class SrsKafkaResponseHeader 233 +class SrsKafkaResponseHeader : public ISrsCodec
227 { 234 {
228 private: 235 private:
229 /** 236 /**
@@ -232,7 +239,7 @@ private: @@ -232,7 +239,7 @@ private:
232 * size as an integer N, and then reading and parsing the subsequent N bytes 239 * size as an integer N, and then reading and parsing the subsequent N bytes
233 * of the request. 240 * of the request.
234 */ 241 */
235 - int32_t size; 242 + int32_t _size;
236 private: 243 private:
237 /** 244 /**
238 * This is a user-supplied integer. It will be passed back in 245 * This is a user-supplied integer. It will be passed back in
@@ -243,13 +250,13 @@ private: @@ -243,13 +250,13 @@ private:
243 public: 250 public:
244 SrsKafkaResponseHeader(); 251 SrsKafkaResponseHeader();
245 virtual ~SrsKafkaResponseHeader(); 252 virtual ~SrsKafkaResponseHeader();
246 -public: 253 +private:
247 /** 254 /**
248 * the layout of response: 255 * the layout of response:
249 * +-----------+----------------------------------+ 256 * +-----------+----------------------------------+
250 - * | 4B size | [size] bytes | 257 + * | 4B _size | [_size] bytes |
251 * +-----------+------------+---------------------+ 258 * +-----------+------------+---------------------+
252 - * | 4B size | 4B header | message | 259 + * | 4B _size | 4B header | message |
253 * +-----------+------------+---------------------+ 260 * +-----------+------------+---------------------+
254 * | total size = 4 + 4 + message | 261 * | total size = 4 + 4 + message |
255 * +----------------------------------------------+ 262 * +----------------------------------------------+
@@ -265,6 +272,11 @@ public: @@ -265,6 +272,11 @@ public:
265 * the total size of the request, includes the 4B size. 272 * the total size of the request, includes the 4B size.
266 */ 273 */
267 virtual int total_size(); 274 virtual int total_size();
  275 +// interface ISrsCodec
  276 +public:
  277 + virtual int size();
  278 + virtual int encode(SrsBuffer* buf);
  279 + virtual int decode(SrsBuffer* buf);
268 }; 280 };
269 281
270 /** 282 /**
@@ -335,21 +347,35 @@ public: @@ -335,21 +347,35 @@ public:
335 /** 347 /**
336 * the kafka request message, for protocol to send. 348 * the kafka request message, for protocol to send.
337 */ 349 */
338 -class SrsKafkaRequest 350 +class SrsKafkaRequest : public ISrsCodec
339 { 351 {
  352 +protected:
  353 + SrsKafkaRequestHeader header;
340 public: 354 public:
341 SrsKafkaRequest(); 355 SrsKafkaRequest();
342 virtual ~SrsKafkaRequest(); 356 virtual ~SrsKafkaRequest();
  357 +// interface ISrsCodec
  358 +public:
  359 + virtual int size();
  360 + virtual int encode(SrsBuffer* buf);
  361 + virtual int decode(SrsBuffer* buf);
343 }; 362 };
344 363
345 /** 364 /**
346 * the kafka response message, for protocol to recv. 365 * the kafka response message, for protocol to recv.
347 */ 366 */
348 -class SrsKafkaResponse 367 +class SrsKafkaResponse : public ISrsCodec
349 { 368 {
  369 +protected:
  370 + SrsKafkaResponseHeader header;
350 public: 371 public:
351 SrsKafkaResponse(); 372 SrsKafkaResponse();
352 virtual ~SrsKafkaResponse(); 373 virtual ~SrsKafkaResponse();
  374 +// interface ISrsCodec
  375 +public:
  376 + virtual int size();
  377 + virtual int encode(SrsBuffer* buf);
  378 + virtual int decode(SrsBuffer* buf);
353 }; 379 };
354 380
355 /** 381 /**
@@ -369,13 +395,17 @@ public: @@ -369,13 +395,17 @@ public:
369 class SrsKafkaTopicMetadataRequest : public SrsKafkaRequest 395 class SrsKafkaTopicMetadataRequest : public SrsKafkaRequest
370 { 396 {
371 private: 397 private:
372 - SrsKafkaRequestHeader header;  
373 SrsKafkaArray<SrsKafkaString*> topics; 398 SrsKafkaArray<SrsKafkaString*> topics;
374 public: 399 public:
375 SrsKafkaTopicMetadataRequest(); 400 SrsKafkaTopicMetadataRequest();
376 virtual ~SrsKafkaTopicMetadataRequest(); 401 virtual ~SrsKafkaTopicMetadataRequest();
377 public: 402 public:
378 virtual void add_topic(std::string topic); 403 virtual void add_topic(std::string topic);
  404 +// interface ISrsCodec
  405 +public:
  406 + virtual int size();
  407 + virtual int encode(SrsBuffer* buf);
  408 + virtual int decode(SrsBuffer* buf);
379 }; 409 };
380 410
381 /** 411 /**
@@ -388,11 +418,14 @@ public: @@ -388,11 +418,14 @@ public:
388 */ 418 */
389 class SrsKafkaTopicMetadataResponse : public SrsKafkaResponse 419 class SrsKafkaTopicMetadataResponse : public SrsKafkaResponse
390 { 420 {
391 -private:  
392 - SrsKafkaResponseHeader header;  
393 public: 421 public:
394 SrsKafkaTopicMetadataResponse(); 422 SrsKafkaTopicMetadataResponse();
395 virtual ~SrsKafkaTopicMetadataResponse(); 423 virtual ~SrsKafkaTopicMetadataResponse();
  424 +// interface ISrsCodec
  425 +public:
  426 + virtual int size();
  427 + virtual int encode(SrsBuffer* buf);
  428 + virtual int decode(SrsBuffer* buf);
396 }; 429 };
397 430
398 /** 431 /**
@@ -654,12 +654,12 @@ int SrsProtocol::do_simple_send(SrsMessageHeader* mh, char* payload, int size) @@ -654,12 +654,12 @@ int SrsProtocol::do_simple_send(SrsMessageHeader* mh, char* payload, int size)
654 int nbh = 0; 654 int nbh = 0;
655 if (p == payload) { 655 if (p == payload) {
656 nbh = srs_chunk_header_c0( 656 nbh = srs_chunk_header_c0(
657 - mh->perfer_cid, mh->timestamp, mh->payload_length, 657 + mh->perfer_cid, (u_int32_t)mh->timestamp, mh->payload_length,
658 mh->message_type, mh->stream_id, 658 mh->message_type, mh->stream_id,
659 c0c3, sizeof(c0c3)); 659 c0c3, sizeof(c0c3));
660 } else { 660 } else {
661 nbh = srs_chunk_header_c3( 661 nbh = srs_chunk_header_c3(
662 - mh->perfer_cid, mh->timestamp, 662 + mh->perfer_cid, (u_int32_t)mh->timestamp,
663 c0c3, sizeof(c0c3)); 663 c0c3, sizeof(c0c3));
664 } 664 }
665 srs_assert(nbh > 0);; 665 srs_assert(nbh > 0);;
@@ -668,7 +668,7 @@ int SrsProtocol::do_simple_send(SrsMessageHeader* mh, char* payload, int size) @@ -668,7 +668,7 @@ int SrsProtocol::do_simple_send(SrsMessageHeader* mh, char* payload, int size)
668 iovs[0].iov_base = c0c3; 668 iovs[0].iov_base = c0c3;
669 iovs[0].iov_len = nbh; 669 iovs[0].iov_len = nbh;
670 670
671 - int payload_size = srs_min(end - p, out_chunk_size); 671 + int payload_size = srs_min((int)(end - p), out_chunk_size);
672 iovs[1].iov_base = p; 672 iovs[1].iov_base = p;
673 iovs[1].iov_len = payload_size; 673 iovs[1].iov_len = payload_size;
674 p += payload_size; 674 p += payload_size;