summaryrefslogtreecommitdiff
path: root/TAO/orbsvcs/tests/AVStreams/mpeg/source/mpeg_server/vs.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/orbsvcs/tests/AVStreams/mpeg/source/mpeg_server/vs.cpp')
-rw-r--r--TAO/orbsvcs/tests/AVStreams/mpeg/source/mpeg_server/vs.cpp2205
1 files changed, 0 insertions, 2205 deletions
diff --git a/TAO/orbsvcs/tests/AVStreams/mpeg/source/mpeg_server/vs.cpp b/TAO/orbsvcs/tests/AVStreams/mpeg/source/mpeg_server/vs.cpp
deleted file mode 100644
index 054ea5f42dd..00000000000
--- a/TAO/orbsvcs/tests/AVStreams/mpeg/source/mpeg_server/vs.cpp
+++ /dev/null
@@ -1,2205 +0,0 @@
-/* $Id$ */
-/* Copyright (c) 1995 Oregon Graduate Institute of Science and Technology
- * P.O.Box 91000-1000, Portland, OR 97291, USA;
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of O.G.I. not be used in advertising or
- * publicity pertaining to distribution of the software without specific,
- * written prior permission. O.G.I. makes no representations about the
- * suitability of this software for any purpose. It is provided "as is"
- * without express or implied warranty.
- *
- * O.G.I. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
- * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
- * O.G.I. BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY
- * DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
- * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- * Author: Shanwei Cen
- * Department of Computer Science and Engineering
- * email: scen@cse.ogi.edu
- */
-#include <sys/types.h>
-#include <sys/uio.h>
-#include <unistd.h>
-#include <netdb.h>
-#include <string.h>
-#include <stdlib.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <netinet/tcp.h>
-#include <arpa/inet.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <time.h>
-#include <sys/time.h>
-#include <stdio.h>
-#include <errno.h>
-#include <signal.h>
-
-#include "include/common.h"
-#include "mpeg_shared/routine.h"
-#include "mpeg_shared/fileio.h"
-#include "mpeg_shared/com.h"
-#include "mpeg_shared/sendpt.h"
-#include "server_proto.h"
-
-
-// %% Move all these functions to the VIDEO_SINGLETON class and remove
-// zombie code like VideoServer ()...
-static int CmdRead(char *buf, int psize)
-{
- int res = wait_read_bytes (VIDEO_SINGLETON::instance ()->serviceSocket,
- buf,
- psize);
- if (res == 0) return(1);
- if (res == -1) {
- fprintf(stderr, "VS error on read VIDEO_SINGLETON::instance ()->cmdSocket, size %d", psize);
- perror("");
- return(-1);
- }
- return 0;
-}
-
-static void CmdWrite(char *buf, int size)
-{
- int res = wait_write_bytes(VIDEO_SINGLETON::instance ()->serviceSocket, buf, size);
- if (res == -1) {
- if (errno != EPIPE) perror("VS writes to VIDEO_SINGLETON::instance ()->serviceSocket");
- exit(errno != EPIPE);
- }
-}
-
-int FBread(char * buf, int size)
-{ int res;
- while ((res = (VIDEO_SINGLETON::instance ()->conn_tag >= 0 ? wait_read_bytes(VIDEO_SINGLETON::instance ()->videoSocket, buf, size) :
- read(VIDEO_SINGLETON::instance ()->videoSocket, buf, size))) == -1)
- {
- if (errno == EINTR) {errno = 0; continue; }
- if (errno == EPIPE || errno == ECONNRESET) exit(0);
- perror("VS reads Feedback VIDEO_SINGLETON::instance ()->packet");
- return -1;
- }
- if (res < size) {
- if (res) fprintf(stderr, "VS warn: FBread() res %dB < size %dB\n", res, size);
- return -1;
- }
- return 0;
-}
-
-
-/* send a given VIDEO_SINGLETON::instance ()->packet pointed by 'VIDEO_SINGLETON::instance ()->packet' to the network */
-
-int send_to_network(int timeToUse)
-{
- int count = 0;
- VideoMessage * msghd = (VideoMessage *)(((char *)VIDEO_SINGLETON::instance ()->packet) - sizeof(VideoMessage));
- int sent = 0;
- int packetSize = ntohl(VIDEO_SINGLETON::instance ()->packet->dataBytes);
-
- msghd->packetsn = htonl(VIDEO_SINGLETON::instance ()->packetsn ++);
- msghd->packetSize = htonl(packetSize + sizeof(* VIDEO_SINGLETON::instance ()->packet));
- /*
- fprintf(stderr, "VS to send pkt %d of size %d.\n",
- ntohl(msghd->VIDEO_SINGLETON::instance ()->packetsn), ntohl(msghd->VIDEO_SINGLETON::instance ()->packetSize));
- */
- {
- VideoMessage * msg = NULL;
- int size = packetSize + sizeof(* VIDEO_SINGLETON::instance ()->packet); /* msghd->VIDEO_SINGLETON::instance ()->packetSize */
- int offset = 0;
- int targetTime;
-
- if (size > VIDEO_SINGLETON::instance ()->msgsize)
- {
-
- if (!timeToUse)
- {
- timeToUse = (VIDEO_SINGLETON::instance ()->msgsize + sizeof(*msg) + 28) * 2;
- /*
- set the max network as 500KB.
- 28 - UDP header size
- */
- /*
- fprintf(stderr, "computed timeToUse %d. ", timeToUse);
- */
- }
- else
- {
- timeToUse = (timeToUse * 7) >> 3;
- /*
- fprintf(stderr, "preset timeToUse %d.", timeToUse);
- */
- timeToUse /= (size + VIDEO_SINGLETON::instance ()->msgsize - 1) / VIDEO_SINGLETON::instance ()->msgsize;
- timeToUse = min(timeToUse, (VIDEO_SINGLETON::instance ()->msgsize + sizeof(*msg) + 28) * 100);
- /* limit min network bandwidth = 10K */
- }
-
- }
- while (size > 0)
- {
- int segsize, sentsize;
- int resent = 0;
-
- if (msg == NULL) { /* first message for current VIDEO_SINGLETON::instance ()->packet */
- count = 0;
- msg = msghd;
- targetTime = get_usec();
- }
- else {
-#if 0
- /* the select() is not precise enough for being used here*/
- int sleepTime;
- targetTime += timeToUse;
- sleepTime = get_duration(get_usec(), targetTime);
- if (sleepTime >= 5000) { /* resolution of timer is 10,000 usec */
- usleep(sleepTime); /* not first message, wait for a while */
- }
-#endif
- /*
- count ++;
- if (!(count % 10)) usleep(10000);
- */
- msg = (VideoMessage *)((char *)msg + VIDEO_SINGLETON::instance ()->msgsize);
- memcpy((char *)msg, (char *)msghd, sizeof(* msg));
- }
- msg->msgsn = htonl(VIDEO_SINGLETON::instance ()->msgsn++);
- msg->msgOffset = htonl(offset);
- msg->msgSize = htonl(min(size, VIDEO_SINGLETON::instance ()->msgsize));
-
- segsize = min(size, VIDEO_SINGLETON::instance ()->msgsize)+sizeof(*msg);
- if (VIDEO_SINGLETON::instance ()->conn_tag != 0) { /* VIDEO_SINGLETON::instance ()->packet stream */
- while ((sentsize = write(VIDEO_SINGLETON::instance ()->videoSocket, (char *)msg, segsize)) == -1) {
- if (errno == EINTR)
- continue;
- if (errno == ENOBUFS) {
- if (resent) {
- perror("Warning, pkt discarded because");
- sent = -1;
- break;
- }
- else {
- resent = 1;
- perror("VS to sleep 5ms");
- usleep(5000);
- continue;
- }
- }
- if (errno != EPIPE) {
- fprintf(stderr, "VS error on send VIDEO_SINGLETON::instance ()->packet %d of size %d ",
- VIDEO_SINGLETON::instance ()->msgsn-1, min(size, VIDEO_SINGLETON::instance ()->msgsize)+sizeof(*msg));
- perror("");
- }
- exit(errno != EPIPE);
- }
- }
- else {
- sentsize = wait_write_bytes(VIDEO_SINGLETON::instance ()->videoSocket, (char *)msg, segsize);
- if (sentsize == -1) {
- if (errno != EPIPE) {
- fprintf(stderr, "VS error on send VIDEO_SINGLETON::instance ()->packet %d of size %d ",
- VIDEO_SINGLETON::instance ()->msgsn-1, min(size, VIDEO_SINGLETON::instance ()->msgsize)+sizeof(*msg));
- perror("");
- }
- exit(errno != EPIPE);
- }
- }
- if (sentsize < segsize) {
- SFprintf(stderr, "VS warning: message size %dB, sent only %dB\n",
- segsize, sentsize);
- }
- if (sent == -1)
- break;
- /*
- fprintf(stderr, "VS: message %d of size %d sent.\n",
- VIDEO_SINGLETON::instance ()->msgsn-1, min(size, VIDEO_SINGLETON::instance ()->msgsize)+sizeof(*msg));
- */
- size -= VIDEO_SINGLETON::instance ()->msgsize;
- offset += VIDEO_SINGLETON::instance ()->msgsize;
- }
- }
- /*
- fprintf(stderr, "sent = %d\n", sent);
- */
- if (!sent) VIDEO_SINGLETON::instance ()->pkts_sent ++;
- return sent;
-}
-
-/*
- * send a VIDEO_SINGLETON::instance ()->packet with given VIDEO_SINGLETON::instance ()->systemHeader (optional), gop (optional) and frame.
- *
- * sh - system header id, if -1, then no system header will be sent.
- * otherwise, only when frame == 0, the given system header will be sent.
- * gop - group of pictures, gop header will be sent when frame == 0
- * (first I frame );
- * frame - frame to be sent, offset internal to given gop.
- */
-
-/* returns: 0 - VIDEO_SINGLETON::instance ()->packet sent, -1 - VIDEO_SINGLETON::instance ()->packet not sent (failed) */
-static int SendPacket(int shtag, int gop, int frame, int timeToUse)
-/* frame maybe out of range (PLAY, STEP), in this case, END_SEQ is sent
- to force display of last frame in VD */
-{
- char * buf = ((char *) VIDEO_SINGLETON::instance ()->packet) + sizeof(VideoPacket);
- int f = VIDEO_SINGLETON::instance ()->gopTable[gop].previousFrames + frame;
- int sh = VIDEO_SINGLETON::instance ()->gopTable[gop].systemHeader;
- /*
- SFprintf(stderr, "VS to send VIDEO_SINGLETON::instance ()->packet gop-%d, frame-%d.\n", gop, frame);
- */
-
- VIDEO_SINGLETON::instance ()->packet->currentUPF = ntohl(VIDEO_SINGLETON::instance ()->currentUPF);
-
- if (frame >= VIDEO_SINGLETON::instance ()->gopTable[gop].totalFrames)
- {
- VIDEO_SINGLETON::instance ()->packet->cmd = htonl(VIDEO_SINGLETON::instance ()->cmd);
- VIDEO_SINGLETON::instance ()->packet->cmdsn = htonl(VIDEO_SINGLETON::instance ()->cmdsn);
- VIDEO_SINGLETON::instance ()->packet->sh = htonl(sh);
- VIDEO_SINGLETON::instance ()->packet->gop = htonl(gop);
- VIDEO_SINGLETON::instance ()->packet->frame = htonl(VIDEO_SINGLETON::instance ()->numF);
- VIDEO_SINGLETON::instance ()->packet->display = htonl(VIDEO_SINGLETON::instance ()->numF-1);
- VIDEO_SINGLETON::instance ()->packet->future = htonl((unsigned)-1);
- VIDEO_SINGLETON::instance ()->packet->past = htonl((unsigned)-1);
- VIDEO_SINGLETON::instance ()->packet->dataBytes = htonl(4);
- *(int*)((char*)VIDEO_SINGLETON::instance ()->packet + sizeof(*VIDEO_SINGLETON::instance ()->packet)) = htonl(SEQ_END_CODE);
-
- return send_to_network(timeToUse);
- }
-
- if (frame)
- shtag = 0;
- else if (VIDEO_SINGLETON::instance ()->needHeader)
- {
- shtag = 1;
- VIDEO_SINGLETON::instance ()->needHeader = 0;
- }
-
- VIDEO_SINGLETON::instance ()->packet->cmd = htonl(VIDEO_SINGLETON::instance ()->cmd);
- VIDEO_SINGLETON::instance ()->packet->cmdsn = htonl(VIDEO_SINGLETON::instance ()->cmdsn);
- VIDEO_SINGLETON::instance ()->packet->sh = htonl(sh);
- VIDEO_SINGLETON::instance ()->packet->gop = htonl(gop);
- VIDEO_SINGLETON::instance ()->packet->frame = htonl(f);
- if (VIDEO_SINGLETON::instance ()->frameTable[f].type == 'B')
- {
- int pre1 = -1, pre2 = -1, i = f;
- while (i>0)
- if (VIDEO_SINGLETON::instance ()->frameTable[--i].type != 'B')
- {
- pre1 = i;
- break;
- }
- while (i>0)
- if (VIDEO_SINGLETON::instance ()->frameTable[--i].type != 'B')
- {
- pre2 = i;
- break;
- }
- if (pre2 == -1)
- {
- /*
- fprintf(stderr,
- "frame %d-%d (%d) is a B without past ref, no to be sent.\n",
- gop, frame, f);
- */
- return -1;
- }
- if (pre1 != VIDEO_SINGLETON::instance ()->lastRef[VIDEO_SINGLETON::instance ()->lastRefPtr] ||
- pre2 != VIDEO_SINGLETON::instance ()->lastRef[1 - VIDEO_SINGLETON::instance ()->lastRefPtr])
- {
- /*
- fprintf(stderr,
- "send of B frame %d gaveup for past %d/future %d ref not sent.\n",
- f, pre2, pre1);
- */
- return -1;
- }
- VIDEO_SINGLETON::instance ()->packet->display = htonl(f);
- VIDEO_SINGLETON::instance ()->packet->future = htonl(pre1);
- VIDEO_SINGLETON::instance ()->packet->past = htonl(pre2);
- }
- else
- {
- int next = f;
- int pre = f;
-
- while (next < VIDEO_SINGLETON::instance ()->numF && VIDEO_SINGLETON::instance ()->frameTable[++next].type == 'B');
- while (pre > 0 && VIDEO_SINGLETON::instance ()->frameTable[--pre].type == 'B');
- if (VIDEO_SINGLETON::instance ()->frameTable[f].type == 'P' && pre != VIDEO_SINGLETON::instance ()->lastRef[VIDEO_SINGLETON::instance ()->lastRefPtr])
- {
- /*
- fprintf(stderr,
- "send of P frame %d gaveup for past ref %d not sent.\n",
- f, pre);
- fprintf(stderr, "ref0=%d, ref1=%d, ptr=%d.\n",
- VIDEO_SINGLETON::instance ()->lastRef[0], VIDEO_SINGLETON::instance ()->lastRef[1], VIDEO_SINGLETON::instance ()->lastRefPtr);
- */
- return -1;
- }
- VIDEO_SINGLETON::instance ()->packet->display = htonl(next);
- VIDEO_SINGLETON::instance ()->packet->future = htonl((unsigned)-1);
- VIDEO_SINGLETON::instance ()->packet->past = htonl(VIDEO_SINGLETON::instance ()->frameTable[f].type == 'P' ? pre : (unsigned)-1);
- }
- {
- char * ptr = buf;
- int size = 0, offset = 0, i;
- if (shtag) /* send system header */
- {
- size = VIDEO_SINGLETON::instance ()->systemHeader[sh].size;
- FileRead(VIDEO_SINGLETON::instance ()->systemHeader[sh].offset, ptr, size);
- ptr += size;
- }
- if (!frame) /* send gop header */
- {
- size = VIDEO_SINGLETON::instance ()->gopTable[gop].headerSize;
- FileRead(VIDEO_SINGLETON::instance ()->gopTable[gop].offset, ptr, size);
- ptr += size;
- }
- size = VIDEO_SINGLETON::instance ()->frameTable[f].size;
- for (i=VIDEO_SINGLETON::instance ()->gopTable[gop].previousFrames; i<f; i++)
- offset += VIDEO_SINGLETON::instance ()->frameTable[i].size;
- FileRead((VIDEO_SINGLETON::instance ()->gopTable[gop].firstIoffset + offset), ptr, size);
- ptr += size;
- VIDEO_SINGLETON::instance ()->packet->dataBytes = htonl(ptr - buf);
- }
-
- {
- int sent = send_to_network(timeToUse);
- if (!sent)
- {
- /*
- fprintf(stderr, "%c%d\n", VIDEO_SINGLETON::instance ()->frameTable[f].type, f);
- fprintf(stderr, "%c frame %d sent.\n", VIDEO_SINGLETON::instance ()->frameTable[f].type, f);
- */
- if (VIDEO_SINGLETON::instance ()->frameTable[f].type != 'B')
- {
- VIDEO_SINGLETON::instance ()->lastRefPtr = 1 - VIDEO_SINGLETON::instance ()->lastRefPtr;
- VIDEO_SINGLETON::instance ()->lastRef[VIDEO_SINGLETON::instance ()->lastRefPtr] = f;
- }
- }
- return sent;
- }
-}
-
-
-int SendReferences(int group, int frame)
-{
- unsigned char orgcmd;
- int i, base;
- int pregroup;
- int result;
-
- if (group < 0 || group >= VIDEO_SINGLETON::instance ()->numG) return 0;
- if (frame <= 0 || frame >= VIDEO_SINGLETON::instance ()->gopTable[group].totalFrames) return 0;
-
- orgcmd = VIDEO_SINGLETON::instance ()->cmd;
- VIDEO_SINGLETON::instance ()->cmd = CmdREF;
-
- if (group > 0) {
- pregroup = 1;
- base = VIDEO_SINGLETON::instance ()->gopTable[group].previousFrames;
- for (i = 0; i <= frame; i ++) {
- if (VIDEO_SINGLETON::instance ()->frameTable[i + base].type == 'P') {
- pregroup = 0;
- break;
- }
- }
- }
- else pregroup = 0;
-
- if (pregroup) { /* reference frame can be in previous group */
- pregroup = group -1;
- base = VIDEO_SINGLETON::instance ()->gopTable[pregroup].previousFrames;
- for (i = 0; i < VIDEO_SINGLETON::instance ()->gopTable[pregroup].totalFrames; i ++) {
- if (VIDEO_SINGLETON::instance ()->frameTable[i + base].type != 'B') {
- /*
- SFprintf(stderr, "REF group%d, frame%d\n", pregroup, i);
- */
- result = SendPacket(i == 0, pregroup, i, 0);
- if (result != 0)
- return result;
- }
- }
- }
-
- base = VIDEO_SINGLETON::instance ()->gopTable[group].previousFrames;
- for (i = 0; i < frame; i ++) {
- if (VIDEO_SINGLETON::instance ()->frameTable[i + base].type != 'B') {
- /*
- SFprintf(stderr, "REF group%d, frame%d\n", group, i);
- */
- SendPacket(i == 0, group, i, 0);
- }
- }
- VIDEO_SINGLETON::instance ()->cmd = orgcmd;
-}
-
-int SendPicture(int * frame)
-{
- int size;
- char * buf = ((char *) VIDEO_SINGLETON::instance ()->packet) + sizeof(VideoPacket);
- /*
- SFprintf(stderr, "VS to send picture %d.\n", *frame);
- */
-
- size = ReadLiveVideoPicture(frame, buf, VIDEO_SINGLETON::instance ()->packetBufSize);
-
- VIDEO_SINGLETON::instance ()->packet->currentUPF = ntohl(VIDEO_SINGLETON::instance ()->currentUPF);
- VIDEO_SINGLETON::instance ()->packet->cmd = htonl(VIDEO_SINGLETON::instance ()->cmd);
- VIDEO_SINGLETON::instance ()->packet->cmdsn = htonl(VIDEO_SINGLETON::instance ()->cmdsn);
- VIDEO_SINGLETON::instance ()->packet->sh = VIDEO_SINGLETON::instance ()->packet->gop = VIDEO_SINGLETON::instance ()->packet->frame = VIDEO_SINGLETON::instance ()->packet->display = htonl(*frame);
- VIDEO_SINGLETON::instance ()->packet->future = htonl((unsigned)-1);
- VIDEO_SINGLETON::instance ()->packet->past = htonl((unsigned)-1);
-
- VIDEO_SINGLETON::instance ()->packet->dataBytes = htonl(size);
-
- return send_to_network(VIDEO_SINGLETON::instance ()->currentUPF);
-}
-
-static int ReadInfoFromFile(void)
-{
- int fd = -1, i;
- int fnlen = strlen(VIDEO_SINGLETON::instance ()->videoFile);
-
- strcpy(&VIDEO_SINGLETON::instance ()->videoFile[fnlen], ".Info");
- fd = open(VIDEO_SINGLETON::instance ()->videoFile, O_RDONLY);
- if (fd == -1)
- {
- fprintf(stderr, "Reminder: VS fails to open %s for read, ", VIDEO_SINGLETON::instance ()->videoFile);
- perror("try create one");
- goto fail_ReadInfoFromFile;
- }
- read_int(fd, &i);
- if (i != VIDEO_SINGLETON::instance ()->fileSize)
- {
- fprintf(stderr, "Warning: VIDEO_SINGLETON::instance ()->fileSize in Info: %d not the same as actual %d.\n",
- i, VIDEO_SINGLETON::instance ()->fileSize);
- goto fail_ReadInfoFromFile;
- }
-
- read_int(fd, &VIDEO_SINGLETON::instance ()->maxS);
- read_int(fd, &VIDEO_SINGLETON::instance ()->maxG);
- read_int(fd, &VIDEO_SINGLETON::instance ()->maxI);
- read_int(fd, &VIDEO_SINGLETON::instance ()->maxP);
- read_int(fd, &VIDEO_SINGLETON::instance ()->maxB);
- read_int(fd, &VIDEO_SINGLETON::instance ()->minS);
- read_int(fd, &VIDEO_SINGLETON::instance ()->minG);
- read_int(fd, &VIDEO_SINGLETON::instance ()->minI);
- read_int(fd, &VIDEO_SINGLETON::instance ()->minP);
- read_int(fd, &VIDEO_SINGLETON::instance ()->minB);
- read_int(fd, &VIDEO_SINGLETON::instance ()->numS);
- read_int(fd, &VIDEO_SINGLETON::instance ()->numG);
- read_int(fd, &VIDEO_SINGLETON::instance ()->numF);
- read_int(fd, &VIDEO_SINGLETON::instance ()->numI);
- read_int(fd, &VIDEO_SINGLETON::instance ()->numP);
- read_int(fd, &VIDEO_SINGLETON::instance ()->numB);
- read_int(fd, &VIDEO_SINGLETON::instance ()->averageFrameSize);
- read_int(fd, &VIDEO_SINGLETON::instance ()->horizontalSize);
- read_int(fd, &VIDEO_SINGLETON::instance ()->verticalSize);
- read_int(fd, &VIDEO_SINGLETON::instance ()->pelAspectRatio);
- read_int(fd, &VIDEO_SINGLETON::instance ()->pictureRate);
- read_int(fd, &VIDEO_SINGLETON::instance ()->vbvBufferSize);
- read_int(fd, &VIDEO_SINGLETON::instance ()->patternSize);
-
- memset(VIDEO_SINGLETON::instance ()->pattern, 0, PATTERN_SIZE);
- read_bytes(fd, VIDEO_SINGLETON::instance ()->pattern, VIDEO_SINGLETON::instance ()->patternSize);
-#ifdef STAT
- VIDEO_SINGLETON::instance ()->framesSent = (char *)malloc((VIDEO_SINGLETON::instance ()->numF + 7)>>3);
- if (VIDEO_SINGLETON::instance ()->framesSent == NULL)
- {
- fprintf(stderr, "Error: VS fails to alloc mem for VIDEO_SINGLETON::instance ()->framesSent for %d frames", VIDEO_SINGLETON::instance ()->numF);
- perror("");
- exit(1);
- }
-#endif
- VIDEO_SINGLETON::instance ()->systemHeader = (struct Video_Global::SystemHeader *)malloc(sizeof(struct Video_Global::SystemHeader) * VIDEO_SINGLETON::instance ()->numS);
- if (VIDEO_SINGLETON::instance ()->systemHeader == NULL)
- {
- perror("Error: VS error on malloc VIDEO_SINGLETON::instance ()->SystemHeader");
- exit(1);
- }
- VIDEO_SINGLETON::instance ()->gopTable = (struct Video_Global::GopTable *)malloc(sizeof(struct Video_Global::GopTable) * VIDEO_SINGLETON::instance ()->numG);
- if (VIDEO_SINGLETON::instance ()->gopTable == NULL)
- {
- perror("Error: VS error on malloc GopHeader");
- exit(1);
- }
- VIDEO_SINGLETON::instance ()->frameTable = (struct Video_Global::FrameTable *)malloc(sizeof(Video_Global::FrameTable) * VIDEO_SINGLETON::instance ()->numF);
- if (VIDEO_SINGLETON::instance ()->frameTable == NULL)
- {
- perror("Error: VS error on malloc VIDEO_SINGLETON::instance ()->frameTable");
- exit(1);
- }
- VIDEO_SINGLETON::instance ()->packetBufSize = VIDEO_SINGLETON::instance ()->maxS + VIDEO_SINGLETON::instance ()->maxG + max(VIDEO_SINGLETON::instance ()->maxI, max(VIDEO_SINGLETON::instance ()->maxP, VIDEO_SINGLETON::instance ()->maxB));
- VIDEO_SINGLETON::instance ()->packet = (VideoPacket *)malloc(sizeof(VideoMessage) + sizeof(VideoPacket) +
- VIDEO_SINGLETON::instance ()->packetBufSize);
- if (VIDEO_SINGLETON::instance ()->packet == NULL)
- {
- perror("Error: VS error on malloc VIDEO_SINGLETON::instance ()->packet buffer");
- exit(1);
- }
- VIDEO_SINGLETON::instance ()->packet = (VideoPacket *)((char *)VIDEO_SINGLETON::instance ()->packet + sizeof(VideoMessage));
-
- for (i = 0; i < VIDEO_SINGLETON::instance ()->numS; i ++)
- {
- read_int(fd, (int *)&VIDEO_SINGLETON::instance ()->systemHeader[i].offset);
- read_int(fd, &VIDEO_SINGLETON::instance ()->systemHeader[i].size);
- }
- for (i = 0; i < VIDEO_SINGLETON::instance ()->numG; i ++)
- {
- read_int(fd, &VIDEO_SINGLETON::instance ()->gopTable[i].systemHeader);
- read_int(fd, (int *)&VIDEO_SINGLETON::instance ()->gopTable[i].offset);
- read_int(fd, &VIDEO_SINGLETON::instance ()->gopTable[i].headerSize);
- read_int(fd, &VIDEO_SINGLETON::instance ()->gopTable[i].size);
- read_int(fd, &VIDEO_SINGLETON::instance ()->gopTable[i].totalFrames);
- read_int(fd, &VIDEO_SINGLETON::instance ()->gopTable[i].previousFrames);
- read_int(fd, (int *)&VIDEO_SINGLETON::instance ()->gopTable[i].firstIoffset);
- }
- for (i = 0; i < VIDEO_SINGLETON::instance ()->numF; i ++)
- {
- read_byte(fd, &VIDEO_SINGLETON::instance ()->frameTable[i].type);
- read_short(fd, (short *)&VIDEO_SINGLETON::instance ()->frameTable[i].size);
- }
-
- close(fd);
- /*
- fprintf(stderr, "Read Info from %s\n", VIDEO_SINGLETON::instance ()->videoFile);
- */
- VIDEO_SINGLETON::instance ()->videoFile[fnlen] = 0;
- return 0;
- fail_ReadInfoFromFile:
- if (fd >= 0)
- close(fd);
- VIDEO_SINGLETON::instance ()->videoFile[fnlen] = 0;
- /*
- fprintf(stderr, "To scan Info from %s\n", VIDEO_SINGLETON::instance ()->videoFile);
- */
- return -1;
-}
-
-static void WriteInfoToFile(void)
-{
- int fd = -1, i;
- int fnlen = strlen(VIDEO_SINGLETON::instance ()->videoFile);
-
- strcpy(&VIDEO_SINGLETON::instance ()->videoFile[fnlen], ".Info");
- fd = open(VIDEO_SINGLETON::instance ()->videoFile, O_WRONLY | O_CREAT, 0444);
- if (fd == -1)
- {
- fprintf(stderr, "VS fails to open %s for write", VIDEO_SINGLETON::instance ()->videoFile);
- perror("");
- goto fail_WriteInfoToFile;
- }
- write_int(fd, VIDEO_SINGLETON::instance ()->fileSize);
- write_int(fd, VIDEO_SINGLETON::instance ()->maxS);
- write_int(fd, VIDEO_SINGLETON::instance ()->maxG);
- write_int(fd, VIDEO_SINGLETON::instance ()->maxI);
- write_int(fd, VIDEO_SINGLETON::instance ()->maxP);
- write_int(fd, VIDEO_SINGLETON::instance ()->maxB);
- write_int(fd, VIDEO_SINGLETON::instance ()->minS);
- write_int(fd, VIDEO_SINGLETON::instance ()->minG);
- write_int(fd, VIDEO_SINGLETON::instance ()->minI);
- write_int(fd, VIDEO_SINGLETON::instance ()->minP);
- write_int(fd, VIDEO_SINGLETON::instance ()->minB);
- write_int(fd, VIDEO_SINGLETON::instance ()->numS);
- write_int(fd, VIDEO_SINGLETON::instance ()->numG);
- write_int(fd, VIDEO_SINGLETON::instance ()->numF);
- write_int(fd, VIDEO_SINGLETON::instance ()->numI);
- write_int(fd, VIDEO_SINGLETON::instance ()->numP);
- write_int(fd, VIDEO_SINGLETON::instance ()->numB);
- write_int(fd, VIDEO_SINGLETON::instance ()->averageFrameSize);
- write_int(fd, VIDEO_SINGLETON::instance ()->horizontalSize);
- write_int(fd, VIDEO_SINGLETON::instance ()->verticalSize);
- write_int(fd, VIDEO_SINGLETON::instance ()->pelAspectRatio);
- write_int(fd, VIDEO_SINGLETON::instance ()->pictureRate);
- write_int(fd, VIDEO_SINGLETON::instance ()->vbvBufferSize);
- write_int(fd, VIDEO_SINGLETON::instance ()->patternSize);
-
- write_bytes(fd, VIDEO_SINGLETON::instance ()->pattern, VIDEO_SINGLETON::instance ()->patternSize);
-
- for (i = 0; i < VIDEO_SINGLETON::instance ()->numS; i ++)
- {
- write_int(fd, VIDEO_SINGLETON::instance ()->systemHeader[i].offset);
- write_int(fd, VIDEO_SINGLETON::instance ()->systemHeader[i].size);
- }
- for (i = 0; i < VIDEO_SINGLETON::instance ()->numG; i ++)
- {
- write_int(fd, VIDEO_SINGLETON::instance ()->gopTable[i].systemHeader);
- write_int(fd, VIDEO_SINGLETON::instance ()->gopTable[i].offset);
- write_int(fd, VIDEO_SINGLETON::instance ()->gopTable[i].headerSize);
- write_int(fd, VIDEO_SINGLETON::instance ()->gopTable[i].size);
- write_int(fd, VIDEO_SINGLETON::instance ()->gopTable[i].totalFrames);
- write_int(fd, VIDEO_SINGLETON::instance ()->gopTable[i].previousFrames);
- write_int(fd, VIDEO_SINGLETON::instance ()->gopTable[i].firstIoffset);
- }
- for (i = 0; i < VIDEO_SINGLETON::instance ()->numF; i ++)
- {
- write_byte(fd, VIDEO_SINGLETON::instance ()->frameTable[i].type);
- write_short(fd, VIDEO_SINGLETON::instance ()->frameTable[i].size);
- }
-
- close(fd);
- VIDEO_SINGLETON::instance ()->videoFile[fnlen] = 0;
- return;
- fail_WriteInfoToFile:
- if (fd >= 0)
- close(fd);
- VIDEO_SINGLETON::instance ()->videoFile[fnlen] = 0;
- return;
-}
-
-/*
-#define nextByte {fileptr ++; \
- if (fread(&nb, 1, 1, fp) == 0) \
- { \
- perror("VS Crossed EOF or error while scanning"); \
- return 1; \
- } }
-
-*/
-
-#define nextByte {int val; fileptr ++; \
- if ((val = getc(VIDEO_SINGLETON::instance ()->fp)) == EOF) \
- {\
- perror("Crossed EOF or error while scanning"); \
- return 1; \
- } nb = val;}
-
-#define computePicSize \
- if (inpic) \
- { \
- if (pictype == 'I') \
- { \
- VIDEO_SINGLETON::instance ()->maxI = max(VIDEO_SINGLETON::instance ()->maxI, (int)(fileptr - picptr - 4)); \
- VIDEO_SINGLETON::instance ()->minI = min(VIDEO_SINGLETON::instance ()->minI, (int)(fileptr - picptr - 4)); \
- } \
- else if (pictype == 'P') \
- { \
- VIDEO_SINGLETON::instance ()->maxP = max(VIDEO_SINGLETON::instance ()->maxP, (int)(fileptr - picptr - 4)); \
- VIDEO_SINGLETON::instance ()->minP = min(VIDEO_SINGLETON::instance ()->minP, (int)(fileptr - picptr - 4)); \
- } \
- else \
- { \
- VIDEO_SINGLETON::instance ()->maxB = max(VIDEO_SINGLETON::instance ()->maxB, (int)(fileptr - picptr - 4)); \
- VIDEO_SINGLETON::instance ()->minB = min(VIDEO_SINGLETON::instance ()->minB, (int)(fileptr - picptr - 4)); \
- } \
- VIDEO_SINGLETON::instance ()->frameTable[ftptr].type = pictype; \
- VIDEO_SINGLETON::instance ()->frameTable[ftptr++].size = (int)(fileptr - picptr - 4); \
- inpic = 0; \
- }
-
-static int init_MPEG1_video_file(void)
-{
- unsigned char nb;
- int state = 0;
- unsigned long fileptr = 0;
- unsigned long i, j, k;
- int shptr, gopptr, ftptr;
- int inpic = 0;
- unsigned long picptr = 0;
- int pictype = 0;
- int first = 0;
- int failureType = 0;
-
- VIDEO_SINGLETON::instance ()->fp = fopen(VIDEO_SINGLETON::instance ()->videoFile, "r");
- if (VIDEO_SINGLETON::instance ()->fp == NULL)
- {
- fprintf(stderr, "error on opening video file %s", VIDEO_SINGLETON::instance ()->videoFile);
- perror("");
- return 2;
- }
- if (fseek(VIDEO_SINGLETON::instance ()->fp, 0, 2) == -1)
- {
- fprintf(stderr, "File %s not seekable", VIDEO_SINGLETON::instance ()->videoFile);
- perror("");
- return 3;
- }
- VIDEO_SINGLETON::instance ()->fileSize = ftell(VIDEO_SINGLETON::instance ()->fp);
-
- fseek(VIDEO_SINGLETON::instance ()->fp, 0, 0);
-
- if (ReadInfoFromFile())
- {
- for (;;)
- {
- nextByte;
- if (state >= 0 && nb == 0x00)
- state ++;
- else if (state >= 2 && nb == 0x01)
- state = -1;
- else if (state == -1)
- {
- if (!first) first ++;
- else if (first == 1) first ++;
-
- switch (nb)
- {
- case 0xb7: /* seq_end_code */
- goto exit_phase1;
- break;
- case 0xb3: /* seq_start_code */
- if (first == 1) first = 3;
- if (first != 3)
- {
- fprintf(stderr, "VS error: given file is not in MPEG format.\n");
- return 4;
- }
- VIDEO_SINGLETON::instance ()->numS ++;
- break;
- case 0xb8: /* gop_start_code */
- VIDEO_SINGLETON::instance ()->numG ++;
- break;
- case 0x00: /* picture_start_code */
- nextByte;
- nextByte;
- nb &= 0x38;
- if (nb == 0x08)
- {
- VIDEO_SINGLETON::instance ()->numI ++;
- if (VIDEO_SINGLETON::instance ()->numG == 2)
- VIDEO_SINGLETON::instance ()->pattern[VIDEO_SINGLETON::instance ()->patternSize++] = 'I';
- }
- else if (nb == 0x10)
- {
- VIDEO_SINGLETON::instance ()->numP ++;
- if (VIDEO_SINGLETON::instance ()->numG == 2)
- VIDEO_SINGLETON::instance ()->pattern[VIDEO_SINGLETON::instance ()->patternSize++] = 'P';
- }
- else if (nb == 0x18)
- {
- VIDEO_SINGLETON::instance ()->numB ++;
- if (VIDEO_SINGLETON::instance ()->numG == 2)
- VIDEO_SINGLETON::instance ()->pattern[VIDEO_SINGLETON::instance ()->patternSize++] = 'B';
- }
- /*
- else
- fprintf(stderr, "VS error: unkonw picture type %d\n", nb);
- */
- break;
- default:
- break;
- }
- state = 0;
- }
- else
- state = 0;
- }
- exit_phase1:
-
- if (first != 3)
- {
- fprintf(stderr, "VS error: given file \"%s\" is not of MPEG format.\n", VIDEO_SINGLETON::instance ()->videoFile);
- return 4;
- }
-
- VIDEO_SINGLETON::instance ()->pattern[VIDEO_SINGLETON::instance ()->patternSize] = 0;
- memset(VIDEO_SINGLETON::instance ()->sendPattern, 1, PATTERN_SIZE);
-
- VIDEO_SINGLETON::instance ()->numF = VIDEO_SINGLETON::instance ()->numI + VIDEO_SINGLETON::instance ()->numP + VIDEO_SINGLETON::instance ()->numB;
- VIDEO_SINGLETON::instance ()->averageFrameSize = fileptr / (unsigned)VIDEO_SINGLETON::instance ()->numF;
- /*
- fprintf(stderr, "Pass one finished, total bytes read: %u, average frame size %d\n",
- fileptr, VIDEO_SINGLETON::instance ()->averageFrameSize);
- fprintf(stderr, "VIDEO_SINGLETON::instance ()->numS-%d, VIDEO_SINGLETON::instance ()->numG-%d, VIDEO_SINGLETON::instance ()->numF-%d, VIDEO_SINGLETON::instance ()->numI-%d, VIDEO_SINGLETON::instance ()->numP-%d, VIDEO_SINGLETON::instance ()->numB-%d\n",
- VIDEO_SINGLETON::instance ()->numS, VIDEO_SINGLETON::instance ()->numG, VIDEO_SINGLETON::instance ()->numI, VIDEO_SINGLETON::instance ()->numI, VIDEO_SINGLETON::instance ()->numP, VIDEO_SINGLETON::instance ()->numB);
- fprintf(stderr, "VIDEO_SINGLETON::Instance ()->Pattern detected: %s\n", VIDEO_SINGLETON::instance ()->pattern);
- */
- if (VIDEO_SINGLETON::instance ()->numF > MAX_FRAMES)
- {
- fprintf(stderr, "VS error: VIDEO_SINGLETON::instance ()->Number of frames (%d) is bigger than MAX_FRAMES (%d).\n\
- you need to update the constant definition in common.h and recompile.\n",
- VIDEO_SINGLETON::instance ()->numF, MAX_FRAMES);
- return 5;
- }
-
-#ifdef STAT
- VIDEO_SINGLETON::instance ()->framesSent = (char *)malloc((VIDEO_SINGLETON::instance ()->numF + 7)>>3);
- if (VIDEO_SINGLETON::instance ()->framesSent == NULL)
- {
- fprintf(stderr, "VS fails to alloc mem for VIDEO_SINGLETON::instance ()->framesSent for %d frames", VIDEO_SINGLETON::instance ()->numF);
- perror("");
- return 6;
- }
-#endif
-
- VIDEO_SINGLETON::instance ()->systemHeader = (struct Video_Global::SystemHeader *)malloc(sizeof(struct Video_Global::SystemHeader) * VIDEO_SINGLETON::instance ()->numS);
- if (VIDEO_SINGLETON::instance ()->systemHeader == NULL)
- {
- perror("VS error on malloc VIDEO_SINGLETON::instance ()->SystemHeader");
- return 7;
- }
- VIDEO_SINGLETON::instance ()->gopTable = (struct Video_Global::GopTable *)malloc(sizeof(struct Video_Global::GopTable) * VIDEO_SINGLETON::instance ()->numG);
- if (VIDEO_SINGLETON::instance ()->gopTable == NULL)
- {
- perror("VS error on malloc GopHeader");
- return 8;
- }
- VIDEO_SINGLETON::instance ()->frameTable = (struct Video_Global::FrameTable *)malloc(sizeof(Video_Global::FrameTable) * VIDEO_SINGLETON::instance ()->numF);
- if (VIDEO_SINGLETON::instance ()->frameTable == NULL)
- {
- perror("VS error on malloc VIDEO_SINGLETON::instance ()->frameTable");
- return 9;
- }
-
- rewind(VIDEO_SINGLETON::instance ()->fp);
- fileptr = 0;
- state = 0;
- inpic = 0;
- shptr = -1;
- gopptr = -1;
- ftptr = 0;
-
- for (;;)
- {
- nextByte;
- if (state >= 0 && nb == 0x00)
- state ++;
- else if (state >= 2 && nb == 0x01)
- state = -1;
- else if (state == -1)
- {
- switch (nb)
- {
- case 0xb7: /* seq_end_code */
- if (gopptr >= 0 && VIDEO_SINGLETON::instance ()->gopTable[gopptr].size == 0)
- VIDEO_SINGLETON::instance ()->gopTable[gopptr].size = fileptr - VIDEO_SINGLETON::instance ()->gopTable[gopptr].offset - 4;
- computePicSize;
- goto exit_phase2;
- break;
- case 0xb3: /* seq_start_code */
- if (gopptr >= 0 && VIDEO_SINGLETON::instance ()->gopTable[gopptr].size == 0)
- VIDEO_SINGLETON::instance ()->gopTable[gopptr].size = fileptr - VIDEO_SINGLETON::instance ()->gopTable[gopptr].offset - 4;
- computePicSize;
- shptr ++;
- VIDEO_SINGLETON::instance ()->systemHeader[shptr].offset = fileptr - 4;
- VIDEO_SINGLETON::instance ()->systemHeader[shptr].size = 0;
- break;
- case 0xb8: /* gop_start_code */
- if (VIDEO_SINGLETON::instance ()->systemHeader[shptr].size == 0)
- VIDEO_SINGLETON::instance ()->systemHeader[shptr].size =fileptr - VIDEO_SINGLETON::instance ()->systemHeader[shptr].offset - 4;
- if (gopptr >= 0 && VIDEO_SINGLETON::instance ()->gopTable[gopptr].size == 0)
- VIDEO_SINGLETON::instance ()->gopTable[gopptr].size = fileptr - VIDEO_SINGLETON::instance ()->gopTable[gopptr].offset - 4;
- computePicSize;
- gopptr ++;
- VIDEO_SINGLETON::instance ()->gopTable[gopptr].systemHeader = shptr;
- VIDEO_SINGLETON::instance ()->gopTable[gopptr].offset = fileptr - 4;
- VIDEO_SINGLETON::instance ()->gopTable[gopptr].headerSize = 0;
- VIDEO_SINGLETON::instance ()->gopTable[gopptr].size = 0;
- VIDEO_SINGLETON::instance ()->gopTable[gopptr].totalFrames = 0;
- VIDEO_SINGLETON::instance ()->gopTable[gopptr].previousFrames = gopptr ?
- (VIDEO_SINGLETON::instance ()->gopTable[gopptr - 1].totalFrames + VIDEO_SINGLETON::instance ()->gopTable[gopptr - 1].previousFrames) : 0;
-
- break;
- case 0x00: /* picture_start_code */
- if (VIDEO_SINGLETON::instance ()->gopTable[gopptr].headerSize == 0)
- {
- VIDEO_SINGLETON::instance ()->gopTable[gopptr].headerSize = fileptr - VIDEO_SINGLETON::instance ()->gopTable[gopptr].offset - 4;
- VIDEO_SINGLETON::instance ()->gopTable[gopptr].firstIoffset = fileptr - 4;
- }
- VIDEO_SINGLETON::instance ()->gopTable[gopptr].totalFrames ++;
- computePicSize;
- picptr = fileptr - 4;
- nextByte;
- nextByte;
- nb &= 0x38;
- if (nb == 0x08)
- {
- pictype = 'I';
- inpic = 1;
- }
- else if (nb == 0x10)
- {
- pictype = 'P';
- inpic = 1;
- }
- else if (nb == 0x18)
- {
- pictype = 'B';
- inpic = 1;
- }
- break;
- default:
-
- break;
- }
- state = 0;
- }
- else
- state = 0;
- }
-
- exit_phase2:
- for (shptr = 0; shptr<VIDEO_SINGLETON::instance ()->numS; shptr++)
- {
- VIDEO_SINGLETON::instance ()->maxS = max(VIDEO_SINGLETON::instance ()->maxS, VIDEO_SINGLETON::instance ()->systemHeader[shptr].size);
- VIDEO_SINGLETON::instance ()->minS = min(VIDEO_SINGLETON::instance ()->minS, VIDEO_SINGLETON::instance ()->systemHeader[shptr].size);
- }
- for (gopptr = 0; gopptr<VIDEO_SINGLETON::instance ()->numG; gopptr++)
- {
- VIDEO_SINGLETON::instance ()->maxG = max(VIDEO_SINGLETON::instance ()->maxG, VIDEO_SINGLETON::instance ()->gopTable[gopptr].headerSize);
- VIDEO_SINGLETON::instance ()->minG = min(VIDEO_SINGLETON::instance ()->minG, VIDEO_SINGLETON::instance ()->gopTable[gopptr].headerSize);
- }
- VIDEO_SINGLETON::instance ()->packetBufSize = VIDEO_SINGLETON::instance ()->maxS + VIDEO_SINGLETON::instance ()->maxG + max(VIDEO_SINGLETON::instance ()->maxI, max(VIDEO_SINGLETON::instance ()->maxP, VIDEO_SINGLETON::instance ()->maxB));
- VIDEO_SINGLETON::instance ()->packet = (VideoPacket *)malloc(sizeof(VideoMessage) + sizeof(VideoPacket) +
- VIDEO_SINGLETON::instance ()->packetBufSize);
- if (VIDEO_SINGLETON::instance ()->packet == NULL)
- {
- perror("VS error on malloc VIDEO_SINGLETON::instance ()->packet buffer");
- return 10;
- }
- VIDEO_SINGLETON::instance ()->packet = (VideoPacket *)((char *)VIDEO_SINGLETON::instance ()->packet + sizeof(VideoMessage));
- /*
- fprintf(stderr, "Pass 2 finished.\n");
- fprintf(stderr, "VIDEO_SINGLETON::instance ()->maxS-%d, VIDEO_SINGLETON::instance ()->maxG-%d, VIDEO_SINGLETON::instance ()->maxI-%d, VIDEO_SINGLETON::instance ()->maxP-%d, VIDEO_SINGLETON::instance ()->maxB-%d.\n", VIDEO_SINGLETON::instance ()->maxS, VIDEO_SINGLETON::instance ()->maxG, VIDEO_SINGLETON::instance ()->maxI, VIDEO_SINGLETON::instance ()->maxP, VIDEO_SINGLETON::instance ()->maxB);
- fprintf(stderr, "VIDEO_SINGLETON::instance ()->minS-%d, VIDEO_SINGLETON::instance ()->minG-%d, VIDEO_SINGLETON::instance ()->minI-%d, VIDEO_SINGLETON::instance ()->minP-%d, VIDEO_SINGLETON::instance ()->minB-%d.\n", VIDEO_SINGLETON::instance ()->minS, VIDEO_SINGLETON::instance ()->minG, VIDEO_SINGLETON::instance ()->minI, VIDEO_SINGLETON::instance ()->minP, VIDEO_SINGLETON::instance ()->minB);
- */
- /*
- {
- int i;
-
- fprintf(stderr, "id: offset size -- system header table:\n");
- for (i=0; i<VIDEO_SINGLETON::instance ()->numS; i++)
- fprintf(stderr, "%-3d %-9u %d\n", i, VIDEO_SINGLETON::instance ()->systemHeader[i].offset, VIDEO_SINGLETON::instance ()->systemHeader[i].size);
- fprintf(stderr,
- "id: header offset hdsize totSize frames preframs Ioffset Isize -- GOP\n");
- for (i=0; i<VIDEO_SINGLETON::instance ()->numG; i++)
- {
- fprintf(stderr, "%-4d %-8d %-8u %-8d %-8d %-8d %-8d %-8u %d\n",
- i,
- VIDEO_SINGLETON::instance ()->gopTable[i].VIDEO_SINGLETON::instance ()->systemHeader,
- VIDEO_SINGLETON::instance ()->gopTable[i].offset,
- VIDEO_SINGLETON::instance ()->gopTable[i].headerSize,
- VIDEO_SINGLETON::instance ()->gopTable[i].size,
- VIDEO_SINGLETON::instance ()->gopTable[i].totalFrames,
- VIDEO_SINGLETON::instance ()->gopTable[i].previousFrames,
- VIDEO_SINGLETON::instance ()->gopTable[i].firstIoffset,
- VIDEO_SINGLETON::instance ()->frameTable[VIDEO_SINGLETON::instance ()->gopTable[i].previousFrames].size
- );
- }
-
- fprintf(stderr, "\nframe information:");
- for (i=0; i<VIDEO_SINGLETON::instance ()->numF; i++)
- fprintf(stderr, "%c%c%-8d", (i%10 ? '\0' : '\n'), VIDEO_SINGLETON::instance ()->frameTable[i].type, VIDEO_SINGLETON::instance ()->frameTable[i].size);
- fprintf(stderr, "\n");
-
- }
- */
- fseek(VIDEO_SINGLETON::instance ()->fp, VIDEO_SINGLETON::instance ()->systemHeader[0].offset+4, 0);
- nextByte;
- VIDEO_SINGLETON::instance ()->horizontalSize = ((int)nb <<4) & 0xff0;
- nextByte;
- VIDEO_SINGLETON::instance ()->horizontalSize |= (nb >>4) & 0x0f;
- VIDEO_SINGLETON::instance ()->verticalSize = ((int)nb <<8) & 0xf00;
- nextByte;
- VIDEO_SINGLETON::instance ()->verticalSize |= (int)nb & 0xff;
- nextByte;
- VIDEO_SINGLETON::instance ()->pelAspectRatio = ((int)nb >> 4) & 0x0f;
- VIDEO_SINGLETON::instance ()->pictureRate = (int)nb & 0x0f;
- nextByte;
- nextByte;
- nextByte;
- VIDEO_SINGLETON::instance ()->vbvBufferSize = ((int)nb << 5) & 0x3e0;
- nextByte;
- VIDEO_SINGLETON::instance ()->vbvBufferSize |= ((int)nb >>3) & 0x1f;
- /*
- fprintf(stderr, "SysHeader info: hsize-%d, vsize-%d, pelAspect-%d, rate-%d, vbv-%d.\n",
- VIDEO_SINGLETON::instance ()->horizontalSize, VIDEO_SINGLETON::instance ()->verticalSize, VIDEO_SINGLETON::instance ()->pelAspectRatio, VIDEO_SINGLETON::instance ()->pictureRate, VIDEO_SINGLETON::instance ()->vbvBufferSize);
- */
- WriteInfoToFile();
- }
-#if 0
- {
- int i, j = 20;
-
- for (i = VIDEO_SINGLETON::instance ()->numG - 1;; i --) {
- if (VIDEO_SINGLETON::instance ()->gopTable[i].offset < 4235260) {
- fprintf(stderr, "group %d: offset %ld\n", i, VIDEO_SINGLETON::instance ()->gopTable[i].offset);
- if (j -- == 0) break;
- }
- }
- /*
- for (i = 0; i < VIDEO_SINGLETON::instance ()->numG; i ++) {
- if (VIDEO_SINGLETON::instance ()->gopTable[i].previousFrames > 1800) {
- fprintf(stderr, "group %d: offset %ld pre-frames %d\n",
- i, VIDEO_SINGLETON::instance ()->gopTable[i].offset, VIDEO_SINGLETON::instance ()->gopTable[i].previousFrames);
- break;
- }
- }
- */
- }
-#endif
- {
- VIDEO_SINGLETON::instance ()->firstPatternSize = VIDEO_SINGLETON::instance ()->gopTable[0].totalFrames;
- VIDEO_SINGLETON::instance ()->firstSendPattern = (char *)malloc(VIDEO_SINGLETON::instance ()->firstPatternSize);
- if (VIDEO_SINGLETON::instance ()->firstSendPattern == NULL)
- {
- fprintf(stderr, "VS failed to allocate VIDEO_SINGLETON::instance ()->firstVIDEO_SINGLETON::instance ()->SendVIDEO_SINGLETON::Instance ()->Pattern for %d frames",
- VIDEO_SINGLETON::instance ()->firstPatternSize);
- perror("");
- return 11;
- }
- }
- VIDEO_SINGLETON::instance ()->firstGopFrames = VIDEO_SINGLETON::instance ()->gopTable[0].totalFrames;
- return 0;
-}
-
- int INITvideo(void)
-{
- INITvideoPara para;
- int failureType = 0;
- int result;
- /*
- fprintf(stderr, "VS about to read Para.\n");
- */
- result = CmdRead((char *)&para, sizeof(para));
- if (result != 0)
- return result;
-#ifdef NeedByteOrderConversion
- para.sn = ntohl(para.sn);
- para.version = ntohl(para.version);
- para.nameLength = ntohl(para.nameLength);
-#endif
- if (para.nameLength>0)
- {
- result = CmdRead(VIDEO_SINGLETON::instance ()->videoFile, para.nameLength);
- if (result != 0)
- return result;
- }
- if (Mpeg_Global::session_num > Mpeg_Global::session_limit || para.version != VERSION) {
- char errmsg[128];
- VIDEO_SINGLETON::instance ()->cmd = CmdFAIL;
- CmdWrite((char *)&VIDEO_SINGLETON::instance ()->cmd, 1);
- if (Mpeg_Global::session_num > Mpeg_Global::session_limit) {
- sprintf(errmsg,
- "Too many sessions being serviced, please try again later.\n");
- }
- else {
- sprintf(errmsg, "Version # not match, VS %d.%02d, Client %d.%02d",
- VERSION / 100, VERSION % 100,
- para.version / 100, para.version % 100);
- }
- write_string(VIDEO_SINGLETON::instance ()->serviceSocket, errmsg);
- exit(0);
- }
- VIDEO_SINGLETON::instance ()->cmdsn = para.sn;
- /*
- fprintf(stderr, "MPEG file %s got.\n", VIDEO_SINGLETON::instance ()->videoFile);
- */
- VIDEO_SINGLETON::instance ()->videoFile[para.nameLength] = 0;
-
- if (!strncasecmp("LiveVideo", VIDEO_SINGLETON::instance ()->videoFile, 9)) {
- if (OpenLiveVideo(&VIDEO_SINGLETON::instance ()->video_format, &VIDEO_SINGLETON::instance ()->horizontalSize,
- &VIDEO_SINGLETON::instance ()->verticalSize, &VIDEO_SINGLETON::instance ()->averageFrameSize,
- &VIDEO_SINGLETON::instance ()->fps, &VIDEO_SINGLETON::instance ()->pelAspectRatio) == -1) {
- failureType = 100;
- goto failure;
- }
- if (VIDEO_SINGLETON::instance ()->video_format == VIDEO_MPEG2) {
- failureType = 101;
- goto failure;
- }
- VIDEO_SINGLETON::instance ()->live_source = 1;
-
- VIDEO_SINGLETON::instance ()->fileSize =0x7fffffff;
- VIDEO_SINGLETON::instance ()->maxS = VIDEO_SINGLETON::instance ()->maxG = VIDEO_SINGLETON::instance ()->maxI = VIDEO_SINGLETON::instance ()->maxP = VIDEO_SINGLETON::instance ()->maxB = VIDEO_SINGLETON::instance ()->minS = VIDEO_SINGLETON::instance ()->minG = VIDEO_SINGLETON::instance ()->minI = VIDEO_SINGLETON::instance ()->minP = VIDEO_SINGLETON::instance ()->minB = 1;
- VIDEO_SINGLETON::instance ()->numS = VIDEO_SINGLETON::instance ()->numG = VIDEO_SINGLETON::instance ()->numF = VIDEO_SINGLETON::instance ()->numI = 0x7fffffff;
- VIDEO_SINGLETON::instance ()->numP = VIDEO_SINGLETON::instance ()->numB = 0;
- VIDEO_SINGLETON::instance ()->vbvBufferSize = 1;
- VIDEO_SINGLETON::instance ()->firstGopFrames = 1;
- VIDEO_SINGLETON::instance ()->patternSize = 1;
- VIDEO_SINGLETON::instance ()->pattern[0] = 'I';
- VIDEO_SINGLETON::instance ()->pattern[1] = 0;
- VIDEO_SINGLETON::instance ()->packetBufSize = VIDEO_SINGLETON::instance ()->verticalSize * VIDEO_SINGLETON::instance ()->horizontalSize * 3;
- VIDEO_SINGLETON::instance ()->packet = (VideoPacket *)malloc(sizeof(VideoMessage) + sizeof(VideoPacket) +
- VIDEO_SINGLETON::instance ()->packetBufSize);
- if (VIDEO_SINGLETON::instance ()->packet == NULL)
- {
- perror("Error: VS error on malloc VIDEO_SINGLETON::instance ()->packet buffer");
- exit(1);
- }
- VIDEO_SINGLETON::instance ()->packet = (VideoPacket *)((char *)VIDEO_SINGLETON::instance ()->packet + sizeof(VideoMessage));
-
- }
- else {
- static double pictureRateTable[] = {23.976, 24, 25, 29.97, 30, 50, 59.94, 60};
-
- VIDEO_SINGLETON::instance ()->video_format = VIDEO_MPEG1;
- failureType = init_MPEG1_video_file();
- if (failureType) goto failure;
- VIDEO_SINGLETON::instance ()->fps = pictureRateTable[VIDEO_SINGLETON::instance ()->pictureRate - 1];
- }
-
- {
- INITvideoReply reply;
-
- reply.totalHeaders = htonl(VIDEO_SINGLETON::instance ()->numS);
- reply.totalGroups = htonl(VIDEO_SINGLETON::instance ()->numG);
- reply.totalFrames = htonl(VIDEO_SINGLETON::instance ()->numF);
- reply.sizeIFrame = htonl(VIDEO_SINGLETON::instance ()->maxI);
- reply.sizePFrame = htonl(VIDEO_SINGLETON::instance ()->maxP);
- reply.sizeBFrame = htonl(VIDEO_SINGLETON::instance ()->maxB);
- reply.sizeSystemHeader = htonl(VIDEO_SINGLETON::instance ()->maxS);
- reply.sizeGop = htonl(VIDEO_SINGLETON::instance ()->maxG);
- reply.averageFrameSize = htonl(VIDEO_SINGLETON::instance ()->averageFrameSize);
- reply.verticalSize = htonl(VIDEO_SINGLETON::instance ()->verticalSize);
- reply.horizontalSize = htonl(VIDEO_SINGLETON::instance ()->horizontalSize);
- reply.pelAspectRatio = htonl(VIDEO_SINGLETON::instance ()->pelAspectRatio);
- reply.pictureRate1000 = htonl((int)(VIDEO_SINGLETON::instance ()->fps * 1000));
- reply.vbvBufferSize = htonl(VIDEO_SINGLETON::instance ()->vbvBufferSize);
- reply.firstGopFrames = htonl(VIDEO_SINGLETON::instance ()->firstGopFrames);
- reply.patternSize = htonl(VIDEO_SINGLETON::instance ()->patternSize);
- strncpy(reply.pattern, VIDEO_SINGLETON::instance ()->pattern, PATTERN_SIZE);
-
- reply.live = htonl(VIDEO_SINGLETON::instance ()->live_source);
- reply.format = htonl(VIDEO_SINGLETON::instance ()->video_format);
-
- CmdWrite((char *)&VIDEO_SINGLETON::instance ()->cmd, 1);
-
- CmdWrite((char *)&reply, sizeof(reply));
-
- /* write the first SH, GOP and IFrame to VIDEO_SINGLETON::instance ()->serviceSocket (TCP),
- using code for SendPacket() */
- {
- int tmpSocket = VIDEO_SINGLETON::instance ()->videoSocket;
-
- if (VIDEO_SINGLETON::instance ()->live_source) StartPlayLiveVideo();
-
- VIDEO_SINGLETON::instance ()->videoSocket = VIDEO_SINGLETON::instance ()->serviceSocket;
-
- if (VIDEO_SINGLETON::instance ()->live_source) {
- int frame = 0;
- SendPicture(&frame);
- }
- else if (VIDEO_SINGLETON::instance ()->video_format == VIDEO_MPEG1) {
- SendPacket(1, 0, 0, 0);
- }
- else {
- fprintf(stderr, "VS: VIDEO_SINGLETON::instance ()->video_format %d not supported.\n",
- VIDEO_SINGLETON::instance ()->video_format);
- }
- VIDEO_SINGLETON::instance ()->videoSocket = tmpSocket;
-
- if (VIDEO_SINGLETON::instance ()->live_source) StopPlayLiveVideo();
- }
-
- return 0;
-
- }
- failure:
- {
- char * msg;
- char errmsg[64];
- VIDEO_SINGLETON::instance ()->cmd = CmdFAIL;
- sprintf(errmsg, "VS failed to alloc internal buf (type %d)", failureType);
- CmdWrite((char *)&VIDEO_SINGLETON::instance ()->cmd, 1);
- msg = failureType == 1 ? "not a complete MPEG stream" :
- failureType == 2 ? "can't open MPEG file" :
- failureType == 3 ? "MPEG file is not seekable" :
- failureType == 4 ? "not an MPEG stream" :
- failureType == 5 ?
- "too many frames in MPEG file, need change MAX_FRAMES and recompile VS" :
- failureType == 100 ? "failed to connect to live video source" :
- failureType == 101 ? "live MPEG2 not supported" :
- errmsg;
- write_string(VIDEO_SINGLETON::instance ()->serviceSocket, msg);
- exit(0);
- }
-}
-
-#define CheckGroupRange(pnextGroup) \
-{ if ((pnextGroup) < 0 || (pnextGroup) >= VIDEO_SINGLETON::instance ()->numG) \
- { fprintf(stderr, "VS: %d.VIDEO_SINGLETON::instance ()->nextGroup(%d) out of range (%d).\n", VIDEO_SINGLETON::instance ()->cmd, (pnextGroup), VIDEO_SINGLETON::instance ()->numG); \
- return 0; } }
-
-#define CheckFrameRange(pnextFrame) \
-{ if ((pnextFrame) < 0 || (pnextFrame) >= VIDEO_SINGLETON::instance ()->numF) \
- { fprintf(stderr, "VS: %d.VIDEO_SINGLETON::instance ()->nextFrame(%d) out of range (%d).\n", VIDEO_SINGLETON::instance ()->cmd, (pnextFrame), VIDEO_SINGLETON::instance ()->numF); \
- return 0; } }
-
-int FrameToGroup(int * frame)
-{
- int f = * frame;
- int i = 0;
- while (i < VIDEO_SINGLETON::instance ()->numG && VIDEO_SINGLETON::instance ()->gopTable[i].previousFrames <= f) i++;
- i --;
- * frame = f - VIDEO_SINGLETON::instance ()->gopTable[i].previousFrames;
- return i;
-}
-
-static int POSITIONvideo()
-{
- int result;
- POSITIONpara para;
- /*
- fprintf(stderr, "POSITION . . .\n");
- */
- result = CmdRead((char *)&para, sizeof(para));
- if (result != 0)
- return result;
-
- if (VIDEO_SINGLETON::instance ()->live_source) return 0;
-
-#ifdef NeedByteOrderConversion
- para.VIDEO_SINGLETON::instance ()->nextGroup = ntohl(para.VIDEO_SINGLETON::instance ()->nextGroup);
- para.sn = ntohl(para.sn);
-#endif
-
- CheckGroupRange(para.nextGroup);
- VIDEO_SINGLETON::instance ()->cmdsn = para.sn;
- result = SendPacket(VIDEO_SINGLETON::instance ()->numS>1 || para.nextGroup == 0, para.nextGroup, 0, 0);
- return result;
-}
-
-static int STEPvideo()
-{
- int group;
- STEPpara para;
- int tag = 0;
- int result;
-
- result = CmdRead((char *)&para, sizeof(para));
- if (result != 0)
- return result;
-#ifdef NeedByteOrderConversion
- para.sn = ntohl(para.sn);
- para.VIDEO_SINGLETON::instance ()->nextFrame = ntohl(para.VIDEO_SINGLETON::instance ()->nextFrame);
-#endif
-
- VIDEO_SINGLETON::instance ()->cmdsn = para.sn;
-
- if (!VIDEO_SINGLETON::instance ()->live_source) {
- if (para.nextFrame >= VIDEO_SINGLETON::instance ()->numF) /* send SEQ_END */
- {
- tag = 1;
- para.nextFrame --;
- }
- /*
- fprintf(stderr, "STEP . . .frame-%d\n", para.VIDEO_SINGLETON::instance ()->nextFrame);
- */
- CheckFrameRange(para.nextFrame);
- group = FrameToGroup(&para.nextFrame);
- if (VIDEO_SINGLETON::instance ()->precmd != CmdSTEP && !tag ) {
- result = SendReferences(group, para.nextFrame);
- if (result < 0 )
- return result;
- }
- }
- if (VIDEO_SINGLETON::instance ()->live_source) StartPlayLiveVideo();
-
- if (VIDEO_SINGLETON::instance ()->live_source) {
- SendPicture(&para.nextFrame);
- }
- else if (VIDEO_SINGLETON::instance ()->video_format == VIDEO_MPEG1) {
- SendPacket(VIDEO_SINGLETON::instance ()->numS>1, group, tag ? VIDEO_SINGLETON::instance ()->numF : para.nextFrame, 0);
- }
- else {
- fprintf(stderr, "VS: wierd1\n");
- }
-
- if (VIDEO_SINGLETON::instance ()->live_source) StopPlayLiveVideo();
- return 0;
-}
-
-static int timerHeader, timerGroup, timerFrame;
-static int timerOn = 0;
-static int timerAdjust = 0;
-static int preTimerVal = 0;
-static void StopTimer(void);
-static void TimerSpeed(void);
-static void TimerProcessing(void);
-
-static void timerHandler(int sig)
-{
- int val2, val3;
- int usec = VIDEO_SINGLETON::instance ()->currentUPF + VIDEO_SINGLETON::instance ()->addedUPF;
-
- if (Mpeg_Global::drift_ppm) {
- usec -= (int)((double)usec * (double)Mpeg_Global::drift_ppm / 1000000.0);
- }
-
- if (timerAdjust > 1)
- usec = (int)(((double)usec * (double)(SPEEDUP_INV_SCALE - 1)) /
- (double)SPEEDUP_INV_SCALE);
- val3 = get_duration(preTimerVal, (val2 = get_usec()));
- /*
- if (val3 >= usec<< 1))
- fprintf(stderr, "Slower: %d out of VIDEO_SINGLETON::instance ()->currentUPF %d.\n",
- val3, usec);
- else
- fprintf(stderr, "+\n");
- */
- preTimerVal = val2;
- if (val3 < 0 || val3 > 100000000)
- val3 = usec;
- val2 = (val3 + (usec>>1)) / usec;
- if (val2 < 0) val2 = 0;
- if (val2) {
- TimerProcessing();
- val2 --;
- }
- VIDEO_SINGLETON::instance ()->addedSignals += val2;
-
- if (VIDEO_SINGLETON::instance ()->addedSignals) {
- val2 = timerAdjust;
- if (timerAdjust < MAX_TIMER_ADJUST) {
- timerAdjust += VIDEO_SINGLETON::instance ()->addedSignals * SPEEDUP_INV_SCALE;
- if (val2 < SPEEDUP_INV_SCALE) {
- TimerSpeed();
- }
- }
- else {
- /*
- fprintf(stderr, "VS timerAdjust %d, VIDEO_SINGLETON::instance ()->addedSignals %d, timerFrame %d\n",
- timerAdjust, VIDEO_SINGLETON::instance ()->addedSignals, timerFrame);
- */
- for (val3 = 0; val3 < VIDEO_SINGLETON::instance ()->addedSignals; val3 ++)
- TimerProcessing();
- }
- VIDEO_SINGLETON::instance ()->addedSignals = 0;
- }
-}
-
-static void TimerProcessing(void)
-{
-/*
- fprintf(stderr, "VS: timerHandler...\n");
-*/
- if (!timerOn) {
- return;
- }
- if (timerAdjust < 0)
- {
- timerAdjust += SPEEDUP_INV_SCALE;
- return;
- }
- if (timerAdjust >0)
- {
- if ((--timerAdjust) == 0)
- TimerSpeed();
- }
- if (VIDEO_SINGLETON::instance ()->cmd == CmdPLAY)
- {
- if (timerGroup == VIDEO_SINGLETON::instance ()->numG - 1 && timerFrame >= VIDEO_SINGLETON::instance ()->gopTable[timerGroup].totalFrames - 1)
- {
- timerFrame ++; /* force sending of END_SEQ when PLAY VIDEO_SINGLETON::instance ()->cmd */
- StopTimer();
- return;
- }
- else
- {
- timerFrame ++;
- if (timerFrame >= VIDEO_SINGLETON::instance ()->gopTable[timerGroup].totalFrames)
- {
- timerGroup ++;
- timerFrame = 0;
- timerHeader = VIDEO_SINGLETON::instance ()->gopTable[timerGroup].systemHeader;
- }
- }
- }
- else {
- if (VIDEO_SINGLETON::instance ()->cmd == CmdFF) {
- if (timerGroup == VIDEO_SINGLETON::instance ()->numG - 1) {
- StopTimer();
- return;
- }
- timerGroup ++;
- timerHeader = VIDEO_SINGLETON::instance ()->gopTable[timerGroup].systemHeader;
- }
- else {
- if (timerGroup == 0) {
- StopTimer();
- return;
- }
- timerGroup --;
- timerHeader = VIDEO_SINGLETON::instance ()->gopTable[timerGroup].systemHeader;
- }
- }
-}
-
-static void StartTimer(void)
-{
- VIDEO_SINGLETON::instance ()->addedUPF = 0;
- VIDEO_SINGLETON::instance ()->addedSignals = 0;
- timerAdjust = (VIDEO_SINGLETON::instance ()->VStimeAdvance * SPEEDUP_INV_SCALE) / VIDEO_SINGLETON::instance ()->currentUPF;
- /*
- SFprintf(stderr, "VS StartTimer(): fast-start frames %d\n",
- timerAdjust / SPEEDUP_INV_SCALE);
- */
- TimerSpeed();
- setsignal(SIGALRM, timerHandler);
- timerOn = 1;
- preTimerVal = get_usec();
- /*
- fprintf(stderr, "VS: timer started at %d upf.\n", VIDEO_SINGLETON::instance ()->currentUPF + VIDEO_SINGLETON::instance ()->addedUPF);
- */
-}
-
-static void TimerSpeed(void)
-{
- struct itimerval val;
- int usec = VIDEO_SINGLETON::instance ()->currentUPF + VIDEO_SINGLETON::instance ()->addedUPF;
- if (Mpeg_Global::drift_ppm) {
- /*
- int drift = (double)usec * (double)Mpeg_Global::drift_ppm / 1000000.0;
- SFprintf(stderr, "Mpeg_Global::drift_ppm %d, usec %d, drift %d, new usec %d\n",
- Mpeg_Global::drift_ppm, usec, drift, usec - drift);
- */
- usec -= (int)((double)usec * (double)Mpeg_Global::drift_ppm / 1000000.0);
- }
- if (timerAdjust > 1)
- usec = (int)(((double)usec * (double)(SPEEDUP_INV_SCALE - 1)) /
- (double)SPEEDUP_INV_SCALE);
- val.it_interval.tv_sec = val.it_value.tv_sec = usec / 1000000;
- val.it_interval.tv_usec = val.it_value.tv_usec = usec % 1000000;
- setitimer(ITIMER_REAL, &val, NULL);
- /*
- SFprintf(stderr,
- "VS TimerSpeed() at %s speed, timerAdjust %d VIDEO_SINGLETON::instance ()->addedSignals %d.\n",
- (timerAdjust > 1) ? "higher" : "normal", timerAdjust, VIDEO_SINGLETON::instance ()->addedSignals);
- */
-}
-
-static void StopTimer()
-{
- struct itimerval val;
- setsignal(SIGALRM, SIG_IGN);
- val.it_interval.tv_sec = val.it_value.tv_sec = 0;
- val.it_interval.tv_usec = val.it_value.tv_usec = 0;
- setitimer(ITIMER_REAL, &val, NULL);
- timerOn = 0;
- /*
- fprintf(stderr, "VS: timer stopped.\n");
- */
-}
-
-void GetFeedBack()
-{
- VideoFeedBackPara para;
- struct itimerval val;
- int timerUsec;
-
- if (FBread((char *)&para, sizeof(para)) == -1 ||
- ntohl(para.cmdsn) != VIDEO_SINGLETON::instance ()->cmdsn) {
- /*
- SFprintf(stderr, "VS warning: a FB VIDEO_SINGLETON::instance ()->packet discarded.\n");
- */
- return;
- }
-#ifdef NeedByteOrderConversion
- para.VIDEO_SINGLETON::instance ()->needHeader = ntohl(para.VIDEO_SINGLETON::instance ()->needHeader);
- para.addUsecPerFrame = ntohl(para.addUsecPerFrame);
- para.addFrames = ntohl(para.addFrames);
- para.VIDEO_SINGLETON::instance ()->sendVIDEO_SINGLETON::Instance ()->PatternGops = ntohl(para.VIDEO_SINGLETON::instance ()->sendVIDEO_SINGLETON::Instance ()->PatternGops);
- para.VIDEO_SINGLETON::instance ()->frameRateLimit1000 = ntohl(para.VIDEO_SINGLETON::instance ()->frameRateLimit1000);
-#endif
- VIDEO_SINGLETON::instance ()->frameRateLimit = para.frameRateLimit1000 / 1000.0;
- VIDEO_SINGLETON::instance ()->sendPatternGops = para.sendPatternGops;
-
- if (!timerOn) return;
-
- VIDEO_SINGLETON::instance ()->needHeader = para.needHeader;
- memcpy(VIDEO_SINGLETON::instance ()->sendPattern, para.sendPattern, PATTERN_SIZE);
- if (para.addFrames <= 0 || timerAdjust < MAX_TIMER_ADJUST)
- {
- timerAdjust += para.addFrames * SPEEDUP_INV_SCALE;
- TimerSpeed();
- }
- else /* drastic compensation for big gap */
- VIDEO_SINGLETON::instance ()->addedSignals += para.addFrames;
- if (para.addUsecPerFrame) {
- VIDEO_SINGLETON::instance ()->addedUPF += para.addUsecPerFrame;
- TimerSpeed();
- }
- /*
- SFprintf(stderr, "VS fb: addf %d, addupf %d\n",
- para.addFrames, para.addUsecPerFrame);
- */
-}
-
-static int FastVideoPlay(void)
-{
- int result;
- FFpara para;
- int preGroup = -1;
- int preHeader = -1;
- int nfds = (VIDEO_SINGLETON::instance ()->serviceSocket > VIDEO_SINGLETON::instance ()->videoSocket ? VIDEO_SINGLETON::instance ()->serviceSocket : VIDEO_SINGLETON::instance ()->videoSocket) + 1;
-
- result = CmdRead((char *)&para, sizeof(para));
- if (result != 0)
- return result;
-#ifdef NeedByteOrderConversion
- para.sn = ntohl(para.sn);
- para.VIDEO_SINGLETON::instance ()->nextGroup = ntohl(para.VIDEO_SINGLETON::instance ()->nextGroup);
- para.usecPerFrame = ntohl(para.usecPerFrame);
- para.framesPerSecond = ntohl(para.framesPerSecond);
- para.VIDEO_SINGLETON::instance ()->VStimeAdvance = ntohl(para.VIDEO_SINGLETON::instance ()->VStimeAdvance);
-#endif
-
- if (VIDEO_SINGLETON::instance ()->live_source) return 0;
-
- VIDEO_SINGLETON::instance ()->VStimeAdvance = para.VStimeAdvance;
- /*
- fprintf(stderr, "VIDEO_SINGLETON::instance ()->VStimeAdvance from client: %d\n", VIDEO_SINGLETON::instance ()->VStimeAdvance);
- */
- CheckGroupRange(para.nextGroup);
- VIDEO_SINGLETON::instance ()->cmdsn = para.sn;
- timerGroup = para.nextGroup;
- timerFrame = 0;
- timerHeader = VIDEO_SINGLETON::instance ()->gopTable[timerGroup].systemHeader;
- VIDEO_SINGLETON::instance ()->currentUPF = para.usecPerFrame;
- StartTimer();
-
- for (;;)
- {
- struct fd_set read_mask;
-/*
- fprintf(stderr, "VS: FF/FB - a loop begines. . .\n");
-*/
- if (preGroup != timerGroup)
- {
- SendPacket(preHeader != timerHeader, timerGroup, 0,
- para.usecPerFrame * VIDEO_SINGLETON::instance ()->patternSize >> 2);
- preHeader = timerHeader;
- preGroup = timerGroup;
- }
-
- FD_ZERO(&read_mask);
- FD_SET(VIDEO_SINGLETON::instance ()->serviceSocket, &read_mask);
- FD_SET(VIDEO_SINGLETON::instance ()->videoSocket, &read_mask);
-#ifdef _HPUX_SOURCE
- if (select(nfds, (int *)&read_mask, NULL, NULL, NULL) == -1)
-#else
- if (select(nfds, &read_mask, NULL, NULL, NULL) == -1)
-#endif
- {
- if (errno == EINTR)
- {
- ACE_DEBUG ((LM_DEBUG,
- "PLAYVIDEO:select EINTR signal \n"));
- continue;
- }
- perror("Error - VS select between service and video sockets");
- exit(1);
-
- }
- if (FD_ISSET(VIDEO_SINGLETON::instance ()->serviceSocket, &read_mask)) /* stop */
- {
- result = CmdRead((char *)&VIDEO_SINGLETON::instance ()->cmd, 1);
- if (result != 0)
- return result;
- if (VIDEO_SINGLETON::instance ()->cmd == CmdCLOSE) {
- exit(0);
- }
- else if (VIDEO_SINGLETON::instance ()->cmd != CmdSTOP) {
- fprintf(stderr, "VS error: VIDEO_SINGLETON::instance ()->cmd=%d while STOP is expected.\n", VIDEO_SINGLETON::instance ()->cmd);
- VIDEO_SINGLETON::instance ()->normalExit = 0;
- exit(1);
- }
- result = CmdRead((char *)&VIDEO_SINGLETON::instance ()->cmdsn, sizeof(int));
- if (result != 0 )
- return result;
-#ifdef NeedByteOrderConversion
- VIDEO_SINGLETON::instance ()->cmdsn = ntohl(VIDEO_SINGLETON::instance ()->cmdsn);
-#endif
- StopTimer();
- break;
- }
- if (FD_ISSET(VIDEO_SINGLETON::instance ()->videoSocket, &read_mask)) /* feedback, speed adjustment */
- {
- ACE_DEBUG((LM_DEBUG,
- "FastVideo Play:Data socket selected"));
- GetFeedBack();
- }
- ACE_DEBUG((LM_DEBUG,
- "none of the sockets selected \n"));
- }
- return 0;
-}
-
-static void FFvideo()
-{
- /*
- fprintf(stderr, "FF . . .\n");
- */
- FastVideoPlay();
-}
-
-static void FBvideo()
-{
- /*
- fprintf(stderr, "FB . . . \n");
- */
- FastVideoPlay();
-}
-
-void ComputeFirstSendPattern(float limit)
-{
- char * buf = VIDEO_SINGLETON::instance ()->firstSendPattern;
- int len = VIDEO_SINGLETON::instance ()->firstPatternSize;
- char * pat = (char *)malloc(len);
- int f;
-
- if (pat == NULL) {
- fprintf(stderr, "VS error on allocating %d bytes for computing first SP", len);
- perror("");
- exit(1);
- }
- for (f = 0; f < len; f ++) {
- pat[f] = VIDEO_SINGLETON::instance ()->frameTable[f].type;
- }
- memset(buf, 0, len);
-
- if (limit <= 0)
- limit = 1.0;
-
- f = (int)((double)len *
- ((double)limit / (1000000.0 / (double)VIDEO_SINGLETON::instance ()->currentUPF)) + 0.5);
- /* rounded to integer, instead of truncated */
- if (f >= len)
- f = len;
- else if (f <= 1)
- f = 1;
-
- ComputeSendPattern(pat, buf, len, f);
-
- /*
- f = len - f;
- fprintf(stderr, "VIDEO_SINGLETON::instance ()->FirstVIDEO_SINGLETON::instance ()->SendVIDEO_SINGLETON::Instance ()->Pattern (%d frames dropped): ", f);
- {
- int i;
- for (i = 0; i < len; i ++)
- fputc(buf[i] ? pat[i] : '-', stderr);
- }
- fputc('\n', stderr);
- */
- free(pat);
-}
-
- int PLAYliveVideo(PLAYpara * para)
-{
- int doscale;
- int count;
- int first_frame;
- int frame = para->nextFrame;
- int nfds = (VIDEO_SINGLETON::instance ()->serviceSocket > VIDEO_SINGLETON::instance ()->videoSocket ? VIDEO_SINGLETON::instance ()->serviceSocket : VIDEO_SINGLETON::instance ()->videoSocket) + 1;
- struct fd_set read_mask;
- struct timeval tval = {0, 0};
- double ratio;
- int result;
-
- VIDEO_SINGLETON::instance ()->currentUPF = (int)(1000000.0 / VIDEO_SINGLETON::instance ()->fps); /* ignore para.usecPerFrame */
- if (VIDEO_SINGLETON::instance ()->frameRateLimit < VIDEO_SINGLETON::instance ()->fps) {
- doscale = 1;
- ratio = min(VIDEO_SINGLETON::instance ()->frameRateLimit, VIDEO_SINGLETON::instance ()->fps) / VIDEO_SINGLETON::instance ()->fps;
- first_frame = frame;
- count = 0;
- /*
- fprintf(stderr, "doscale %d, VIDEO_SINGLETON::instance ()->frameRateLimit %5.2f, VIDEO_SINGLETON::instance ()->fps %5.2f, ratio %5.2f\n",
- doscale, VIDEO_SINGLETON::instance ()->frameRateLimit, VIDEO_SINGLETON::instance ()->fps, ratio);
- */
- }
- else doscale = 0;
- StartPlayLiveVideo();
-
- for (;;) {
-
- if (doscale) {
- for (;;) {
- if ((int)((frame - first_frame) * ratio + 0.5) < count) frame ++;
- else break;
- }
- count ++;
- }
- SendPicture(&frame);
- frame ++;
-
- FD_ZERO(&read_mask);
- FD_SET(VIDEO_SINGLETON::instance ()->serviceSocket, &read_mask);
- FD_SET(VIDEO_SINGLETON::instance ()->videoSocket, &read_mask);
-#ifdef _HPUX_SOURCE
- if (select(nfds, (int *)&read_mask, NULL, NULL, &tval) == -1)
-#else
- if (select(nfds, &read_mask, NULL, NULL, &tval) == -1)
-#endif
- {
- if (errno == EINTR)
- continue;
- perror("Error - VS select between service and video sockets");
- StopPlayLiveVideo();
- exit(1);
-
- }
- if (FD_ISSET(VIDEO_SINGLETON::instance ()->serviceSocket, &read_mask)) /* stop */
- {
- unsigned char tmp;
- result = CmdRead((char *)&tmp, 1);
- if (result != 0)
- return result;
- if (tmp == CmdCLOSE) {
- StopPlayLiveVideo();
- exit(0);
- }
- else if (tmp == CmdSTOP) {
- VIDEO_SINGLETON::instance ()->cmd = tmp;
- /*
- fprintf(stderr, "VS: VIDEO_SINGLETON::Instance ()->CmdSTOP. . .\n");
- */
- result = CmdRead((char *)&VIDEO_SINGLETON::instance ()->cmdsn, sizeof(int));
- if (result != 0)
- return result;
-#ifdef NeedByteOrderConversion
- VIDEO_SINGLETON::instance ()->cmdsn = ntohl(VIDEO_SINGLETON::instance ()->cmdsn);
-#endif
- StopPlayLiveVideo();
- break;
- }
- else if (tmp == CmdSPEED)
- {
- SPEEDpara para;
- /*
- fprintf(stderr, "VS: VIDEO_SINGLETON::Instance ()->CmdSPEED. . .\n");
- */
- result = CmdRead((char *)&para, sizeof(para));
- if (result != 0)
- return result;
- /* ignore this thing for live video */
- }
- else
- {
- fprintf(stderr, "VS error(live): VIDEO_SINGLETON::instance ()->cmd=%d while expect STOP/SPEED.\n", tmp);
- VIDEO_SINGLETON::instance ()->normalExit = 0;
- StopPlayLiveVideo();
- exit(1);
- }
- }
- if (FD_ISSET(VIDEO_SINGLETON::instance ()->videoSocket, &read_mask)) /* feedback, only for frame rate
- adjustment */
- {
- VideoFeedBackPara para;
- if (FBread((char *)&para, sizeof(para)) == -1 ||
- ntohl(para.cmdsn) != VIDEO_SINGLETON::instance ()->cmdsn) {
- /*
- SFprintf(stderr, "VS warning: a FB VIDEO_SINGLETON::instance ()->packet discarded.\n");
- */
- return 0;
- }
-#ifdef NeedByteOrderConversion
- para.VIDEO_SINGLETON::instance ()->frameRateLimit1000 = ntohl(para.VIDEO_SINGLETON::instance ()->frameRateLimit1000);
-#endif
- VIDEO_SINGLETON::instance ()->frameRateLimit = para.frameRateLimit1000 / 1000.0;
- if (VIDEO_SINGLETON::instance ()->frameRateLimit < VIDEO_SINGLETON::instance ()->fps) {
- doscale = 1;
- ratio = min(VIDEO_SINGLETON::instance ()->frameRateLimit, VIDEO_SINGLETON::instance ()->fps) / VIDEO_SINGLETON::instance ()->fps;
- first_frame = frame;
- count = 0;
- /*
- fprintf(stderr, "doscale %d, VIDEO_SINGLETON::instance ()->frameRateLimit %5.2f, VIDEO_SINGLETON::instance ()->fps %5.2f, ratio %5.2f\n",
- doscale, VIDEO_SINGLETON::instance ()->frameRateLimit, VIDEO_SINGLETON::instance ()->fps, ratio);
- */
- }
- else doscale = 0;
- }
- }
- return 0;
-}
-
-static int PLAYvideo()
-{
- PLAYpara para;
- int preGroup = -1;
- int preHeader = -1;
- int preFrame = -1;
- int result;
-
- fprintf(stderr, "PLAY . . .\n");
-
- result = CmdRead((char *)&para, sizeof(para));
- if (result != 0)
- return result;
-#ifdef NeedByteOrderConversion
- para.sn = ntohl(para.sn);
- para.VIDEO_SINGLETON::instance ()->nextFrame = ntohl(para.VIDEO_SINGLETON::instance ()->nextFrame);
- para.usecPerFrame = ntohl(para.usecPerFrame);
- para.framesPerSecond = ntohl(para.framesPerSecond);
- para.VIDEO_SINGLETON::instance ()->frameRateLimit1000 = ntohl(para.VIDEO_SINGLETON::instance ()->frameRateLimit1000);
- para.collectStat = ntohl(para.collectStat);
- para.VIDEO_SINGLETON::instance ()->sendVIDEO_SINGLETON::Instance ()->PatternGops = ntohl(para.VIDEO_SINGLETON::instance ()->sendVIDEO_SINGLETON::Instance ()->PatternGops);
- para.VIDEO_SINGLETON::instance ()->VStimeAdvance = ntohl(para.VIDEO_SINGLETON::instance ()->VStimeAdvance);
-#endif
-
- VIDEO_SINGLETON::instance ()->frameRateLimit = para.frameRateLimit1000 / 1000.0;
- VIDEO_SINGLETON::instance ()->cmdsn = para.sn;
- VIDEO_SINGLETON::instance ()->currentUPF = para.usecPerFrame;
- VIDEO_SINGLETON::instance ()->VStimeAdvance = para.VStimeAdvance;
-
- {
- int ts = htonl(get_usec());
- CmdWrite((char *)&ts, sizeof(int));
- }
-
- if (VIDEO_SINGLETON::instance ()->live_source || VIDEO_SINGLETON::instance ()->video_format != VIDEO_MPEG1) {
- if (VIDEO_SINGLETON::instance ()->live_source)
- PLAYliveVideo (&para);
- return 0;
- }
-
-
- fprintf(stderr, "VIDEO_SINGLETON::instance ()->VStimeAdvance from client: %d\n", VIDEO_SINGLETON::instance ()->VStimeAdvance);
-
- VIDEO_SINGLETON::instance ()->sendPatternGops = para.sendPatternGops;
- ComputeFirstSendPattern(VIDEO_SINGLETON::instance ()->frameRateLimit);
-#ifdef STAT
- if (para.collectStat)
- memset(VIDEO_SINGLETON::instance ()->framesSent, 0, (VIDEO_SINGLETON::instance ()->numF + 7)>>3);
-#endif
- CheckFrameRange(para.nextFrame);
- timerFrame = para.nextFrame;
- timerGroup = FrameToGroup(&timerFrame);
- timerHeader = VIDEO_SINGLETON::instance ()->gopTable[timerGroup].systemHeader;
- memcpy(VIDEO_SINGLETON::instance ()->sendPattern, para.sendPattern, PATTERN_SIZE);
- result = SendReferences(timerGroup, timerFrame);
- if (result < 0)
- return result;
- StartTimer();
-
- fprintf (stderr, "VS Going into the for loop\n");
- for (;;)
- {
- int curGroup = timerGroup;
- int curFrame = timerFrame;
- int curHeader = timerHeader;
- char * sp;
- struct fd_set read_mask;
- int nfds = (VIDEO_SINGLETON::instance ()->serviceSocket > VIDEO_SINGLETON::instance ()->videoSocket ? VIDEO_SINGLETON::instance ()->serviceSocket : VIDEO_SINGLETON::instance ()->videoSocket) + 1;
-
- if (preGroup != curGroup || curFrame != preFrame)
- {
- int sendStatus = -1;
- int frameStep = 1;
- if (curGroup == 0)
- {
- int i = curFrame + 1;
- while (i < VIDEO_SINGLETON::instance ()->firstPatternSize && !VIDEO_SINGLETON::instance ()->firstSendPattern[i])
- {
- frameStep ++;
- i++;
- }
- }
- else /* (curGroup > 0) */
- {
- int i = curFrame + 1;
- sp = VIDEO_SINGLETON::instance ()->sendPattern + ((curGroup - 1) % VIDEO_SINGLETON::instance ()->sendPatternGops) * VIDEO_SINGLETON::instance ()->patternSize;
- while (i < VIDEO_SINGLETON::instance ()->patternSize && !sp[i])
- {
- frameStep ++;
- i++;
- }
- }
- if (curGroup == 0)
- {
- if (VIDEO_SINGLETON::instance ()->firstSendPattern[curFrame])
- sendStatus = 0;
- else /* (!VIDEO_SINGLETON::instance ()->firstVIDEO_SINGLETON::instance ()->SendVIDEO_SINGLETON::Instance ()->Pattern[curFrame]) */
- {
- int i = curFrame - 1;
- while (i > 0 && !VIDEO_SINGLETON::instance ()->firstSendPattern[i])
- i--;
- if (i > preFrame)
- /* the frame (curGroup, i) hasn't been sent yet */
- {
- sendStatus = 0;
- curFrame = i;
- }
- else
- sendStatus = -1;
- }
- }
- else if (sp[curFrame]) /* curGroup > 0 */
- sendStatus = 0;
- else /* (!sp[curFrame]) */
- {
- int i = curFrame - 1;
- while (i > 0 && !sp[i])
- i--;
- if (curGroup == preGroup && i > preFrame)
- /* the frame (curGroup, i) hasn't been sent yet */
- {
- sendStatus = 0;
- curFrame = i;
- }
- else
- sendStatus = -1;
- }
- if (!sendStatus)
- {
- // Send the current video frame, calls send_to_network which
- // fragments and sends via blocking write .
- sendStatus = SendPacket(preHeader != curHeader,
- curGroup, curFrame,
- (VIDEO_SINGLETON::instance ()->currentUPF + VIDEO_SINGLETON::instance ()->addedUPF) * frameStep);
- if (!sendStatus)
- {
- preHeader = curHeader;
- preGroup = curGroup;
- preFrame = curFrame;
-#ifdef STAT
- if (para.collectStat)
- {
- int f = VIDEO_SINGLETON::instance ()->gopTable[curGroup].previousFrames + curFrame;
- VIDEO_SINGLETON::instance ()->framesSent[f>>3] |= (1 << (f % 8));
- }
-#endif
- }
- }
- }
-
- // Wait for a command on serviceSocket or Feedback on videoSocket (UDP)
- FD_ZERO(&read_mask);
- FD_SET(VIDEO_SINGLETON::instance ()->serviceSocket, &read_mask);
- FD_SET(VIDEO_SINGLETON::instance ()->videoSocket, &read_mask);
-#ifdef _HPUX_SOURCE
- if (select(nfds, (int *)&read_mask, NULL, NULL, NULL) == -1)
-#else
- if (select(nfds, &read_mask, NULL, NULL, NULL) == -1)
-#endif
- {
- if (errno == EINTR) /* select() interrupted */
- {
- ACE_DEBUG ((LM_DEBUG,
- "PLAYVideo:Select interrupted coninuing..\n"));
- continue;
- }
- perror("Error - VS select between service and video sockets");
- exit(1);
-
- }
- if (FD_ISSET(VIDEO_SINGLETON::instance ()->serviceSocket, &read_mask)) /* stop, speed change, loop swap */
- {
- ACE_DEBUG ((LM_DEBUG,
- "PLAYvideo:serviceSocket selected \n"));
- unsigned char tmp;
- result = CmdRead((char *)&tmp, 1);
- if (result != 0)
- return result;
-
- if (tmp == CmdCLOSE) {
- exit(0);
- }
- else if (tmp == CmdSTOP) {
- VIDEO_SINGLETON::instance ()->cmd = tmp;
- /*
- fprintf(stderr, "VS: VIDEO_SINGLETON::Instance ()->CmdSTOP. . .\n");
- */
- result = CmdRead((char *)&VIDEO_SINGLETON::instance ()->cmdsn, sizeof(int));
- if (result != 0)
- return result;
-#ifdef NeedByteOrderConversion
- VIDEO_SINGLETON::instance ()->cmdsn = ntohl(VIDEO_SINGLETON::instance ()->cmdsn);
-#endif
- StopTimer();
- break;
- }
- else if (tmp == CmdSPEED)
- {
- SPEEDpara para;
- /*
- fprintf(stderr, "VS: VIDEO_SINGLETON::Instance ()->CmdSPEED. . .\n");
- */
- result = CmdRead((char *)&para, sizeof(para));
- if (result != 0)
- return result;
-#ifdef NeedByteOrderConversion
- para.sn = ntohl(para.sn);
- para.usecPerFrame = ntohl(para.usecPerFrame);
- para.framesPerSecond = ntohl(para.framesPerSecond);
- para.sendPatternGops = ntohl(para.sendPatternGops);
- para.frameRateLimit1000 = ntohl(para.frameRateLimit1000);
-#endif
- VIDEO_SINGLETON::instance ()->frameRateLimit = para.frameRateLimit1000 / 1000.0;
- VIDEO_SINGLETON::instance ()->sendPatternGops = para.sendPatternGops;
- VIDEO_SINGLETON::instance ()->currentUPF = para.usecPerFrame;
- VIDEO_SINGLETON::instance ()->addedUPF = 0;
- memcpy(VIDEO_SINGLETON::instance ()->sendPattern, para.sendPattern, PATTERN_SIZE);
- TimerSpeed();
- }
- else
- {
- fprintf(stderr, "VS error: VIDEO_SINGLETON::instance ()->cmd=%d while expect STOP/SPEED.\n", tmp);
- VIDEO_SINGLETON::instance ()->normalExit = 0;
- exit(1);
- }
- }
- if (FD_ISSET(VIDEO_SINGLETON::instance ()->videoSocket, &read_mask)) /* feedBack, speed adjustment */
- {
- ACE_DEBUG ((LM_DEBUG,
- "PLAYVIDEO:Data SOCKET selected\n"));
- GetFeedBack();
- }
- ACE_DEBUG ((LM_DEBUG,
- "PLAYVIDEO:none selected\n"));
- }
- return 0;
-}
-
-#include <ctype.h>
-
-static void STATstream(void)
-{
- int i, j = 0;
- for (i = 0; i < VIDEO_SINGLETON::instance ()->numF; i++)
- {
- short size = htons(VIDEO_SINGLETON::instance ()->frameTable[i].size);
- char type = VIDEO_SINGLETON::instance ()->frameTable[i].type;
- if (i == VIDEO_SINGLETON::instance ()->gopTable[j].previousFrames)
- {
- type = tolower(type);
- j ++;
- }
- CmdWrite((char *)&type, 1);
- CmdWrite((char *)&size, 2);
- }
-}
-
-static void STATsent(void)
-{
-#ifdef STAT
- CmdWrite((char *)VIDEO_SINGLETON::instance ()->framesSent, (VIDEO_SINGLETON::instance ()->numF + 7) / 8);
-#else
- int i;
- char zeroByte = 0;
- for (i = 0; i < (VIDEO_SINGLETON::instance ()->numF + 7) / 8; i++)
- CmdWrite((char *)&zeroByte, 1);
-#endif
-}
-
-static void on_exit_routine(void)
-{
- struct sockaddr_in peeraddr_in;
- int size = sizeof(peeraddr_in);
- /*
- if (!VIDEO_SINGLETON::instance ()->normalExit) {
- fprintf(stderr, "VS exitting abnormally, dump core...\n");
- kill(getpid(), SIGSEGV);
- usleep(2000000);
- }
- */
- /*
- fprintf(stderr, "A VS session terminated.\n");
- */
- if (getpeername(VIDEO_SINGLETON::instance ()->serviceSocket,
- (struct sockaddr *)&peeraddr_in, &size) == 0 &&
- peeraddr_in.sin_family == AF_INET) {
- if (strncmp(inet_ntoa(peeraddr_in.sin_addr), "129.95.50", 9)) {
- struct hostent *hp;
- time_t val = time(NULL);
- char * buf = ctime(&VIDEO_SINGLETON::instance ()->start_time);
-
- hp = gethostbyaddr((char *)&(peeraddr_in.sin_addr), 4, AF_INET);
- buf[strlen(buf)-1] = 0;
- printf("%s: %s %3dm%02ds %dP %s\n",
- buf,
- hp == NULL ? inet_ntoa(peeraddr_in.sin_addr) : hp->h_name,
- (val - VIDEO_SINGLETON::instance ()->start_time) / 60, (val - VIDEO_SINGLETON::instance ()->start_time) % 60,
- VIDEO_SINGLETON::instance ()->pkts_sent, VIDEO_SINGLETON::instance ()->videoFile);
- }
- }
- ComCloseConn(VIDEO_SINGLETON::instance ()->serviceSocket);
- ComCloseConn(VIDEO_SINGLETON::instance ()->videoSocket);
-}
-
-int VideoServer(int ctr_fd, int data_fd, int rttag, int max_pkt_size)
-{
- int result;
-
- VIDEO_SINGLETON::instance ()->serviceSocket = ctr_fd;
- VIDEO_SINGLETON::instance ()->videoSocket = data_fd;
- VIDEO_SINGLETON::instance ()->conn_tag = max_pkt_size;
-
- if (max_pkt_size > 0) VIDEO_SINGLETON::instance ()->msgsize = max_pkt_size;
- else if (max_pkt_size < 0) VIDEO_SINGLETON::instance ()->msgsize = - max_pkt_size;
- else VIDEO_SINGLETON::instance ()->msgsize = 1024 * 1024;
- /*
- SFprintf(stderr, "VS VIDEO_SINGLETON::instance ()->msgsize = %d\n", VIDEO_SINGLETON::instance ()->msgsize);
- */
- VIDEO_SINGLETON::instance ()->msgsize -= sizeof(VideoMessage);
-
- VIDEO_SINGLETON::instance ()->start_time = time(NULL);
-
- atexit(on_exit_routine);
-
- VIDEO_SINGLETON::instance ()->lastRef[0] = VIDEO_SINGLETON::instance ()->lastRef[1] = -1;
- VIDEO_SINGLETON::instance ()->lastRefPtr = 0;
-
- result = INITvideo();
-
- if (result != 0)
- return result;
-
- if (rttag) {
- if (SetRTpriority("VS", 0) == -1) rttag = 0;
- }
-
- for (;;)
- {
-
- fprintf(stderr, "VS: waiting for a new command...\n");
-
- VIDEO_SINGLETON::instance ()->precmd = VIDEO_SINGLETON::instance ()->cmd;
- result = CmdRead((char *)&VIDEO_SINGLETON::instance ()->cmd, 1);
- if (result != 0)
- {
- // cerr << result;
- ACE_ERROR_RETURN ((LM_ERROR,
- "(%P|%t) VideoServer "),
- result);
- }
- fprintf(stderr, "VS got VIDEO_SINGLETON::instance ()->cmd %d\n", VIDEO_SINGLETON::instance ()->cmd);
-
- switch (VIDEO_SINGLETON::instance ()->cmd)
- {
- case CmdPOSITION:
- case CmdPOSITIONrelease:
- result = POSITIONvideo();
- if (result != 0)
- return result;
- break;
- case CmdSTEP:
- result = STEPvideo();
- if (result != 0)
- return result;
- break;
- case CmdFF:
- FFvideo();
- break;
- case CmdFB:
- FBvideo();
- break;
- case CmdPLAY:
- result = PLAYvideo();
- if (result != 0)
- return result;
- break;
- case CmdCLOSE:
- /*
- fprintf(stderr, "a session closed.\n");
- VIDEO_SINGLETON::instance ()->normalExit =1;
- */
- // exit(0);
- return 0;
- break;
- case CmdSTATstream:
- STATstream();
- break;
- case CmdSTATsent:
- STATsent();
- break;
- default:
- fprintf(stderr,
- "VS error: video channel command %d not known.\n", VIDEO_SINGLETON::instance ()->cmd);
- VIDEO_SINGLETON::instance ()->normalExit = 0;
- return -1;
- break;
- }
- }
-}