This is ToMPEG.m in view mode; [Download] [Up]
#import "ToMPEG.h"
#include <stdio.h>
#import <stdlib.h>
#import <string.h>
#import <ctype.h>
#include <sys/file.h> /* POSIX applications #include <unistd.h> */
#define R_OK 4/* test for read permission */
#define W_OK 2/* test for write permission */
#define X_OK 1/* test for execute (search) permission */
#define F_OK 0/* test for presence of file */
int access(const char *path, int mode);
@implementation ToMPEG
#define ANIMDIRECTORY "~/Library/Images/Movies/Globe.anim"
#define STARTFRAME 1
#define ENDFRAME 72
#define PBMPLUSDIRECTORY "/usr/local/pbmplus/bin"
#define FRAMEWIDTHxHEIGHT "640x480"
#define SPECIALFRAMETYPE "MyType"
/* The following are the tags set in InterfaceBuilder for the "formatButton" PopUp */
#define TIFF 0
#define GIF 1
#define GOULD 2
#define ILBM 3
#define IMG 4
#define MTV 5
#define PCX 6
#define PGM 7
#define PI1 8
#define PICT 9
#define PJ 10
#define QRT 11
#define RAW 12
#define RGB3 13
#define SLD 14
#define SPC 15
#define SPU 16
#define TGA 17
#define XIM 18
#define XPM 19
#define YUV 20
#define PPM 21
#define SPECIAL 22
char MPEGer[MAXPATHLEN + 1] = "mpeg-encode";
char PPMer[MAXPATHLEN + 1] = "tiff2ppm";
char converter[MAXPATHLEN + 1] = "giftoppm";
char MyConverter[MAXPATHLEN + 1] = "MyType2ppm";
/* extract the name of the animation from the full pathname */
char *stripname(char *animdirectory)
{
char *tmp, *tmp2, *tmp3;
tmp = (char *)malloc(100);
strcpy(tmp, animdirectory);
if((tmp2 = strrchr(tmp, '.'))) (*tmp2) = '\0';
if((tmp3 = strrchr(tmp, '/'))) return (tmp3 + 1);
else return tmp;
}
/* This method gets called automatically, since toMPEG is App's delegate */
char *param[19];
- appDidInit:sender
{
NXBundle *bundle;
int i;
/* Initialize pathnames to appwrapper resources: mpeg-encode and tiff2ppm */
bundle = [NXBundle bundleForClass:[self class]];
[bundle getPath:MPEGer forResource:"mpeg-encode" ofType:NULL];
[bundle getPath:PPMer forResource:"tiff2ppm" ofType:NULL];
/* Initialize the param strings */
for(i=0; i<19; i++) param[i] = (char *)malloc(125);
strcpy(param[0], "PATTERN IBBPBBPBBPBBPBB");
strcpy(param[1], "OUTPUT Globe.mpg");
strcpy(param[2], "GOP_SIZE 40");
strcpy(param[3], "SLICES_PER_FRAME 1");
strcpy(param[4], "BASE_FILE_FORMAT PPM");
sprintf(param[5], "INPUT_CONVERT %s *", PPMer);
strcpy(param[6], "INPUT_DIR ~/Library/Images/Movies/Globe.anim");
strcpy(param[7], "INPUT");
strcpy(param[8], "Globe.*.tiff [1-72]");
strcpy(param[9], "END_INPUT");
strcpy(param[10], "PIXEL HALF");
strcpy(param[11], "RANGE 10");
strcpy(param[12], "PSEARCH_ALG LOGARITHMIC");
strcpy(param[13], "BSEARCH_ALG CROSS2");
strcpy(param[14], "IQSCALE 8");
strcpy(param[15], "PQSCALE 10");
strcpy(param[16], "BQSCALE 25");
strcpy(param[17], "REFERENCE_FRAME ORIGINAL");
strcpy(param[18], "FORCE_ENCODE_LAST_FRAME");
/* Initialize outlets to the List and the Matrix of the "formatButton" PopUp */
if (![formatButton isKindOf:[PopUpList class]])
{
formatList = [formatButton target];
formatMatrix = [formatList itemList];
}
[converterinfo setEnabled:NO];
return self;
}
- setDefaults:sender
{
/* initialize animinfo form with default values */
[animinfo setStringValue:ANIMDIRECTORY at:0];
[animinfo setIntValue:STARTFRAME at:1];
[animinfo setIntValue:ENDFRAME at:2];
/* initialize formatButton and its matrix of MenuCells with default value */
sprintf(param[5], "INPUT_CONVERT %s *", PPMer);
[formatButton setTitle: "TIFF"];
[formatMatrix selectCellWithTag:TIFF];
[converterinfo setEnabled:NO];
[converterinfo setTitle:"pbmplus Directory:" at:0];
[converterinfo setStringValue:PBMPLUSDIRECTORY at:0];
return self;
}
- setConverterInfo
{
strcpy(param[4], "BASE_FILE_FORMAT PPM");
[converterinfo setTitle:"pbmplus Directory:" at:0];
[converterinfo setStringValue:PBMPLUSDIRECTORY at:0];
[converterinfo setEnabled:YES];
return self;
}
- doTIFF:sender
{
strcpy(param[4], "BASE_FILE_FORMAT PPM");
sprintf(param[5], "INPUT_CONVERT %s *", PPMer);
[converterinfo setEnabled:NO];
return self;
}
- doGIF:sender
{
strcpy(converter, "giftoppm");
[self setConverterInfo];
return self;
}
- doGOULD:sender
{
strcpy(converter, "gouldtoppm");
[self setConverterInfo];
return self;
}
- doILBM:sender
{
strcpy(converter, "ilbmtoppm");
[self setConverterInfo];
return self;
}
- doIMG:sender
{
strcpy(converter, "imgtoppm");
[self setConverterInfo];
return self;
}
- doMTV:sender
{
strcpy(converter, "mtvtoppm");
[self setConverterInfo];
return self;
}
- doPCX:sender
{
strcpy(converter, "pcxtoppm");
[self setConverterInfo];
return self;
}
- doPGM:sender
{
strcpy(converter, "pgmtoppm");
[self setConverterInfo];
return self;
}
- doPI1:sender
{
strcpy(converter, "pi1toppm");
[self setConverterInfo];
return self;
}
- doPICT:sender
{
strcpy(converter, "picttoppm");
[self setConverterInfo];
return self;
}
- doPJ:sender
{
strcpy(converter, "pjtoppm");
[self setConverterInfo];
return self;
}
- doQRT:sender
{
strcpy(converter, "qrttoppm");
[self setConverterInfo];
return self;
}
- doRAW:sender
{
strcpy(converter, "rawtoppm");
strcpy(param[4], "BASE_FILE_FORMAT PPM");
sprintf(param[5], "INPUT_CONVERT %s/%s ",
[converterinfo stringValueAt:0], converter);
[converterinfo setTitle:"WIDTHxHEIGHT:" at:0];
[converterinfo setStringValue:FRAMEWIDTHxHEIGHT at:0];
[converterinfo setEnabled:YES];
return self;
}
- doRGB3:sender
{
strcpy(converter, "rgb3toppm");
[self setConverterInfo];
return self;
}
- doSLD:sender
{
strcpy(converter, "sldtoppm");
[self setConverterInfo];
return self;
}
- doSPC:sender
{
strcpy(converter, "spctoppm");
[self setConverterInfo];
return self;
}
- doSPU:sender
{
strcpy(converter, "sputoppm");
[self setConverterInfo];
return self;
}
- doTGA:sender
{
strcpy(converter, "tgatoppm");
[self setConverterInfo];
return self;
}
- doXIM:sender
{
strcpy(converter, "ximtoppm");
[self setConverterInfo];
return self;
}
- doXPM:sender
{
strcpy(converter, "xpmtoppm");
[self setConverterInfo];
return self;
}
- doYUV:sender
{
strcpy(param[4], "BASE_FILE_FORMAT YUV\nYUV_SIZE ");
strcpy(param[5], "INPUT_CONVERT *");
[converterinfo setTitle:"WIDTHxHEIGHT:" at:0];
[converterinfo setStringValue:FRAMEWIDTHxHEIGHT at:0];
[converterinfo setEnabled:YES];
return self;
}
- doPPM:sender
{
strcpy(param[4], "BASE_FILE_FORMAT PPM");
strcpy(param[5], "INPUT_CONVERT *");
[converterinfo setEnabled:NO];
return self;
}
- doSPECIAL:sender
{
strcpy(param[4], "BASE_FILE_FORMAT PPM");
[converterinfo setTitle:"FrameType:" at:0];
[converterinfo setStringValue: SPECIALFRAMETYPE at:0];
[converterinfo setEnabled:YES];
return self;
}
- toMPEGMethod:sender
{
char *tmp, *animdirectory, *moviename, *moviepath, *frametype;
char *fullpath, *framefile;
char *paramfile, *resultfile, *execstring;
int startframe, endframe, numframes, i, width, height, exit_status;
FILE *pfile;
animdirectory = (char *)malloc(100);
moviepath = (char *)malloc(100);
frametype = (char *)malloc(100);
fullpath = (char *)malloc(200);
framefile = (char *)malloc(300);
paramfile = (char *)malloc(100);
resultfile = (char *)malloc(100);
execstring = (char *)malloc(100);
/* store user's table entries into variables */
strcpy(animdirectory, [animinfo stringValueAt:0]);
startframe = [animinfo intValueAt:1];
endframe = [animinfo intValueAt:2];
sprintf(param[6], "INPUT_DIR %s", animdirectory);
numframes = endframe - startframe + 1;
sprintf(param[2], "GOP_SIZE %d", numframes);
moviename = stripname(animdirectory);
strcpy(moviepath, "/tmp/");
sprintf(param[1], "OUTPUT %s%s.mpg", moviepath, moviename);
strcpy(frametype, [formatButton title]);
tmp = frametype; do *tmp = tolower(*tmp); while(*tmp++);
switch([[formatMatrix selectedCell] tag]) {
case YUV:
sprintf(param[8], "%s.*.%s [%d-%d]",
moviename, frametype, startframe, endframe);
strcat(param[4], [converterinfo stringValueAt:0]);
break;
case RGB3:
sprintf(param[8], "%s.* [%d-%d]",
moviename, startframe, endframe);
sprintf(param[5], "INPUT_CONVERT %s/%s *.r *.g *.b",
[converterinfo stringValueAt:0], converter);
break;
case RAW:
sprintf(param[8], "%s.*.%s [%d-%d]",
moviename, frametype, startframe, endframe);
width = atoi((tmp = [converterinfo stringValueAt:0]));
height = atoi(strpbrk(tmp, "xX") + 1);
sprintf(param[5], "%s %d %d *", param[5], width, height);
break;
case SPECIAL:
strcpy(frametype, [converterinfo stringValueAt:0]);
sprintf(param[8], "%s.*.%s [%d-%d]",
moviename, frametype, startframe, endframe);
strcpy(MyConverter, PPMer);
*(strrchr(MyConverter, '/') + 1) = '\0';
strcat(MyConverter, frametype);
sprintf(param[5], "INPUT_CONVERT %s2ppm *", MyConverter);
break;
default:
sprintf(param[8], "%s.*.%s [%d-%d]",
moviename, frametype, startframe, endframe);
if([converterinfo isEnabled]) {
sprintf(param[5], "INPUT_CONVERT %s/%s *",
[converterinfo stringValueAt:0], converter);
}
break;
}
if(*animdirectory == '~') {
strcpy(fullpath, NXHomeDirectory());
strcat(fullpath, animdirectory + 1);
}
else strcpy(fullpath, animdirectory);
/* check that the FIRST frame file exists */
sprintf(framefile, "%s/%s.%d.%s",
fullpath, moviename, startframe, frametype);
if(access(framefile, R_OK)) {
NXRunAlertPanel("Cannot read file!", "First frame %s not accessible!",
"OK",NULL,NULL,
framefile);
return self;
}
/* check that the LAST frame file exists */
sprintf(framefile, "%s/%s.%d.%s",
fullpath, moviename, endframe, frametype);
if(access(framefile, R_OK)) {
NXRunAlertPanel("Cannot read file!", "Last frame %s not accessible!",
"OK",NULL,NULL,
framefile);
return self;
}
/* create the parameter file on /tmp */
strcpy(paramfile, "/tmp/");
strcat(strcat(paramfile, moviename), ".param");
pfile = fopen(paramfile, "w");
for(i=0; i<19; i++) fprintf(pfile, "%s\n", param[i]);
fclose(pfile);
/* execute "mpeg-encode paramfile > resultfile" */
strcpy(resultfile, "/tmp/");
strcat(strcat(resultfile, moviename), ".result");
sprintf(execstring, "%s %s > %s &", MPEGer, paramfile, resultfile);
if(!(exit_status = system(execstring)))
NXRunAlertPanel("Submitted MPEG Job to sh",
"Parameters: %s\nStatistics: %s\nMPEG: %s%s.mpg\nAny errors are listed in the console.",
"OK",NULL,NULL,
paramfile, resultfile, moviepath, moviename);
else NXRunAlertPanel("sh reports problem with MPEG Job!",
"Errors are listed in the console.",
"OK",NULL,NULL);
return self;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.