From e78cef0d9fb259fc78a23b27658ccf787f8f1e02 Mon Sep 17 00:00:00 2001
From: Mark Spencer <markster@digium.com>
Date: Mon, 30 Jun 2003 02:00:02 +0000
Subject: [PATCH] Start on video mode for meetme, change symantics of iax2
 marker in full frames

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@1142 65c4cc65-6c06-0410-ace0-fbb531ad65f3
---
 apps/app_meetme.c    | 45 ++++++++++++++++++++++++++++++++++----------
 channels/chan_iax2.c |  4 ++--
 2 files changed, 37 insertions(+), 12 deletions(-)

diff --git a/apps/app_meetme.c b/apps/app_meetme.c
index 91d53b9927..12b0ce590e 100755
--- a/apps/app_meetme.c
+++ b/apps/app_meetme.c
@@ -51,6 +51,7 @@ static char *descrip =
 "      'p' -- allow user to exit the conference by pressing '#'\n"
 "      's' -- send user to admin/user menu if '*' is received\n"
 "      't' -- set talk only mode\n"
+"      'v' -- video mode\n"
 "      'q' -- quiet mode (don't play enter/leave sounds)\n";
 
 static char *descrip2 =
@@ -87,6 +88,7 @@ static pthread_mutex_t conflock = AST_MUTEX_INITIALIZER;
 #define CONFFLAG_STARMENU (1 << 4)	/* If set asterisk will provide a menu to the user what '*' is pressed */
 #define CONFFLAG_TALKER (1 << 5)	/* If set the use can only send audio to the conference */
 #define CONFFLAG_QUIET (1 << 6)		/* If set there will be no enter or leave sounds */
+#define CONFFLAG_VIDEO (1 << 7)		/* Set to enable video mode */
 
 static int careful_write(int fd, unsigned char *data, int len)
 {
@@ -234,6 +236,7 @@ static int conf_run(struct ast_channel *chan, struct conf *conf, int confflags)
 	int origfd;
 	int firstpass = 0;
 	int ret = -1;
+	int x;
 
 	ZT_BUFFERINFO bi;
 	char __buf[CONF_SIZE + AST_FRIENDLY_OFFSET];
@@ -243,17 +246,31 @@ static int conf_run(struct ast_channel *chan, struct conf *conf, int confflags)
 		if (!ast_streamfile(chan, "conf-onlyperson", chan->language))
 			ast_waitstream(chan, "");
 	}
-	
-	/* Set it into U-law mode (write) */
-	if (ast_set_write_format(chan, AST_FORMAT_ULAW) < 0) {
-		ast_log(LOG_WARNING, "Unable to set '%s' to write ulaw mode\n", chan->name);
-		goto outrun;
-	}
 
-	/* Set it into U-law mode (read) */
-	if (ast_set_read_format(chan, AST_FORMAT_ULAW) < 0) {
-		ast_log(LOG_WARNING, "Unable to set '%s' to read ulaw mode\n", chan->name);
-		goto outrun;
+	if (confflags & CONFFLAG_VIDEO) {	
+		/* Set it into linear mode (write) */
+		if (ast_set_write_format(chan, AST_FORMAT_SLINEAR) < 0) {
+			ast_log(LOG_WARNING, "Unable to set '%s' to write linear mode\n", chan->name);
+			goto outrun;
+		}
+
+		/* Set it into linear mode (read) */
+		if (ast_set_read_format(chan, AST_FORMAT_SLINEAR) < 0) {
+			ast_log(LOG_WARNING, "Unable to set '%s' to read linear mode\n", chan->name);
+			goto outrun;
+		}
+	} else {
+		/* Set it into U-law mode (write) */
+		if (ast_set_write_format(chan, AST_FORMAT_ULAW) < 0) {
+			ast_log(LOG_WARNING, "Unable to set '%s' to write ulaw mode\n", chan->name);
+			goto outrun;
+		}
+
+		/* Set it into U-law mode (read) */
+		if (ast_set_read_format(chan, AST_FORMAT_ULAW) < 0) {
+			ast_log(LOG_WARNING, "Unable to set '%s' to read ulaw mode\n", chan->name);
+			goto outrun;
+		}
 	}
 	ast_indicate(chan, -1);
 	retryzap = strcasecmp(chan->type, "Zap");
@@ -288,6 +305,14 @@ zapretry:
 			close(fd);
 			goto outrun;
 		}
+		if (confflags & CONFFLAG_VIDEO) {	
+			x = 1;
+			if (ioctl(fd, ZT_SETLINEAR, &x)) {
+				ast_log(LOG_WARNING, "Unable to set linear mode: %s\n", strerror(errno));
+				close(fd);
+				goto outrun;
+			}
+		}
 		nfds = 1;
 	} else {
 		/* XXX Make sure we're not running on a pseudo channel XXX */
diff --git a/channels/chan_iax2.c b/channels/chan_iax2.c
index 59dfd3c779..ad493c5c75 100755
--- a/channels/chan_iax2.c
+++ b/channels/chan_iax2.c
@@ -2210,7 +2210,7 @@ static int iax2_send(struct chan_iax2_pvt *pvt, struct ast_frame *f, unsigned in
 		pvt->aseqno = fr->iseqno;
 		fh->type = fr->af.frametype & 0xFF;
 		if (fr->af.frametype == AST_FRAME_VIDEO)
-			fh->csub = compress_subclass(fr->af.subclass & ~0x1) | (fr->af.subclass & 0x1);
+			fh->csub = compress_subclass(fr->af.subclass & ~0x1) | ((fr->af.subclass & 0x1) << 6);
 		else
 			fh->csub = compress_subclass(fr->af.subclass);
 		if (transfer) {
@@ -3696,7 +3696,7 @@ static int socket_read(int *id, int fd, short events, void *cbdata)
 		/* Retrieve the type and subclass */
 		f.frametype = fh->type;
 		if (f.frametype == AST_FRAME_VOICE) {
-			f.subclass = uncompress_subclass(fh->csub & ~0x1) | (fh->csub & 0x1);
+			f.subclass = uncompress_subclass(fh->csub & ~0x40) | ((fh->csub & 0x40) >> 6);
 		} else {
 			f.subclass = uncompress_subclass(fh->csub);
 		}
-- 
GitLab