[rtmpdump] r422 - in trunk: librtmp/amf.c librtmp/handshake.h librtmp/log.c librtmp/log.h librtmp/rtmp.c rtmpdump.c

hyc subversion at mplayerhq.hu
Sat Apr 10 15:30:22 CEST 2010


Author: hyc
Date: Sat Apr 10 15:30:20 2010
New Revision: 422

Log:
Restructure logging, add log callback

Modified:
   trunk/librtmp/amf.c
   trunk/librtmp/handshake.h
   trunk/librtmp/log.c
   trunk/librtmp/log.h
   trunk/librtmp/rtmp.c
   trunk/rtmpdump.c

Modified: trunk/librtmp/amf.c
==============================================================================
--- trunk/librtmp/amf.c	Wed Apr  7 09:34:37 2010	(r421)
+++ trunk/librtmp/amf.c	Sat Apr 10 15:30:20 2010	(r422)
@@ -804,10 +804,10 @@ AMFProp_Dump(AMFObjectProperty *prop)
       name.av_val = "no-name.";
       name.av_len = sizeof("no-name.") - 1;
     }
-  if (name.av_len > 25)
-    name.av_len = 25;
+  if (name.av_len > 18)
+    name.av_len = 18;
 
-  snprintf(strRes, 255, "Name: %25.*s, ", name.av_len, name.av_val);
+  snprintf(strRes, 255, "Name: %18.*s, ", name.av_len, name.av_val);
 
   if (prop->p_type == AMF_OBJECT)
     {

Modified: trunk/librtmp/handshake.h
==============================================================================
--- trunk/librtmp/handshake.h	Wed Apr  7 09:34:37 2010	(r421)
+++ trunk/librtmp/handshake.h	Sat Apr 10 15:30:20 2010	(r422)
@@ -137,7 +137,7 @@ GetDHOffset2(char *handshake, unsigned i
   if (res + 128 > 767)
     {
       RTMP_Log(RTMP_LOGERROR,
-	  "%s: Couldn't calculate correct DH offset (got %d), exiting!\n",
+	  "%s: Couldn't calculate correct DH offset (got %d), exiting!",
 	  __FUNCTION__, res);
       exit(1);
     }
@@ -163,7 +163,7 @@ GetDigestOffset2(char *handshake, unsign
   if (res + 32 > 1535)
     {
       RTMP_Log(RTMP_LOGERROR,
-	  "%s: Couldn't calculate correct digest offset (got %d), exiting\n",
+	  "%s: Couldn't calculate correct digest offset (got %d), exiting",
 	  __FUNCTION__, res);
       exit(1);
     }
@@ -190,7 +190,7 @@ GetDHOffset1(char *handshake, unsigned i
 
   if (res + 128 > 1531)
     {
-      RTMP_Log(RTMP_LOGERROR, "%s: Couldn't calculate DH offset (got %d), exiting!\n",
+      RTMP_Log(RTMP_LOGERROR, "%s: Couldn't calculate DH offset (got %d), exiting!",
 	  __FUNCTION__, res);
       exit(1);
     }
@@ -218,8 +218,8 @@ GetDigestOffset1(char *handshake, unsign
 
   if (res + 32 > 771)
     {
-      RTMP_Log(RTMP_LOGDEBUG,
-	  "%s: Couldn't calculate digest offset (got %d), exiting!\n",
+      RTMP_Log(RTMP_LOGERROR,
+	  "%s: Couldn't calculate digest offset (got %d), exiting!",
 	  __FUNCTION__, res);
       exit(1);
     }
@@ -380,7 +380,7 @@ HandShake(RTMP * r, bool FP9HandShake)
       clientsig[5] = 0;
       clientsig[7] = 2;
 
-      RTMP_Log(RTMP_LOGDEBUG, "%s: Client type: %02X\n", __FUNCTION__, clientsig[-1]);
+      RTMP_Log(RTMP_LOGDEBUG, "%s: Client type: %02X", __FUNCTION__, clientsig[-1]);
     }
   else
     {
@@ -485,12 +485,12 @@ HandShake(RTMP * r, bool FP9HandShake)
 
       if (!VerifyDigest(digestPosServer, serversig, GenuineFMSKey, 36))
 	{
-	  RTMP_Log(RTMP_LOGWARNING, "Trying different position for server digest!\n");
+	  RTMP_Log(RTMP_LOGWARNING, "Trying different position for server digest!");
 	  digestPosServer = GetDigestOffset1(serversig, RTMP_SIG_SIZE);
 
 	  if (!VerifyDigest(digestPosServer, serversig, GenuineFMSKey, 36))
 	    {
-	      RTMP_Log(RTMP_LOGERROR, "Couldn't verify the server digest\n");	/* continuing anyway will probably fail */
+	      RTMP_Log(RTMP_LOGERROR, "Couldn't verify the server digest");	/* continuing anyway will probably fail */
 	      return false;
 	    }
 	  dhposServer = GetDHOffset1(serversig, RTMP_SIG_SIZE);
@@ -847,12 +847,12 @@ SHandShake(RTMP * r)
 
       if (!VerifyDigest(digestPosClient, clientsig, GenuineFPKey, 30))
 	{
-	  RTMP_Log(RTMP_LOGWARNING, "Trying different position for client digest!\n");
+	  RTMP_Log(RTMP_LOGWARNING, "Trying different position for client digest!");
 	  digestPosClient = GetDigestOffset2(clientsig, RTMP_SIG_SIZE);
 
 	  if (!VerifyDigest(digestPosClient, clientsig, GenuineFPKey, 30))
 	    {
-	      RTMP_Log(RTMP_LOGERROR, "Couldn't verify the client digest\n");	/* continuing anyway will probably fail */
+	      RTMP_Log(RTMP_LOGERROR, "Couldn't verify the client digest");	/* continuing anyway will probably fail */
 	      return false;
 	    }
 	  dhposClient = GetDHOffset2(clientsig, RTMP_SIG_SIZE);

Modified: trunk/librtmp/log.c
==============================================================================
--- trunk/librtmp/log.c	Wed Apr  7 09:34:37 2010	(r421)
+++ trunk/librtmp/log.c	Sat Apr 10 15:30:20 2010	(r422)
@@ -36,11 +36,37 @@ static int neednl;
 
 static FILE *fmsg;
 
+static RTMP_LogCallback rtmp_log, *cb = rtmp_log;
+
 static const char *levels[] = {
   "CRIT", "ERROR", "WARNING", "INFO",
   "DEBUG", "DEBUG2"
 };
 
+static void rtmp_log(int level, const char *format, va_list vl)
+{
+	char str[MAX_PRINT_LEN]="";
+
+	vsnprintf(str, MAX_PRINT_LEN-1, format, vl);
+
+	// Filter out 'no-name'
+	if ( RTMP_debuglevel<RTMP_LOGALL && strstr(str, "no-name" ) != NULL )
+		return;
+
+	if ( !fmsg ) fmsg = stderr;
+
+	if ( level <= RTMP_debuglevel ) {
+		if (neednl) {
+			putc('\n', fmsg);
+			neednl = 0;
+		}
+		fprintf(fmsg, "%s: %s\n", levels[level], str);
+#ifdef _DEBUG
+		fflush(fmsg);
+#endif
+	}
+}
+
 void RTMP_LogSetOutput(FILE *file)
 {
 	fmsg = file;
@@ -56,92 +82,45 @@ RTMP_LogLevel RTMP_LogGetLevel()
 	return RTMP_debuglevel;
 }
 
-void RTMP_LogPrintf(const char *format, ...)
+void RTMP_Log(int level, const char *format, ...)
 {
-	char str[MAX_PRINT_LEN]="";
-        int len;
 	va_list args;
 	va_start(args, format);
-	len = vsnprintf(str, MAX_PRINT_LEN-1, format, args);
+	cb(level, format, args);
 	va_end(args);
-
-	if ( RTMP_debuglevel==RTMP_LOGCRIT )
-		return;
-
-	if ( !fmsg ) fmsg = stderr;
-
-	if (neednl) {
-		putc('\n', fmsg);
-		neednl = 0;
-	}
-
-        if (len > MAX_PRINT_LEN-1)
-          len = MAX_PRINT_LEN-1;
-	fprintf(fmsg, "%s", str);
-        if (str[len-1] == '\n')
-	  fflush(fmsg);
 }
 
-void RTMP_LogStatus(const char *format, ...)
-{
-	char str[MAX_PRINT_LEN]="";
-	va_list args;
-	va_start(args, format);
-	vsnprintf(str, MAX_PRINT_LEN-1, format, args);
-	va_end(args);
-
-	if ( RTMP_debuglevel==RTMP_LOGCRIT )
-		return;
-
-	if ( !fmsg ) fmsg = stderr;
-
-	fprintf(fmsg, "%s", str);
-	fflush(fmsg);
-	neednl = 1;
-}
+static const char hexdig[] = "0123456789abcdef";
 
-void RTMP_Log(int level, const char *format, ...)
+void RTMP_LogHex(int level, const char *data, unsigned long len)
 {
-	char str[MAX_PRINT_LEN]="";
-	va_list args;
-	va_start(args, format);
-	vsnprintf(str, MAX_PRINT_LEN-1, format, args);
-	va_end(args);
+	unsigned long i;
+	char line[50], *ptr;
 
-	// Filter out 'no-name'
-	if ( RTMP_debuglevel<RTMP_LOGALL && strstr(str, "no-name" ) != NULL )
+	if ( level > RTMP_debuglevel )
 		return;
 
-	if ( !fmsg ) fmsg = stderr;
+	ptr = line;
 
-	if ( level <= RTMP_debuglevel ) {
-		if (neednl) {
-			putc('\n', fmsg);
-			neednl = 0;
+	for(i=0; i<len; i++) {
+		*ptr++ = hexdig[0x0f & (data[i] >> 4)];
+		*ptr++ = hexdig[0x0f & data[i]];
+		if ((i & 0x0f) == 0x0f) {
+			*ptr = '\0';
+			ptr = line;
+			RTMP_Log(level, "%s", line);
+		} else {
+			*ptr++ = ' ';
 		}
-		fprintf(fmsg, "%s: %s\n", levels[level], str);
-#ifdef _DEBUG
-		fflush(fmsg);
-#endif
 	}
-}
-
-void RTMP_LogHex(int level, const char *data, unsigned long len)
-{
-	unsigned long i;
-	if ( level > RTMP_debuglevel )
-		return;
-	for(i=0; i<len; i++) {
-		RTMP_LogPrintf("%02X%c", (unsigned char)data[i],
-		  ((i & 0x0f) == 0x0f) ? '\n': ' ');
+	if (i & 0x0f) {
+		*ptr = '\0';
+		RTMP_Log(level, "%s", line);
 	}
-	if (i & 0x0f)
-	  RTMP_LogPrintf("\n");
 }
 
 void RTMP_LogHexString(int level, const char *data, unsigned long len)
 {
-	static const char hexdig[] = "0123456789abcdef";
 #define BP_OFFSET 9
 #define BP_GRAPH 60
 #define BP_LEN	80
@@ -152,18 +131,16 @@ void RTMP_LogHexString(int level, const 
 		return;
 
 	/* in case len is zero */
-	line[0] = '\n';
-	line[1] = '\0';
+	line[0] = '\0';
 
 	for ( i = 0 ; i < len ; i++ ) {
 		int n = i % 16;
 		unsigned off;
 
 		if( !n ) {
-			if( i ) RTMP_LogPrintf( "%s", line );
+			if( i ) RTMP_Log( level, "%s", line );
 			memset( line, ' ', sizeof(line)-2 );
-			line[sizeof(line)-2] = '\n';
-			line[sizeof(line)-1] = '\0';
+			line[sizeof(line)-2] = '\0';
 
 			off = i % 0x0ffffU;
 
@@ -187,5 +164,50 @@ void RTMP_LogHexString(int level, const 
 		}
 	}
 
-	RTMP_LogPrintf( "%s", line );
+	RTMP_Log( level, "%s", line );
+}
+
+/* These should only be used by apps, never by the library itself */
+void RTMP_LogPrintf(const char *format, ...)
+{
+	char str[MAX_PRINT_LEN]="";
+	int len;
+	va_list args;
+	va_start(args, format);
+	len = vsnprintf(str, MAX_PRINT_LEN-1, format, args);
+	va_end(args);
+
+	if ( RTMP_debuglevel==RTMP_LOGCRIT )
+		return;
+
+	if ( !fmsg ) fmsg = stderr;
+
+	if (neednl) {
+		putc('\n', fmsg);
+		neednl = 0;
+	}
+
+    if (len > MAX_PRINT_LEN-1)
+          len = MAX_PRINT_LEN-1;
+	fprintf(fmsg, "%s", str);
+    if (str[len-1] == '\n')
+		fflush(fmsg);
+}
+
+void RTMP_LogStatus(const char *format, ...)
+{
+	char str[MAX_PRINT_LEN]="";
+	va_list args;
+	va_start(args, format);
+	vsnprintf(str, MAX_PRINT_LEN-1, format, args);
+	va_end(args);
+
+	if ( RTMP_debuglevel==RTMP_LOGCRIT )
+		return;
+
+	if ( !fmsg ) fmsg = stderr;
+
+	fprintf(fmsg, "%s", str);
+	fflush(fmsg);
+	neednl = 1;
 }

Modified: trunk/librtmp/log.h
==============================================================================
--- trunk/librtmp/log.h	Wed Apr  7 09:34:37 2010	(r421)
+++ trunk/librtmp/log.h	Sat Apr 10 15:30:20 2010	(r422)
@@ -24,6 +24,7 @@
 #define __RTMP_LOG_H__
 
 #include <stdio.h>
+#include <stdarg.h>
 
 #ifdef __cplusplus
 extern "C" {
@@ -42,6 +43,8 @@ typedef enum
 
 extern RTMP_LogLevel RTMP_debuglevel;
 
+typedef void (RTMP_LogCallback)(int level, const char *fmt, va_list);
+void RTMP_LogSetCallback(RTMP_LogCallback *cb);
 void RTMP_LogSetOutput(FILE *file);
 void RTMP_LogPrintf(const char *format, ...);
 void RTMP_LogStatus(const char *format, ...);

Modified: trunk/librtmp/rtmp.c
==============================================================================
--- trunk/librtmp/rtmp.c	Wed Apr  7 09:34:37 2010	(r421)
+++ trunk/librtmp/rtmp.c	Sat Apr 10 15:30:20 2010	(r422)
@@ -466,9 +466,9 @@ static void RTMP_OptUsage()
 {
   int i;
 
-  RTMP_LogPrintf("Valid RTMP options are:\n");
+  RTMP_Log(RTMP_LOGERROR, "Valid RTMP options are:\n");
   for (i=0; options[i].name.av_len; i++) {
-    RTMP_LogPrintf("%10s %-7s  %s\n", options[i].name.av_val,
+    RTMP_Log(RTMP_LOGERROR, "%10s %-7s  %s\n", options[i].name.av_val,
     	optinfo[options[i].otype], options[i].use);
   }
 }
@@ -2364,14 +2364,14 @@ DumpMetaData(AMFObject *obj)
 	      // chomp
 	      if (strlen(str) >= 1 && str[strlen(str) - 1] == '\n')
 		str[strlen(str) - 1] = '\0';
-	      RTMP_LogPrintf("  %-22.*s%s\n", prop->p_name.av_len,
+	      RTMP_Log(RTMP_LOGINFO, "  %-22.*s%s", prop->p_name.av_len,
 			prop->p_name.av_val, str);
 	    }
 	}
       else
 	{
 	  if (prop->p_name.av_len)
-	    RTMP_LogPrintf("%.*s:\n", prop->p_name.av_len, prop->p_name.av_val);
+	    RTMP_Log(RTMP_LOGINFO, "%.*s:", prop->p_name.av_len, prop->p_name.av_val);
 	  DumpMetaData(&prop->p_vu.p_object);
 	}
     }
@@ -2405,7 +2405,7 @@ HandleMetadata(RTMP *r, char *body, unsi
     {
       AMFObjectProperty prop;
       // Show metadata
-      RTMP_LogPrintf("Metadata:\n");
+      RTMP_Log(RTMP_LOGINFO, "Metadata:");
       DumpMetaData(&obj);
       if (RTMP_FindFirstMatchingProperty(&obj, &av_duration, &prop))
 	{

Modified: trunk/rtmpdump.c
==============================================================================
--- trunk/rtmpdump.c	Wed Apr  7 09:34:37 2010	(r421)
+++ trunk/rtmpdump.c	Sat Apr 10 15:30:20 2010	(r422)
@@ -770,6 +770,8 @@ main(int argc, char **argv)
   signal(SIGQUIT, sigIntHandler);
 #endif
 
+  RTMP_debuglevel = RTMP_LOGINFO;
+
   // Check for --quiet option before printing any output
   int index = 0;
   while (index < argc)


More information about the rtmpdump mailing list