From c44b5ee1c41935c26576f6be7a067bcb1163646e Mon Sep 17 00:00:00 2001 From: hyc Date: Thu, 7 Jan 2010 22:28:54 +0000 Subject: [PATCH] Fixed per-chunk sending git-svn-id: svn://svn.mplayerhq.hu/rtmpdump/trunk@205 400ebc74-4327-4243-bc38-086b20814532 --- rtmp.c | 39 +++++++++++++++++++++------------------ rtmp.h | 13 ++++++++++--- rtmpsuck.c | 18 +++++++++++------- 3 files changed, 42 insertions(+), 28 deletions(-) diff --git a/rtmp.c b/rtmp.c index 6a503c2..9174d75 100644 --- a/rtmp.c +++ b/rtmp.c @@ -1968,13 +1968,6 @@ RTMP_ReadPacket(RTMP * r, RTMPPacket * packet) LogHexString(LOGDEBUG2, hbuf, hSize); - /* Does the caller want a raw copy of the header ? */ - packet->m_headerSize = hSize; - if (packet->m_header) - { - memcpy(packet->m_header, hbuf, hSize); - } - bool didAlloc = false; if (packet->m_nBodySize > 0 && packet->m_body == NULL) { @@ -1992,6 +1985,15 @@ RTMP_ReadPacket(RTMP * r, RTMPPacket * packet) if (nToRead < nChunk) nChunk = nToRead; + /* Does the caller want the raw chunk? */ + if (packet->m_chunk) + { + packet->m_chunk->c_headerSize = hSize; + memcpy(packet->m_chunk->c_header, hbuf, hSize); + packet->m_chunk->c_chunk = packet->m_body+packet->m_nBytesRead; + packet->m_chunk->c_chunkSize = nChunk; + } + if (ReadN(r, packet->m_body + packet->m_nBytesRead, nChunk) != nChunk) { Log(LOGERROR, "%s, failed to read RTMP packet body. len: %lu", @@ -2024,7 +2026,7 @@ RTMP_ReadPacket(RTMP * r, RTMPPacket * packet) r->m_vecChannelsIn[packet->m_nChannel]->m_nBytesRead = 0; r->m_vecChannelsIn[packet->m_nChannel]->m_hasAbsTimestamp = false; // can only be false if we reuse header } - else if (!packet->m_header) + else { packet->m_body = NULL; /* so it won't be erased on free */ } @@ -2162,17 +2164,18 @@ SHandShake(RTMP * r) #endif bool -RTMP_SendChunk(RTMP *r, RTMPPacket *packet, int offset) +RTMP_SendChunk(RTMP *r, RTMPChunk *chunk) { - int nsize = packet->m_nBytesRead - offset; - int wrote; - - Log(LOGDEBUG2, "%s: fd=%d, size=%d", __FUNCTION__, r->m_socket, nsize); - LogHexString(LOGDEBUG2, packet->m_header, packet->m_headerSize); - LogHexString(LOGDEBUG2, packet->m_body+offset, nsize); - wrote = WriteN(r, packet->m_header, packet->m_headerSize); - if (!wrote) return wrote; - return WriteN(r, packet->m_body+offset, nsize); + bool wrote; + + Log(LOGDEBUG2, "%s: fd=%d, size=%d", __FUNCTION__, r->m_socket, chunk->c_chunkSize); + LogHexString(LOGDEBUG2, chunk->c_header, chunk->c_headerSize); + if (chunk->c_chunkSize) + LogHexString(LOGDEBUG2, chunk->c_chunk, chunk->c_chunkSize); + wrote = WriteN(r, chunk->c_header, chunk->c_headerSize); + if (wrote && chunk->c_chunkSize) + wrote = WriteN(r, chunk->c_chunk, chunk->c_chunkSize); + return wrote; } bool diff --git a/rtmp.h b/rtmp.h index 229217d..cd27ac2 100644 --- a/rtmp.h +++ b/rtmp.h @@ -80,11 +80,18 @@ uint32_t RTMP_GetTime(); typedef unsigned char BYTE; +typedef struct RTMPChunk +{ + int c_headerSize; + int c_chunkSize; + char *c_chunk; + char c_header[RTMP_MAX_HEADER_SIZE]; +} RTMPChunk; + typedef struct RTMPPacket { BYTE m_headerType; BYTE m_packetType; - BYTE m_headerSize; BYTE m_hasAbsTimestamp; // timestamp absolute or relative? int m_nChannel; uint32_t m_nInfoField1; // 3 first bytes @@ -92,7 +99,7 @@ typedef struct RTMPPacket uint32_t m_nTimeStamp; // absolute timestamp uint32_t m_nBodySize; uint32_t m_nBytesRead; - char *m_header; + RTMPChunk *m_chunk; char *m_body; } RTMPPacket; @@ -216,7 +223,7 @@ bool RTMP_Serve(RTMP *r); bool RTMP_ReadPacket(RTMP * r, RTMPPacket * packet); bool RTMP_SendPacket(RTMP * r, RTMPPacket * packet, bool queue); -bool RTMP_SendChunk(RTMP * r, RTMPPacket * packet, int offset); +bool RTMP_SendChunk(RTMP * r, RTMPChunk *chunk); bool RTMP_IsConnected(RTMP *r); bool RTMP_IsTimedout(RTMP *r); double RTMP_GetDuration(RTMP *r); diff --git a/rtmpsuck.c b/rtmpsuck.c index 21e30f9..2b0fc66 100644 --- a/rtmpsuck.c +++ b/rtmpsuck.c @@ -698,7 +698,8 @@ void doServe(STREAMING_SERVER * server, // server socket and state (our listenin ) { RTMPPacket pc = { 0 }, ps = { 0 }; - char *buf, hbuf[RTMP_MAX_HEADER_SIZE]; + RTMPChunk rk = { 0 }; + char *buf; unsigned int buflen = 131072; bool paused = false; @@ -744,7 +745,7 @@ void doServe(STREAMING_SERVER * server, // server socket and state (our listenin break; } -/* pc.m_header = hbuf; */ + pc.m_chunk = &rk; /* We have our own timeout in select() */ server->rc.Link.timeout = 10; @@ -852,9 +853,10 @@ void doServe(STREAMING_SERVER * server, // server socket and state (our listenin if (cr) { while (RTMP_ReadPacket(&server->rc, &pc)) + { + int sendit = 1; if (RTMPPacket_IsReady(&pc)) { - int sendit = 1; if (paused) { if (pc.m_nTimeStamp <= server->rc.m_mediaStamp) @@ -909,11 +911,13 @@ void doServe(STREAMING_SERVER * server, // server socket and state (our listenin server->f_cur = NULL; } } - if (sendit && RTMP_IsConnected(&server->rs)) - RTMP_SendPacket(&server->rs, &pc, false); - RTMPPacket_Free(&pc); - break; } + if (sendit && RTMP_IsConnected(&server->rs)) + RTMP_SendChunk(&server->rs, &rk); + if (RTMPPacket_IsReady(&pc)) + RTMPPacket_Free(&pc); + break; + } } if (!RTMP_IsConnected(&server->rs) && RTMP_IsConnected(&server->rc) && !server->f_cur) -- 2.50.1