home *** CD-ROM | disk | FTP | other *** search
/ DP Tool Club 9 / CD_ASCQ_09_1193.iso / news / 4441 / mpegcode / src / readfram.ori < prev    next >
Text File  |  1993-09-28  |  13KB  |  522 lines

  1. /*===========================================================================*
  2.  * readframe.c                                     *
  3.  *                                         *
  4.  *    procedures to read in frames                         *
  5.  *                                         *
  6.  * EXPORTED PROCEDURES:                                 *
  7.  *    ReadFrame                                 *
  8.  *    SetFileType                                 *
  9.  *    SetFileFormat                                 *
  10.  *                                         *
  11.  *===========================================================================*/
  12.  
  13. /*
  14.  * Copyright (c) 1993 The Regents of the University of California.
  15.  * All rights reserved.
  16.  *
  17.  * Permission to use, copy, modify, and distribute this software and its
  18.  * documentation for any purpose, without fee, and without written agreement is
  19.  * hereby granted, provided that the above copyright notice and the following
  20.  * two paragraphs appear in all copies of this software.
  21.  *
  22.  * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR
  23.  * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT
  24.  * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF
  25.  * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  26.  *
  27.  * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES,
  28.  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
  29.  * AND FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
  30.  * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO
  31.  * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
  32.  */
  33.  
  34. /*  
  35.  *  $Header: /n/picasso/users/keving/encode/src/RCS/readframe.c,v 1.1 1993/07/22 22:23:43 keving Exp keving $
  36.  *  $Log: readframe.c,v $
  37.  * Revision 1.1  1993/07/22  22:23:43  keving
  38.  * nothing
  39.  *
  40.  */
  41.  
  42.  
  43. /*==============*
  44.  * HEADER FILES *
  45.  *==============*/
  46.  
  47. #include "all.h"
  48. #include <time.h>
  49. #include <errno.h>
  50. #include "mtypes.h"
  51. #include "frames.h"
  52. #include "prototypes.h"
  53. #include "parallel.h"
  54. #include "param.h"
  55. #include "readframe.h"
  56. #include "fsize.h"
  57. #include "rgbtoycc.h"
  58.  
  59.  
  60. /*==================*
  61.  * STATIC VARIABLES *
  62.  *==================*/
  63.  
  64. static int  fileType = BASE_FILE_TYPE;
  65. static int  baseFormat;
  66.  
  67.  
  68. /*===============================*
  69.  * INTERNAL PROCEDURE prototypes *
  70.  *===============================*/
  71.  
  72. static int  ReadNextInteger _ANSI_ARGS_((FILE *fpointer));
  73. static void ReadPNM _ANSI_ARGS_((FILE * fp, MpegFrame * mf));
  74. static boolean    ReadPPM _ANSI_ARGS_((MpegFrame *mf, FILE *fpointer));
  75. static void ReadYUV _ANSI_ARGS_((MpegFrame * mf, FILE *fpointer,
  76.                  int width, int height));
  77.  
  78.  
  79. /*=====================*
  80.  * EXPORTED PROCEDURES *
  81.  *=====================*/
  82.  
  83. /*===========================================================================*
  84.  *
  85.  * ReadFrame
  86.  *
  87.  *    reads the given frame, performing conversion as necessary
  88.  *    if addPath = TRUE, then must add the current path before the
  89.  *    file name
  90.  *
  91.  * RETURNS:    frame modified
  92.  *
  93.  * SIDE EFFECTS:    none
  94.  *
  95.  *===========================================================================*/
  96. void
  97. ReadFrame(frame, fileName, conversion, addPath)
  98.     MpegFrame *frame;
  99.     char *fileName;
  100.     char *conversion;
  101.     boolean addPath;
  102. {
  103.     FILE    *ifp;
  104.     char    command[1024];
  105.     char    fullFileName[1024];
  106. #ifdef BLEAH
  107.     static int32    readDiskTime = 0;
  108.     int32    diskStartTime, diskEndTime;
  109.  
  110. time(&diskStartTime);
  111. #endif
  112.  
  113.     if ( addPath ) {
  114.     sprintf(fullFileName, "%s/%s", currentPath, fileName);
  115.     } else {
  116.     sprintf(fullFileName, "%s", fileName);
  117.     }
  118.  
  119. #ifdef BLEAH
  120.     if ( ! childProcess ) {
  121.     fprintf(stdout, "+++++READING Frame %d  (type %d):  %s\n", frame->id,
  122.         frame->type, fullFileName);
  123.     }
  124. #endif
  125.  
  126.     if ( fileType == ANY_FILE_TYPE ) {
  127.     char *convertPtr, *commandPtr, *charPtr;
  128.  
  129.     /* replace every occurrence of '*' with fullFileName */
  130.     convertPtr = conversion;
  131.     commandPtr = command;
  132.     while ( *convertPtr != '\0' ) {
  133.         while ( (*convertPtr != '\0') && (*convertPtr != '*') ) {
  134.         *commandPtr = *convertPtr;
  135.         commandPtr++;
  136.         convertPtr++;
  137.         }
  138.  
  139.         if ( *convertPtr == '*' ) {
  140.         /* copy fullFileName */
  141.         charPtr = fullFileName;
  142.         while ( *charPtr != '\0' ) {
  143.             *commandPtr = *charPtr;
  144.             commandPtr++;
  145.             charPtr++;
  146.         }
  147.  
  148.         convertPtr++;   /* go past '*' */
  149.         }
  150.     }
  151.     *commandPtr = '\0';
  152.  
  153.     if ( (ifp = popen(command, "r")) == NULL ) {
  154.         fprintf(stderr, "ERROR:  Couldn't execute input conversion command:\n");
  155.         fprintf(stderr, "\t%s\n", command);
  156.         fprintf(stderr, "errno = %d\n", errno);
  157.         if ( ioServer ) {
  158.         fprintf(stderr, "IO SERVER:  EXITING!!!\n");
  159.         } else {
  160.         fprintf(stderr, "SLAVE EXITING!!!\n");
  161.         }
  162.         exit(1);
  163.     }
  164.     } else {
  165.     ifp = fopen(fullFileName, "r");
  166.     }
  167.  
  168.     ERRCHK(ifp, "fopen");
  169.  
  170.     if ( baseFormat == YUV_FILE_TYPE ) {
  171.     ReadYUV(frame, ifp, yuvWidth, yuvHeight);
  172.     } else if ( baseFormat == PPM_FILE_TYPE ) {
  173.     if ( ! ReadPPM(frame, ifp) ) {
  174.         fprintf(stderr, "Error reading PPM input file!!!\n");
  175.         exit(1);
  176.     }
  177.  
  178.     PPMtoYUV(frame);
  179.     } else {    /* baseFormat == PNM_FILE_TYPE */
  180.     ReadPNM(ifp, frame);
  181.  
  182.     PNMtoYUV(frame);
  183.     }
  184.  
  185.     if ( fileType == ANY_FILE_TYPE ) {
  186.     pclose(ifp);
  187.     } else {
  188.     fclose(ifp);
  189.     }
  190.  
  191. #ifdef BLEAH
  192. time(&diskEndTime);
  193.  
  194.     readDiskTime += (diskEndTime-diskStartTime);
  195.  
  196. fprintf(stdout, "cumulative disk read time:  %d seconds\n", readDiskTime);
  197. #endif
  198.  
  199.     MotionSearchPreComputation(frame);
  200. }
  201.  
  202.  
  203. /*===========================================================================*
  204.  *
  205.  * SetFileType
  206.  *
  207.  *    set the file type to be either a base type (no conversion), or
  208.  *    any type (conversion required)
  209.  *
  210.  * RETURNS:    nothing
  211.  *
  212.  * SIDE EFFECTS:    fileType
  213.  *
  214.  *===========================================================================*/
  215. void
  216. SetFileType()
  217. {
  218.     if ( strcmp(inputConversion, "*") == 0 ) {
  219.     fileType = BASE_FILE_TYPE;
  220.     } else {
  221.     fileType = ANY_FILE_TYPE;
  222.     }
  223. }
  224.  
  225.  
  226. /*===========================================================================*
  227.  *
  228.  * SetFileFormat
  229.  *
  230.  *    set the file format (PPM, PNM, YUV)
  231.  *
  232.  * RETURNS:    nothing
  233.  *
  234.  * SIDE EFFECTS:    baseFormat
  235.  *
  236.  *===========================================================================*/
  237. void
  238. SetFileFormat(format)
  239.     char *format;
  240. {
  241.     if ( strcmp(format, "PPM") == 0 ) {
  242.     baseFormat = PPM_FILE_TYPE;
  243.     } else if ( strcmp(format, "YUV") == 0 ) {
  244.     baseFormat = YUV_FILE_TYPE;
  245.     } else if ( strcmp(format, "PNM") == 0 ) {
  246.     baseFormat = PNM_FILE_TYPE;
  247.     } else if ( strcmp(format, "JPEG") == 0 ) {
  248.     fprintf(stderr, "SORRY:  JPEG not available YET\n");
  249.     exit(1);
  250.     } else {
  251.     fprintf(stderr, "ERROR:  Invalid file format:  %s\n", format);
  252.     exit(1);
  253.     }
  254. }
  255.  
  256.  
  257. /*===========================================================================*
  258.  *
  259.  * ReadPNM
  260.  *
  261.  *    read a PNM file
  262.  *
  263.  * RETURNS:    mf modified
  264.  *
  265.  * SIDE EFFECTS:    none
  266.  *
  267.  *===========================================================================*/
  268. static void
  269. ReadPNM(fp, mf)
  270.     FILE *fp;
  271.     MpegFrame *mf;
  272. {
  273.     int x, y;
  274.     xelval maxval;
  275.     int format;
  276.  
  277.     mf->rgb_data = pnm_readpnm(fp, &x, &y, &maxval, &format);
  278.     ERRCHK(mf, "pnm_readpnm");
  279.  
  280.     if (format != PPM_FORMAT) {
  281.     if (maxval < 255) {
  282.         pnm_promoteformat(mf->rgb_data, x, y, maxval, format, 255, PPM_FORMAT);
  283.         maxval = 255;
  284.     } else {
  285.         pnm_promoteformat(mf->rgb_data, x, y, maxval, format, maxval, PPM_FORMAT);
  286.     }
  287.     }
  288.     if (maxval < 255) {
  289.     pnm_promoteformat(mf->rgb_data, x, y, maxval, format, 255, format);
  290.     maxval = 255;
  291.     }
  292.     /*
  293.      * if this is the first frame read, set the global frame size
  294.      */
  295.     Fsize_Note(mf->id, x, y);
  296.  
  297.     mf->rgb_maxval = maxval;
  298.     mf->rgb_format = PPM_FORMAT;
  299. }
  300.  
  301.  
  302.  
  303. /*===========================================================================*
  304.  *
  305.  * ReadIOConvert
  306.  *
  307.  *    do conversion; return a pointer to the appropriate file
  308.  *
  309.  * RETURNS:    pointer to the appropriate file
  310.  *
  311.  * SIDE EFFECTS:    none
  312.  *
  313.  *===========================================================================*/
  314. FILE *
  315. ReadIOConvert(fileName)
  316.     char *fileName;
  317. {
  318.     FILE    *ifp;
  319.     char    command[1024];
  320.     char    fullFileName[1024];
  321.     char *convertPtr, *commandPtr, *charPtr;
  322.  
  323.     sprintf(fullFileName, "%s/%s", currentPath, fileName);
  324.  
  325. #ifdef BLEAH
  326.     if ( ! childProcess ) {
  327.     fprintf(stdout, "+++++READING (IO CONVERT) Frame %d  (type %d):  %s\n", frame->id,
  328.         frame->type, fullFileName); }
  329. #endif
  330.  
  331.     if ( strcmp(ioConversion, "*") == 0 ) {
  332.     ifp = fopen(fullFileName, "r");
  333.  
  334.     ERRCHK(ifp, "fopen");
  335.  
  336.     return ifp;
  337.     }
  338.  
  339.     /* replace every occurrence of '*' with fullFileName */
  340.     convertPtr = ioConversion;
  341.     commandPtr = command;
  342.     while ( *convertPtr != '\0' ) {
  343.     while ( (*convertPtr != '\0') && (*convertPtr != '*') ) {
  344.         *commandPtr = *convertPtr;
  345.         commandPtr++;
  346.         convertPtr++;
  347.     }
  348.  
  349.     if ( *convertPtr == '*' ) {
  350.         /* copy fullFileName */
  351.         charPtr = fullFileName;
  352.         while ( *charPtr != '\0' ) {
  353.         *commandPtr = *charPtr;
  354.         commandPtr++;
  355.         charPtr++;
  356.         }
  357.  
  358.         convertPtr++;   /* go past '*' */
  359.     }
  360.     }
  361.     *commandPtr = '\0';
  362.  
  363.     if ( (ifp = popen(command, "r")) == NULL ) {
  364.     fprintf(stderr, "ERROR:  Couldn't execute input conversion command:\n");
  365.     fprintf(stderr, "\t%s\n", command);
  366.     fprintf(stderr, "errno = %d\n", errno);
  367.     if ( ioServer ) {
  368.         fprintf(stderr, "IO SERVER:  EXITING!!!\n");
  369.     } else {
  370.         fprintf(stderr, "SLAVE EXITING!!!\n");
  371.     }
  372.     exit(1);
  373.     }
  374.  
  375.     return ifp;
  376. }
  377.  
  378.  
  379.  
  380. /*===========================================================================*
  381.  *
  382.  * ReadPPM
  383.  *
  384.  *    read a PPM file
  385.  *
  386.  * RETURNS:    TRUE if successful; FALSE otherwise; mf modified
  387.  *
  388.  * SIDE EFFECTS:    none
  389.  *
  390.  *===========================================================================*/
  391. static boolean
  392. ReadPPM(mf, fpointer)
  393.     MpegFrame *mf;
  394.     FILE *fpointer;
  395. {
  396.     char    input[256];
  397.     int        height, width, maxVal;
  398.     uint8   junk[4096];
  399.     register int y;
  400.  
  401.     if ( fread(input, sizeof(char), 2, fpointer) != 2 ) {
  402.     return FALSE;
  403.     }
  404.  
  405.     if ( strncmp(input, "P6", 2) != 0 )    {    /* magic number */
  406.     return FALSE;
  407.     }
  408.  
  409.     width = ReadNextInteger(fpointer);
  410.     if ( width == -1 ) {
  411.         return FALSE;
  412.     }
  413.  
  414.     height = ReadNextInteger(fpointer);
  415.     if ( height == -1 ) {
  416.     return FALSE;
  417.     }
  418.  
  419.     maxVal = ReadNextInteger(fpointer);
  420.     if ( maxVal == -1 ) {
  421.     return FALSE;
  422.     }
  423.  
  424.     Fsize_Note(mf->id, width, height);
  425.  
  426.     mf->rgb_maxval = maxVal;
  427.  
  428.     Frame_AllocPPM(mf);
  429.  
  430.     for ( y = 0; y < Fsize_y; y++ ) {
  431.     fread(mf->ppm_data[y], sizeof(char), 3*Fsize_x, fpointer);
  432.  
  433.     /* read the leftover stuff on the right side */
  434.     fread(junk, sizeof(char), 3*(width-Fsize_x), fpointer);
  435.     }
  436.  
  437.     return TRUE;
  438. }
  439.  
  440.  
  441. /*===========================================================================*
  442.  *
  443.  * ReadYUV
  444.  *
  445.  *    read a YUV file
  446.  *
  447.  * RETURNS:    mf modified
  448.  *
  449.  * SIDE EFFECTS:    none
  450.  *
  451.  *===========================================================================*/
  452. static void
  453. ReadYUV(mf, fpointer, width, height)
  454.     MpegFrame *mf;
  455.     FILE *fpointer;
  456.     int width;
  457.     int height;
  458. {
  459.     register int y;
  460.  
  461.     Fsize_Note(mf->id, width, height);
  462.  
  463.     Frame_AllocYCC(mf);
  464.  
  465.     for (y = 0; y < height; y++) {            /* Y */
  466.     fread(mf->orig_y[y], 1, width, fpointer);
  467.     }
  468.  
  469.     for (y = 0; y < height / 2; y++) {            /* U */
  470.     fread(mf->orig_cb[y], 1, width / 2, fpointer);
  471.     }
  472.  
  473.     for (y = 0; y < height / 2; y++) {            /* V */
  474.     fread(mf->orig_cr[y], 1, width / 2, fpointer);
  475.     }
  476. }
  477.  
  478.  
  479. /*=====================*
  480.  * INTERNAL PROCEDURES *
  481.  *=====================*/
  482.  
  483. /*===========================================================================*
  484.  *
  485.  * ReadNextInteger
  486.  *
  487.  *    read an integer from a file, ignoring whitespace
  488.  *
  489.  * RETURNS:    the integer, or -1 if end of file is reached first
  490.  *
  491.  * SIDE EFFECTS:    file stream munched a bit
  492.  *
  493.  *===========================================================================*/
  494. static int
  495. ReadNextInteger(fpointer)
  496.     FILE *fpointer;
  497. {
  498.     char    input[256];
  499.     int        index;
  500.  
  501.     /* skip whitespace */
  502.     while ( fgets(input, 2, fpointer) != NULL ) {
  503.     if ( isspace(input[0]) ) {
  504.         continue;
  505.     }
  506.  
  507.     /* read rest of integer */
  508.     index = 1;
  509.     while ( fgets(&input[index], 2, fpointer) != NULL ) {
  510.         if ( isspace(input[index]) ) {
  511.         break;
  512.         }
  513.         index++;
  514.     }
  515.     input[index] = '\0';
  516.  
  517.     return atoi(input);
  518.     }
  519.  
  520.     return -1;        /* end of file reached */
  521. }
  522.