home *** CD-ROM | disk | FTP | other *** search
/ DP Tool Club 9 / CD_ASCQ_09_1193.iso / news / 4441 / mpegcode / src / main.c < prev    next >
C/C++ Source or Header  |  1993-09-27  |  10KB  |  369 lines

  1. /*===========================================================================*
  2.  * main.c                                     *
  3.  *                                         *
  4.  *    Main procedure                                 *
  5.  *                                         *
  6.  * EXPORTED PROCEDURES:                                 *
  7.  *    main                                     *
  8.  *                                         *
  9.  *===========================================================================*/
  10.  
  11. /*
  12.  * Copyright (c) 1993 The Regents of the University of California.
  13.  * All rights reserved.
  14.  *
  15.  * Permission to use, copy, modify, and distribute this software and its
  16.  * documentation for any purpose, without fee, and without written agreement is
  17.  * hereby granted, provided that the above copyright notice and the following
  18.  * two paragraphs appear in all copies of this software.
  19.  *
  20.  * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR
  21.  * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT
  22.  * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF
  23.  * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  24.  *
  25.  * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES,
  26.  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
  27.  * AND FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
  28.  * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO
  29.  * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
  30.  */
  31.  
  32. /*  
  33.  *  $Header: /n/picasso/users/keving/encode/src/RCS/main.c,v 1.3 1993/07/22 22:23:43 keving Exp keving $
  34.  *  $Log: main.c,v $
  35.  * Revision 1.3  1993/07/22  22:23:43  keving
  36.  * nothing
  37.  *
  38.  * Revision 1.2  1993/06/30  20:06:09  keving
  39.  * nothing
  40.  *
  41.  * Revision 1.1  1993/02/17  23:18:20  dwallach
  42.  * Initial revision
  43.  *
  44.  */
  45.  
  46.  
  47. /*==============*
  48.  * HEADER FILES *
  49.  *==============*/
  50.  
  51. #include "all.h"
  52. #include "mtypes.h"
  53. #include "mpeg.h"
  54. #include "search.h"
  55. #include "prototypes.h"
  56. #include "param.h"
  57. #include "parallel.h"
  58. #include "readframe.h"
  59. #include "combine.h"
  60. #include "frames.h"
  61.  
  62.  
  63. int    main _ANSI_ARGS_((int argc, char **argv));
  64.  
  65. /*==================*
  66.  * STATIC VARIABLES *
  67.  *==================*/
  68.  
  69. static int    frameStart = -1;
  70. static int    frameEnd;
  71.  
  72.  
  73. /*==================*
  74.  * GLOBAL VARIABLES *
  75.  *==================*/
  76.  
  77. int    whichGOP = -1;
  78. boolean    childProcess = FALSE;
  79. boolean    ioServer = FALSE;
  80. boolean    outputServer = FALSE;
  81. boolean    remoteIO = FALSE;
  82. boolean    niceProcesses = FALSE;
  83. int    quietTime = 0;
  84. boolean    frameSummary = TRUE;
  85.  
  86.  
  87. /*===============================*
  88.  * INTERNAL PROCEDURE prototypes *
  89.  *===============================*/
  90.  
  91. static void Usage _ANSI_ARGS_((void));
  92.  
  93.  
  94. /*=====================*
  95.  * EXPORTED PROCEDURES *
  96.  *=====================*/
  97.  
  98.  
  99. /*===========================================================================*
  100.  *
  101.  * main
  102.  *
  103.  *    see man page.  run without arguments to see usage
  104.  *
  105.  * RETURNS:    0 if all is well; 1 on most if not all errors
  106.  *
  107.  *===========================================================================*/
  108. int
  109. main(argc, argv)
  110.     int argc;
  111.     char **argv;
  112. {
  113.     FILE *ofp = NULL;
  114.     register int index;
  115.     int        function = ENCODE_FRAMES;
  116.     int        portNumber = 0;
  117.     char    *hostName = NULL;
  118.     int32   totalTime = -1;
  119.     int        machineNumber = -1;
  120.     int        maxMachines = 0x7fffffff;
  121.     int        outputFrames = 0;
  122.  
  123.     if ( argc == 1 ) {
  124.     Usage();
  125.     }
  126.  
  127.     SetStatFileName("");
  128.  
  129.     /* parse the arguments */
  130.     index = 1;
  131.     while ( index < argc-1 ) {
  132.     if ( argv[index][0] != '-' ) {
  133.         Usage();
  134.     }
  135.  
  136.     if ( strcmp(argv[index], "-stat") == 0 ) {
  137.         if ( index+1 < argc-1 ) {
  138.         SetStatFileName(argv[index+1]);
  139.         index += 2;
  140.         } else {
  141.         Usage();
  142.         }
  143.     } else if ( strcmp(argv[index], "-gop") == 0 ) {
  144.         if ( (function != ENCODE_FRAMES) || (frameStart != -1) ) {
  145.         Usage();
  146.         }
  147.  
  148.         if ( index+1 < argc-1 ) {
  149.         whichGOP = atoi(argv[index+1]);
  150.         index += 2;
  151.         } else {
  152.         Usage();
  153.         }
  154.     } else if ( strcmp(argv[index], "-frames") == 0 ) {
  155.         if ( (function != ENCODE_FRAMES) || (whichGOP != -1) ) {
  156.         Usage();
  157.         }
  158.  
  159.         if ( index+2 < argc-1 ) {
  160.         frameStart = atoi(argv[index+1]);
  161.         frameEnd = atoi(argv[index+2]);
  162.  
  163.         if ( (frameStart > frameEnd) || (frameStart < 0) ) {
  164.             fprintf(stderr, "ERROR:  bad frame numbers!\n");
  165.             Usage();
  166.         }
  167.  
  168.         index += 3;
  169.         } else {
  170.         Usage();
  171.         }
  172.     } else if ( strcmp(argv[index], "-combine_gops") == 0 ) {
  173.         if ( (function != ENCODE_FRAMES) || (whichGOP != -1) || 
  174.          (frameStart != -1) ) {
  175.         Usage();
  176.         }
  177.  
  178.         function = COMBINE_GOPS;
  179.         index++;
  180.     } else if ( strcmp(argv[index], "-combine_frames") == 0 ) {
  181.         if ( (function != ENCODE_FRAMES) || (whichGOP != -1) ||
  182.          (frameStart != -1) ) {
  183.         Usage();
  184.         }
  185.  
  186.         function = COMBINE_FRAMES;
  187.         index++;
  188.     } else if ( strcmp(argv[index], "-child") == 0 ) {
  189.         if ( index+6 < argc-1 ) {
  190.         hostName = argv[index+1];
  191.         portNumber = atoi(argv[index+2]);
  192.         IOportNumber = atoi(argv[index+3]);
  193.         outputPortNumber = atoi(argv[index+4]);
  194.         machineNumber = atoi(argv[index+5]);
  195.         remoteIO = atoi(argv[index+6]);
  196.  
  197.         IOhostName = hostName;
  198.         } else {
  199.         Usage();
  200.         }
  201.  
  202.         childProcess = TRUE;
  203.         index += 7;
  204.     } else if ( strcmp(argv[index], "-io_server") == 0 ) {
  205.         if ( index+2 < argc-1 ) {
  206.         hostName = argv[index+1];
  207.         portNumber = atoi(argv[index+2]);
  208.         } else {
  209.         Usage();
  210.         }
  211.  
  212.         ioServer = TRUE;
  213.         index += 3;
  214.     } else if ( strcmp(argv[index], "-output_server") == 0 ) {
  215.         if ( index+3 < argc-1 ) {
  216.         hostName = argv[index+1];
  217.         portNumber = atoi(argv[index+2]);
  218.         outputFrames = atoi(argv[index+3]);
  219.         } else {
  220.         Usage();
  221.         }
  222.  
  223.         function = COMBINE_FRAMES;
  224.         outputServer = TRUE;
  225.         index += 4;
  226.     } else if ( strcmp(argv[index], "-nice") == 0 ) {
  227.         niceProcesses = TRUE;
  228.         index++;
  229.     } else if ( strcmp(argv[index], "-max_machines") == 0 ) {
  230.         if ( index+1 < argc-1 ) {
  231.         maxMachines = atoi(argv[index+1]);
  232.         } else {
  233.         Usage();
  234.         }
  235.  
  236.         index += 2;
  237.     } else if ( strcmp(argv[index], "-quiet") == 0 ) {
  238.         if ( index+1 < argc-1 ) {
  239.         quietTime = atoi(argv[index+1]);
  240.         } else {
  241.         Usage();
  242.         }
  243.  
  244.         index += 2;
  245.     } else if ( strcmp(argv[index], "-no_frame_summary") == 0 ) {
  246.         if ( index+1 < argc-1 ) {
  247.         frameSummary = FALSE;
  248.         } else {
  249.         Usage();
  250.         }
  251.  
  252.         index++;
  253.     } else if ( strcmp(argv[index], "-snr") == 0 ) {
  254.         printSNR = TRUE;
  255.         index++;
  256.     } else {
  257.         Usage();
  258.     }
  259.     }
  260.  
  261.     if ( ! ReadParamFile(argv[argc-1], function) ) {
  262.     Usage();
  263.     }
  264.  
  265.     if ( printSNR || (referenceFrame == DECODED_FRAME) ) {
  266.     decodeRefFrames = TRUE;
  267.     }
  268.  
  269.     numMachines = min(numMachines, maxMachines);
  270.  
  271.     Frame_Init();
  272.  
  273.     if ( ioServer ) {
  274.     StartInputServer(numInputFiles, hostName, portNumber);
  275.     return 0;
  276.     } else if ( outputServer ) {
  277.     StartOutputServer(outputFrames, outputFileName, hostName, portNumber);
  278.     return 0;
  279.     }
  280.  
  281.     if ( (frameStart == -1) &&
  282.      ((numMachines == 0) || (function != ENCODE_FRAMES)) ) {
  283.     if ( (ofp = fopen(outputFileName, "wb")) == NULL ) {
  284.         fprintf(stderr, "ERROR:  Could not open output file!\n");
  285.         exit(1);
  286.     }
  287.     }
  288.  
  289.     if ( ! childProcess ) {
  290.     fprintf(stdout, "Output File:  %s\n", outputFileName);
  291.     fprintf(stdout, "\n\n");
  292.     }
  293.  
  294.     if ( function == ENCODE_FRAMES ) {
  295.     if ( (numMachines == 0) || (frameStart != -1) ) {
  296.         totalTime = GenMPEGStream(whichGOP, frameStart, frameEnd,
  297.                       numInputFiles, ofp,
  298.                       outputFileName, remoteIO);
  299.     } else {
  300.         /* check if parameter file has absolute path */
  301.         if ( (argv[argc-1][0] != '/') && (argv[argc-1][0] != '~') ) {
  302.         fprintf(stderr, "ERROR:  For parallel execution, please use absolute path for parameter file!\n");
  303.         exit(1);
  304.         } else {
  305.         StartParallelServer(numInputFiles, argv[argc-1], outputFileName);
  306.         }
  307.     }
  308.     } else if ( function == COMBINE_GOPS ) {
  309.     GOPStoMPEG(numInputFiles, outputFileName, ofp);
  310.     } else if ( function == COMBINE_FRAMES ) {
  311.     FramesToMPEG(numInputFiles, outputFileName, ofp, FALSE);
  312.     }
  313.  
  314.     if ( childProcess ) {
  315.     while ( NotifyMasterDone(hostName, portNumber, machineNumber,
  316.                  totalTime,
  317.                  &frameStart, &frameEnd) ) {
  318.         /* do more frames */
  319.         totalTime = GenMPEGStream(-1, frameStart, frameEnd,
  320.                       numInputFiles, NULL,
  321.                       outputFileName, remoteIO);
  322.     }
  323.     }
  324.  
  325.     Frame_Exit();
  326.  
  327.     return 0;    /* all is well */
  328. }
  329.  
  330.  
  331. /*=====================*
  332.  * INTERNAL PROCEDURES *
  333.  *=====================*/
  334.  
  335. /*===========================================================================*
  336.  *
  337.  * Usage
  338.  *
  339.  *    prints out usage for the program
  340.  *
  341.  * RETURNS:    nothing
  342.  *
  343.  * SIDE EFFECTS:    none
  344.  *
  345.  *===========================================================================*/
  346. static void
  347. Usage()
  348. {
  349.     fprintf(stderr, "Usage:  mpeg_encode [options] param_file\n");
  350.     fprintf(stderr, "Options:\n");
  351.     fprintf(stderr, "\t-stat stat_file:  append stats to stat_file\n");
  352.     fprintf(stderr, "\t-quiet n:  don't report remaining time for at least n seconds\n");
  353.     fprintf(stderr, "\t-no_frame_summary:  suppress frame summary lines\n");
  354.     fprintf(stderr, "\t-gop gop_num:  encode only the numbered GOP\n");
  355.     fprintf(stderr, "\t-combine_gops:  combine GOP files instead of encode\n");
  356.     fprintf(stderr, "\t-frames first_frame last_frame:  encode only the specified frames\n");
  357.     fprintf(stderr, "\t-combine_frames:  combine frame files instead of encode\n");
  358.     fprintf(stderr, "\t-nice:  run slave processes nicely\n");
  359.     fprintf(stderr, "\t-max_machines num_machines:  use at most num_machines machines\n");
  360.     exit(1);
  361.  
  362. /* extended usage (used by parallel code; shouldn't be called by user):
  363.     -child parallelHostName portNumber IOportNumber outputPortNumber machineNumber remote
  364.     -io_server parallelHostName portNumber
  365.     
  366.     (remote = 1 if need to use IOportNumber)
  367.  */
  368. }
  369.