This is main.c in view mode; [Download] [Up]
/*
* Copyright (c) 1992 The Regents of the University of California.
* All rights reserved.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation for any purpose, without fee, and without written agreement is
* hereby granted, provided that the above copyright notice and the following
* two paragraphs appear in all copies of this software.
*
* IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR
* DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT
* OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF
* CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
* AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
* ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO
* PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
*/
#include "video.h"
#include <sys/types.h>
#include <signal.h>
#include <netinet/in.h>
#include "util.h"
/* Define buffer length. */
#define BUF_LENGTH 80000
/* Function return type declarations */
void usage();
/* External declaration of main decoding call. */
extern VidStream *mpegVidRsrc();
extern VidStream *NewVidStream();
/* Global file pointer to incoming data. */
FILE *input;
/* End of File flag. */
static int EOF_flag = 0;
/* Loop flag. */
int loopFlag = 0;
/* Setjmp/Longjmp env. */
jmp_buf env;
/*
*--------------------------------------------------------------
*
* get_more_data --
*
* Called by correct_underflow in bit parsing utilities to
* read in more data.
*
* Results:
* Input buffer updated, buffer length updated.
* Returns 1 if data read, 0 if EOF, -1 if error.
*
* Side effects:
* None.
*
*--------------------------------------------------------------
*/
int
get_more_data(buf_start, max_length, length_ptr, buf_ptr)
unsigned int *buf_start;
int max_length;
int *length_ptr;
unsigned int **buf_ptr;
{
int length, num_read, i, request;
unsigned char *buffer, *mark;
unsigned int *lmark;
if (EOF_flag) return 0;
length = *length_ptr;
buffer = (unsigned char *) *buf_ptr;
if (length > 0) {
memcpy((unsigned char *) buf_start, buffer, (length*4));
mark = ((unsigned char *) (buf_start + length));
}
else {
mark = (unsigned char *) buf_start;
length = 0;
}
request = (max_length-length)*4;
num_read = fread( mark, 1, request, input);
if (num_read < 0) {
return -1;
}
else if (num_read == 0) {
*buf_ptr = buf_start;
/* Make 32 bits after end equal to 0 and 32
bits after that equal to seq end code
in order to prevent messy data from infinite
recursion.
*/
*(buf_start + length) = 0x0;
*(buf_start + length+1) = SEQ_END_CODE;
EOF_flag = 1;
return 0;
}
lmark = (unsigned int *) mark;
num_read = num_read/4;
for (i=0; i<num_read; i++) {
*lmark = htonl(*lmark);
lmark++;
}
*buf_ptr = buf_start;
*length_ptr = length + num_read;
return 1;
}
/*
*--------------------------------------------------------------
*
* int_handler --
*
* Handles Cntl-C interupts..
*
* Results:
* None.
*
* Side effects:
* None.
*
*--------------------------------------------------------------
*/
void
int_handler()
{
fprintf(stderr, "Interrupted!\n");
if (curVidStream != NULL)
DestroyVidStream(curVidStream);
exit(1);
}
/* global - writes binary data to stdout if set */
int writeToStdout;
/*
*--------------------------------------------------------------
*
* main --
*
* Parses command line, starts decoding and displaying.
*
* Results:
* None.
*
* Side effects:
* None.
*
*--------------------------------------------------------------
*/
void main(argc, argv)
int argc;
char **argv;
{
static VidStream *theStream;
int mark;
int i;
writeToStdout = 1;
mark = 1;
argc--;
input = stdin;
while (argc) {
if (strcmp(argv[mark], "-nop") == 0) {
TogglePFlag();
argc--; mark++;
}
else if (strcmp(argv[mark], "-nob") == 0) {
ToggleBFlag();
argc--; mark++;
}
else if (strcmp(argv[mark], "-toFile") == 0) {
writeToStdout = 0;
argc--; mark++;
}
else if (strcmp(argv[mark], "-loop") == 0) {
argc--; mark++;
loopFlag = 1;
}
else
if (argv[mark][0] == '-') {
fprintf(stderr, "Un-recognized flag %s\n",argv[mark]);
usage(argv[0]);
}
else {
input = fopen(argv[mark], "r");
if (input == NULL) {
fprintf(stderr, "Could not open file %s\n", argv[mark]);
usage(argv[0]);
}
argc--; mark++;
}
}
signal(SIGINT, int_handler);
init_tables();
InitColorDither();
if (setjmp(env) != 0) {
DestroyVidStream(theStream);
rewind(input);
EOF_flag = 0;
curBits = 0;
bitOffset = 0;
bufLength = 0;
bitBuffer = NULL;
totNumFrames = 0;
}
theStream = NewVidStream(BUF_LENGTH);
mpegVidRsrc(0, theStream);
i = 1;
realTimeStart = ReadSysClock();
while (1) { /* Ctl-C to exit if in loop mode */
mpegVidRsrc(0, theStream);
}
}
/*
*--------------------------------------------------------------
*
* usage --
*
* Print mpeg_play usage
*
* Results:
* None.
*
* Side effects:
* exits with a return value -1
*
*--------------------------------------------------------------
*/
void
usage(s)
char *s; /* program name */
{
fprintf(stderr, "Usage:\n");
fprintf(stderr, "mpeg_play\n");
fprintf(stderr, " [-nob]\n");
fprintf(stderr, " [-nop]\n");
fprintf(stderr, " [-loop]\n");
fprintf(stderr, " file_name\n");
exit (-1);
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.