From 7cf855f2421f71a7cb47d0e416654efb8a605fc8 Mon Sep 17 00:00:00 2001 From: winlin Date: Wed, 12 Nov 2014 18:41:24 +0800 Subject: [PATCH] for bug #199, refine the header generate --- trunk/src/rtmp/srs_protocol_stack.cpp | 62 +++++++++++++-------------- 1 file changed, 29 insertions(+), 33 deletions(-) diff --git a/trunk/src/rtmp/srs_protocol_stack.cpp b/trunk/src/rtmp/srs_protocol_stack.cpp index a987c5a01f..47255cd86e 100644 --- a/trunk/src/rtmp/srs_protocol_stack.cpp +++ b/trunk/src/rtmp/srs_protocol_stack.cpp @@ -600,13 +600,15 @@ void SrsProtocol::generate_chunk_header(SrsMessageHeader* mh, bool c0, int* pnbh // generate the header. char* p = cache; + // timestamp for c0/c3 + u_int32_t timestamp = (u_int32_t)mh->timestamp; + if (c0) { // write new chunk stream header, fmt is 0 *p++ = 0x00 | (mh->perfer_cid & 0x3F); // chunk message header, 11 bytes // timestamp, 3bytes, big-endian - u_int32_t timestamp = (u_int32_t)mh->timestamp; if (timestamp < RTMP_EXTENDED_TIMESTAMP) { pp = (char*)×tamp; *p++ = pp[2]; @@ -633,43 +635,37 @@ void SrsProtocol::generate_chunk_header(SrsMessageHeader* mh, bool c0, int* pnbh *p++ = pp[1]; *p++ = pp[2]; *p++ = pp[3]; - - // chunk extended timestamp header, 0 or 4 bytes, big-endian - if(timestamp >= RTMP_EXTENDED_TIMESTAMP) { - pp = (char*)×tamp; - *p++ = pp[3]; - *p++ = pp[2]; - *p++ = pp[1]; - *p++ = pp[0]; - } } else { // write no message header chunk stream, fmt is 3 // @remark, if perfer_cid > 0x3F, that is, use 2B/3B chunk header, // SRS will rollback to 1B chunk header. *p++ = 0xC0 | (mh->perfer_cid & 0x3F); - - // chunk extended timestamp header, 0 or 4 bytes, big-endian - // 6.1.3. Extended Timestamp - // This field is transmitted only when the normal time stamp in the - // chunk message header is set to 0x00ffffff. If normal time stamp is - // set to any value less than 0x00ffffff, this field MUST NOT be - // present. This field MUST NOT be present if the timestamp field is not - // present. Type 3 chunks MUST NOT have this field. - // adobe changed for Type3 chunk: - // FMLE always sendout the extended-timestamp, - // must send the extended-timestamp to FMS, - // must send the extended-timestamp to flash-player. - // @see: ngx_rtmp_prepare_message - // @see: http://blog.csdn.net/win_lin/article/details/13363699 - // TODO: FIXME: extract to outer. - u_int32_t timestamp = (u_int32_t)mh->timestamp; - if (timestamp >= RTMP_EXTENDED_TIMESTAMP) { - pp = (char*)×tamp; - *p++ = pp[3]; - *p++ = pp[2]; - *p++ = pp[1]; - *p++ = pp[0]; - } + } + + // for c0 + // chunk extended timestamp header, 0 or 4 bytes, big-endian + // + // for c3: + // chunk extended timestamp header, 0 or 4 bytes, big-endian + // 6.1.3. Extended Timestamp + // This field is transmitted only when the normal time stamp in the + // chunk message header is set to 0x00ffffff. If normal time stamp is + // set to any value less than 0x00ffffff, this field MUST NOT be + // present. This field MUST NOT be present if the timestamp field is not + // present. Type 3 chunks MUST NOT have this field. + // adobe changed for Type3 chunk: + // FMLE always sendout the extended-timestamp, + // must send the extended-timestamp to FMS, + // must send the extended-timestamp to flash-player. + // @see: ngx_rtmp_prepare_message + // @see: http://blog.csdn.net/win_lin/article/details/13363699 + // TODO: FIXME: extract to outer. + if (timestamp >= RTMP_EXTENDED_TIMESTAMP) { + pp = (char*)×tamp; + *p++ = pp[3]; + *p++ = pp[2]; + *p++ = pp[1]; + *p++ = pp[0]; } // always has header