[rtmpdump] r83 - in trunk: Makefile streams.c streams.cpp
hyc
subversion at mplayerhq.hu
Thu Dec 17 03:27:24 CET 2009
Author: hyc
Date: Thu Dec 17 03:27:24 2009
New Revision: 83
Log:
Convert streams to C
Added:
trunk/streams.c
- copied, changed from r73, trunk/streams.cpp
Deleted:
trunk/streams.cpp
Modified:
trunk/Makefile
Modified: trunk/Makefile
==============================================================================
--- trunk/Makefile Thu Dec 17 02:45:33 2009 (r82)
+++ trunk/Makefile Thu Dec 17 03:27:24 2009 (r83)
@@ -37,15 +37,15 @@ arm:
clean:
rm -f *.o rtmpdump$(EXT) streams$(EXT)
-streams: bytes.o log.o rtmp.o AMFObject.o rtmppacket.o streams.o parseurl.o dh.o handshake.o
- $(CXX) $(LDFLAGS) $^ -o $@$(EXT) $(SLIBS)
+streams: log.o rtmp.o amf.o streams.o parseurl.o
+ $(CC) $(LDFLAGS) $^ -o $@$(EXT) $(SLIBS)
rtmpdump: log.o rtmp.o amf.o rtmpdump.o parseurl.o
$(CC) $(LDFLAGS) $^ -o $@$(EXT) $(LIBS)
log.o: log.c log.h Makefile
parseurl.o: parseurl.c parseurl.h log.h Makefile
-streams.o: streams.cpp rtmp.h log.h Makefile
+streams.o: streams.c rtmp.h log.h Makefile
rtmp.o: rtmp.c rtmp.h handshake.h dh.h log.h amf.h Makefile
amf.o: amf.c amf.h bytes.h log.h Makefile
rtmpdump.o: rtmpdump.c rtmp.h log.h amf.h Makefile
Copied and modified: trunk/streams.c (from r73, trunk/streams.cpp)
==============================================================================
--- trunk/streams.cpp Wed Dec 16 21:26:39 2009 (r73, copy source)
+++ trunk/streams.c Thu Dec 17 03:27:24 2009 (r83)
@@ -23,25 +23,16 @@
#include <string.h>
#include <math.h>
-#include <signal.h> // to catch Ctrl-C
+#include <signal.h>
#include <getopt.h>
+#include <pthread.h>
#include <assert.h>
-//#ifdef WIN32
-//#include <winsock.h>
-//#endif
-
#include "rtmp.h"
-#include "log.h"
-#include "AMFObject.h"
#include "parseurl.h"
-int debuglevel = 1;
-
-using namespace RTMP_LIB;
-
-#define RTMPDUMP_STREAMS_VERSION "v1.4"
+#define RTMPDUMP_STREAMS_VERSION "v2.0"
#define RD_SUCCESS 0
#define RD_FAILED 1
@@ -84,17 +75,14 @@ typedef struct
STREAMING_SERVER *httpServer = 0; // server structure pointer
-STREAMING_SERVER *startStreaming(int port);
+STREAMING_SERVER *startStreaming(const char *address, int port);
void stopStreaming(STREAMING_SERVER *server);
-bool bCtrlC = false;
-
typedef struct
{
uint32_t dSeek; // seek position in resume mode, 0 otherwise
char *hostname;
- char *playpath;
int rtmpport;
int protocol;
bool bLiveStream; // is it a live stream? then we can't seek/resume
@@ -103,24 +91,27 @@ typedef struct
uint32_t bufferTime;
char *rtmpurl;
- char *swfUrl;
- char *tcUrl;
- char *pageUrl;
- char *app;
- char *auth;
- char *swfHash;
+ AVal playpath;
+ AVal swfUrl;
+ AVal tcUrl;
+ AVal pageUrl;
+ AVal app;
+ AVal auth;
+ AVal swfHash;
+ AVal flashVer;
+ AVal subscribepath;
uint32_t swfSize;
- char *flashVer;
- char *subscribepath;
uint32_t dStartOffset;
uint32_t dStopOffset;
uint32_t nTimeStamp;
} RTMP_REQUEST;
-// this request is forrmed from the parameters and used to initialize a new request,
-// thus it is a default settings list. All settings can be overriden by specifying the
-// parameters in the GET request
+#define STR2AVAL(av,str) av.av_val = str; av.av_len = strlen(av.av_val)
+
+/* this request is formed from the parameters and used to initialize a new request,
+ * thus it is a default settings list. All settings can be overriden by specifying the
+ * parameters in the GET request */
RTMP_REQUEST defaultRTMPRequest;
bool ParseOption(char opt, char *arg, RTMP_REQUEST *req);
@@ -135,40 +126,6 @@ int pnum = 0;
FILE *netstackdump = NULL;
FILE *netstackdump_read = NULL;
#endif
-/*
-uint32_t dSeek = 0; // seek position in resume mode, 0 otherwise
-
-char *hostname = 0;
-char *playpath = 0;
-int rtmpport = -1;
-int protocol = RTMP_PROTOCOL_UNDEFINED;
-bool bLiveStream = false; // is it a live stream? then we can't seek/resume
-
-long int timeout = 300; // timeout connection afte 300 seconds
-uint32_t bufferTime = 20*1000; // 10 seconds, 10*60*60*1000; // 10 hours as default
-
-char DEFAULT_FLASH_VER[] = "LNX 9,0,124,0";
-
-char *rtmpurl = 0;
-char *swfUrl = 0;
-char *tcUrl = 0;
-char *pageUrl = 0;
-char *app = 0;
-char *auth = 0;
-char *swfHash = 0;
-uint32_t swfSize = 0;
-char *flashVer = 0;
-
-uint32_t nTimeStamp = 0;
-
-#ifdef _DEBUG
-uint32_t debugTS = 0;
-int pnum=0;
-
-FILE *netstackdump = 0;
-FILE *netstackdump_read = 0;
-#endif
-*/
/* inplace http unescape. This is possible .. strlen(unescaped_string) <= strlen(esacped_string) */
void http_unescape(char* data)
@@ -241,7 +198,7 @@ int WriteHeader(
}
int WriteStream(
- CRTMP* rtmp,
+ RTMP *rtmp,
char **buf, // target pointer, maybe preallocated
unsigned int len, // length of buffer if preallocated
uint32_t *nTimeStamp
@@ -249,9 +206,9 @@ int WriteStream(
{
uint32_t prevTagSize = 0;
int rtnGetNextMediaPacket = 0;
- RTMPPacket packet;
+ RTMPPacket packet = {0};
- rtnGetNextMediaPacket = rtmp->GetNextMediaPacket(packet);
+ rtnGetNextMediaPacket = RTMP_GetNextMediaPacket(rtmp, &packet);
if(rtnGetNextMediaPacket)
{
char *packetBody = packet.m_body;
@@ -303,12 +260,12 @@ int WriteStream(
prevTagSize = 11 + nPacketLen;
*ptr = packet.m_packetType; ptr++;
- ptr += CRTMP::EncodeInt24(ptr, nPacketLen);
- ptr += CRTMP::EncodeInt24(ptr, *nTimeStamp);
+ ptr += AMF_EncodeInt24(ptr, nPacketLen);
+ ptr += AMF_EncodeInt24(ptr, *nTimeStamp);
*ptr = (char)(((*nTimeStamp) & 0xFF000000) >> 24); ptr++;
// stream id
- ptr += CRTMP::EncodeInt24(ptr, 0);
+ ptr += AMF_EncodeInt24(ptr, 0);
}
memcpy(ptr, packetBody, nPacketLen);
@@ -321,8 +278,8 @@ int WriteStream(
while(pos+11 < nPacketLen)
{
- uint32_t dataSize = CRTMP::ReadInt24(packetBody+pos+1); // size without header (11) and without prevTagSize (4)
- *nTimeStamp = CRTMP::ReadInt24(packetBody+pos+4);
+ uint32_t dataSize = AMF_DecodeInt24(packetBody+pos+1); // size without header (11) and without prevTagSize (4)
+ *nTimeStamp = AMF_DecodeInt24(packetBody+pos+4);
*nTimeStamp |= (packetBody[pos+7]<<24);
// set data type
@@ -337,10 +294,10 @@ int WriteStream(
// we have to append a last tagSize!
prevTagSize = dataSize+11;
- CRTMP::EncodeInt32(ptr+pos+11+dataSize, prevTagSize);
+ AMF_EncodeInt32(ptr+pos+11+dataSize, prevTagSize);
size+=4; len+=4;
} else {
- prevTagSize = CRTMP::ReadInt32(packetBody+pos+11+dataSize);
+ prevTagSize = AMF_DecodeInt32(packetBody+pos+11+dataSize);
#ifdef _DEBUG
Log(LOGDEBUG, "FLV Packet: type %02X, dataSize: %lu, tagSize: %lu, timeStamp: %lu ms",
@@ -353,7 +310,7 @@ int WriteStream(
#endif
prevTagSize = dataSize+11;
- CRTMP::EncodeInt32(ptr+pos+11+dataSize, prevTagSize);
+ AMF_EncodeInt32(ptr+pos+11+dataSize, prevTagSize);
}
}
@@ -363,7 +320,7 @@ int WriteStream(
ptr += len;
if(packet.m_packetType != 0x16) { // FLV tag packets contain their own prevTagSize
- CRTMP::EncodeInt32(ptr, prevTagSize);
+ AMF_EncodeInt32(ptr, prevTagSize);
//ptr += 4;
}
@@ -395,7 +352,7 @@ pthread_t ThreadCreate(void *(*routine)(
return id;
}
-void *controlServerThread(void *)
+void *controlServerThread(void *unused)
{
char ich;
while(1)
@@ -468,7 +425,7 @@ void processTCPrequest
server->state = STREAMING_IN_PROGRESS;
- CRTMP *rtmp = new CRTMP();
+ RTMP rtmp = {0};
uint32_t dSeek = 0; // can be used to start from a later point in the stream
// reset RTMP options to defaults specified upon invokation of streams
@@ -577,7 +534,7 @@ void processTCPrequest
Log(LOGERROR, "You must specify a hostname (--host) or url (-r \"rtmp://host[:port]/playpath\") containing a hostname");
goto filenotfound;
}
- if(req.playpath == 0) {
+ if(req.playpath.av_len == 0) {
Log(LOGERROR, "You must specify a playpath (--playpath) or url (-r \"rtmp://host[:port]/playpath\") containing a playpath");
goto filenotfound;;
}
@@ -591,14 +548,16 @@ void processTCPrequest
req.protocol = RTMP_PROTOCOL_RTMP;
}
- if(req.flashVer == 0)
- req.flashVer = DEFAULT_FLASH_VER;
+ if(req.flashVer.av_len == 0) {
+ STR2AVAL(req.flashVer, DEFAULT_FLASH_VER);
+ }
- if(req.tcUrl == 0 && req.app != 0) {
+ if(req.tcUrl.av_len == 0 && req.app.av_len != 0) {
char str[512]={0};
- snprintf(str, 511, "%s://%s/%s", RTMPProtocolStringsLower[req.protocol], req.hostname, req.app);
- req.tcUrl = (char *)malloc(strlen(str)+1);
- strcpy(req.tcUrl, str);
+ snprintf(str, 511, "%s://%s/%s", RTMPProtocolStringsLower[req.protocol], req.hostname, req.app.av_val);
+ req.tcUrl.av_len = strlen(str);
+ req.tcUrl.av_val = (char *)malloc(req.tcUrl.av_len + 1);
+ strcpy(req.tcUrl.av_val, str);
}
if(req.rtmpport == 0)
@@ -624,29 +583,30 @@ void processTCPrequest
}
Log(LOGDEBUG, "Setting buffer time to: %dms", req.bufferTime);
- rtmp->SetBufferMS(req.bufferTime);
- rtmp->SetupStream(
+ RTMP_Init(&rtmp);
+ RTMP_SetBufferMS(&rtmp, req.bufferTime);
+ RTMP_SetupStream(&rtmp,
req.protocol,
req.hostname,
req.rtmpport,
NULL, // sockshost
- req.playpath,
- req.tcUrl,
- req.swfUrl,
- req.pageUrl,
- req.app,
- req.auth,
- req.swfHash,
+ &req.playpath,
+ &req.tcUrl,
+ &req.swfUrl,
+ &req.pageUrl,
+ &req.app,
+ &req.auth,
+ &req.swfHash,
req.swfSize,
- req.flashVer,
- req.subscribepath,
+ &req.flashVer,
+ &req.subscribepath,
dSeek,
-1, // length
req.bLiveStream,
req.timeout);
LogPrintf("Connecting ... port: %d, app: %s\n", req.rtmpport, req.app);
- if (!rtmp->Connect()) {
+ if (!RTMP_Connect(&rtmp)) {
LogPrintf("%s, failed to connect!\n", __FUNCTION__);
}
else
@@ -676,7 +636,7 @@ void processTCPrequest
// get the rest of the stream
do
{
- nRead = WriteStream(rtmp, &buffer, PACKET_SIZE, &req.nTimeStamp);
+ nRead = WriteStream(&rtmp, &buffer, PACKET_SIZE, &req.nTimeStamp);
if(nRead > 0)
{
@@ -691,11 +651,11 @@ void processTCPrequest
//LogPrintf("write %dbytes (%.1f KB)\n", nRead, nRead/1024.0);
if(duration <= 0) // if duration unknown try to get it from the stream (onMetaData)
- duration = rtmp->GetDuration();
+ duration = RTMP_GetDuration(&rtmp);
if(duration > 0) {
percent = ((double)(dSeek+req.nTimeStamp)) / (duration*1000.0)*100.0;
- percent = round(percent*10.0)/10.0;
+ percent = ((double)(int)(percent*10.0))/10.0;
LogPrintf("\r%.3f KB / %.2f sec (%.1f%%)", (double)size/1024.0, (double)(req.nTimeStamp)/1000.0, percent);
} else {
LogPrintf("\r%.3f KB / %.2f sec", (double)size/1024.0, (double)(req.nTimeStamp)/1000.0);
@@ -709,14 +669,14 @@ void processTCPrequest
if (req.dStopOffset && req.nTimeStamp >= req.dStopOffset) {
LogPrintf("\nStop offset has been reached at %.2f seconds\n", (double)req.dStopOffset/1000.0);
nRead = 0;
- rtmp->Close();
+ RTMP_Close(&rtmp);
}
- } while(server->state == STREAMING_IN_PROGRESS && nRead > -1 && rtmp->IsConnected() && nWritten >= 0);
+ } while(server->state == STREAMING_IN_PROGRESS && nRead > -1 && RTMP_IsConnected(&rtmp) && nWritten >= 0);
}
cleanup:
LogPrintf("Closing connection... ");
- rtmp->Close();
+ RTMP_Close(&rtmp);
LogPrintf("done!\n\n");
quit:
@@ -825,7 +785,7 @@ void stopStreaming(STREAMING_SERVER *ser
void sigIntHandler(int sig) {
- bCtrlC = true;
+ RTMP_ctrlC = true;
LogPrintf("Caught signal: %d, cleaning up, just a second...\n", sig);
if(httpServer)
stopStreaming(httpServer);
@@ -843,11 +803,12 @@ bool ParseOption(char opt, char *arg, RT
{
case 'w':
{
- int res = hex2bin(arg, &req->swfHash);
+ int res = hex2bin(arg, &req->swfHash.av_val);
if(!res || res!=32) {
- req->swfHash = NULL;
+ req->swfHash.av_val = NULL;
Log(LOGWARNING, "Couldn't parse swf hash hex string, not heyxstring or not 32 bytes, ignoring!");
}
+ req->swfHash.av_len = 32;
break;
}
case 'x':
@@ -873,9 +834,9 @@ bool ParseOption(char opt, char *arg, RT
case 'v':
req->bLiveStream = true; // no seeking or resuming possible!
break;
- case 'd':
- req->subscribepath = optarg;
- break;
+ case 'd':
+ STR2AVAL(req->subscribepath, arg);
+ break;
case 'n':
req->hostname = arg;
break;
@@ -894,7 +855,7 @@ bool ParseOption(char opt, char *arg, RT
break;
}
case 'y':
- req->playpath = arg;
+ STR2AVAL(req->playpath, arg);
break;
case 'r':
{
@@ -913,32 +874,34 @@ bool ParseOption(char opt, char *arg, RT
req->hostname = parsedHost;
if(req->rtmpport == -1)
req->rtmpport = parsedPort;
- if(req->playpath == 0)
- req->playpath = parsedPlaypath;
+ if(req->playpath.av_len == 0 && parsedPlaypath) {
+ STR2AVAL(req->playpath, parsedPlaypath);
+ }
if(req->protocol == RTMP_PROTOCOL_UNDEFINED)
req->protocol = parsedProtocol;
- if(req->app == 0)
- req->app = parsedApp;
+ if(req->app.av_len == 0 && parsedApp) {
+ STR2AVAL(req->app, parsedApp);
+ }
}
break;
}
case 's':
- req->swfUrl = arg;
+ STR2AVAL(req->swfUrl, arg);
break;
case 't':
- req->tcUrl = arg;
+ STR2AVAL(req->tcUrl, arg);
break;
case 'p':
- req->pageUrl = arg;
+ STR2AVAL(req->pageUrl, arg);
break;
case 'a':
- req->app = arg;
+ STR2AVAL(req->app, arg);
break;
case 'f':
- req->flashVer = arg;
+ STR2AVAL(req->flashVer, arg);
break;
case 'u':
- req->auth = arg;
+ STR2AVAL(req->auth, arg);
break;
case 'm':
req->timeout = atoi(arg);
@@ -978,7 +941,7 @@ int main(int argc, char **argv)
int nHttpStreamingPort = 80; // port
LogPrintf("HTTP-RTMP Stream Server %s\n", RTMPDUMP_STREAMS_VERSION);
- LogPrintf("(c) 2009 Andrej Stepanchuk, license: GPL\n\n");
+ LogPrintf("(c) 2009 Andrej Stepanchuk, Howard Chu; license: GPL\n\n");
// init request
memset(&defaultRTMPRequest, 0, sizeof(RTMP_REQUEST));
@@ -1087,10 +1050,10 @@ int main(int argc, char **argv)
}
}
- #ifdef _DEBUG
+#ifdef _DEBUG
netstackdump = fopen("netstackdump", "wb");
netstackdump_read = fopen("netstackdump_read", "wb");
- #endif
+#endif
//InitSockets();
More information about the rtmpdump
mailing list