home *** CD-ROM | disk | FTP | other *** search
/ SGI Developer Toolbox 6.1 / SGI Developer Toolbox 6.1 - Disc 4.iso / src / exampleCode / video / security / compressPanel.C < prev    next >
Encoding:
C/C++ Source or Header  |  1994-08-02  |  7.7 KB  |  270 lines

  1. /*
  2.  * Copyright (C) 1994, Silicon Graphics, Inc.
  3.  * All Rights Reserved.
  4.  *
  5.  * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.;
  6.  * the contents of this file may not be disclosed to third parties, copied or
  7.  * duplicated in any form, in whole or in part, without the prior written
  8.  * permission of Silicon Graphics, Inc.
  9.  *
  10.  * RESTRICTED RIGHTS LEGEND:
  11.  * Use, duplication or disclosure by the Government is subject to restrictions
  12.  * as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data
  13.  * and Computer Software clause at DFARS 252.227-7013, and/or in similar or
  14.  * successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished -
  15.  * rights reserved under the Copyright Laws of the United States.
  16.  */
  17. #include "compressPanel.h"
  18. #include <Xm/Form.h>
  19. #include <Xm/Text.h>
  20. #include <Xm/Label.h>
  21. #include <string.h>
  22. #include <malloc.h>
  23. #include <stdio.h>
  24.  
  25. int CompressPanel::_currentAlg = 0;
  26.  
  27. CompressPanel::CompressPanel(const char *name, Widget parent) :  VkComponent(name)
  28. {
  29.   int i,j,n,*clBuffer;
  30.   Arg args[12];
  31.   XmString ptr;
  32.   _baseWidget = XmCreateForm(parent, _name, NULL,0);
  33.   installDestroyHandler();
  34.   _filename = NULL;
  35.   _bufferLength = clQueryAlgorithms(CL_VIDEO, NULL, 0);
  36.   clBuffer = new int[_bufferLength];
  37.   clQueryAlgorithms(CL_VIDEO, clBuffer, _bufferLength);
  38.   _nAlgs = 0; 
  39. #ifdef QT
  40.   _nAlgs = 2;
  41. #endif
  42.   for(i=0; i<_bufferLength/2; i++){
  43.     if(validCompression(&clBuffer[2*i])){
  44.       _nAlgs++;
  45.     }
  46.   }
  47.   _algs = (char **)malloc(_nAlgs * sizeof(char *));
  48.   for(i=0, j=0; i < _bufferLength/2; i++){
  49.     if(validCompression(&clBuffer[2*i])){
  50.       _algs[j++] = strdup((char *)clBuffer[2*i]);
  51.     }
  52.   }
  53. #ifdef QT
  54.   _algs[j++] = strdup("Apple Video");
  55.   _algs[j++] = strdup("Apple Animation");
  56. #endif
  57.   n = 0;
  58.   XtSetArg(args[n],XmNbuttonCount,_nAlgs);n++;
  59.   buttonLabels = (XmString *)malloc(_nAlgs * sizeof(XmString));
  60.   for(i=0; i<_nAlgs; i++){
  61.     buttonLabels[i] = XmStringCreateSimple(_algs[i]);
  62.   }
  63.   XtSetArg(args[n],XmNbuttons,buttonLabels);n++;
  64.   XtSetArg(args[n],XmNbuttonSet,0);n++;
  65.   XmString optionLabel = XmStringCreateSimple("Compression");
  66.   XtSetArg(args[n],XmNoptionLabel,optionLabel);n++;
  67.   XtSetArg(args[n],XmNsimpleCallback,&CompressPanel::actCallback);n++;
  68.   XtSetArg(args[n],XmNtopAttachment,XmATTACH_FORM);n++;
  69.   XtSetArg(args[n],XmNleftAttachment,XmATTACH_FORM);n++;
  70.   XtSetArg(args[n],XmNrightAttachment,XmATTACH_FORM);n++;
  71.   _X_compressMenu = XmCreateSimpleOptionMenu(_baseWidget, "menu",args,n);
  72.   XtManageChild(_X_compressMenu);
  73.   XmStringFree(optionLabel);
  74.   delete [] clBuffer;
  75. // add Filename widgets
  76.   n = 0;
  77.   ptr = XmStringCreate("Filename", XmSTRING_DEFAULT_CHARSET);
  78.   XtSetArg(args[n],XmNlabelString,ptr);n++;
  79.   XtSetArg(args[n],XmNtopAttachment,XmATTACH_WIDGET);n++;
  80.   XtSetArg(args[n],XmNtopWidget,_X_compressMenu);n++;
  81.   XtSetArg(args[n],XmNleftAttachment,XmATTACH_FORM);n++;
  82.   XtSetArg(args[n],XmNrightAttachment,XmATTACH_NONE);n++;
  83.   Widget lab1 = XmCreateLabel(_baseWidget,"lab1",args,n);
  84.   XtManageChild(lab1);
  85.   XmStringFree(ptr);
  86.   n = 0;
  87.   XtSetArg(args[n],XmNtopAttachment,XmATTACH_WIDGET);n++;
  88.   XtSetArg(args[n],XmNtopWidget,_X_compressMenu);n++;
  89.   XtSetArg(args[n],XmNleftAttachment,XmATTACH_WIDGET);n++;
  90.   XtSetArg(args[n],XmNleftWidget,lab1);n++;
  91.   XtSetArg(args[n],XmNrightAttachment,XmATTACH_FORM);n++;
  92.   _X_filename = XmCreateText(_baseWidget, "name",args,n);
  93.   XtManageChild(_X_filename);
  94.   XtAddCallback(_X_filename, XmNactivateCallback,
  95.         &CompressPanel::fileCallback, (XtPointer)this);
  96.   XtAddCallback(_X_filename, XmNlosingFocusCallback,
  97.         &CompressPanel::fileCallback, (XtPointer)this);
  98. // Add frame rate info
  99.    n = 0;
  100.   ptr = XmStringCreate("Frame Rate", XmSTRING_DEFAULT_CHARSET);
  101.   XtSetArg(args[n],XmNlabelString,ptr);n++;
  102.   XtSetArg(args[n],XmNtopAttachment,XmATTACH_WIDGET);n++;
  103.   XtSetArg(args[n],XmNtopWidget,_X_filename);n++;
  104.   XtSetArg(args[n],XmNleftAttachment,XmATTACH_FORM);n++;
  105.   XtSetArg(args[n],XmNrightAttachment,XmATTACH_NONE);n++;
  106.   _X_framelabel = XmCreateLabel(_baseWidget,"lab2",args,n);
  107.   XtManageChild(_X_framelabel);
  108.   XmStringFree(ptr);
  109.   n = 0;
  110.   XtSetArg(args[n],XmNtopAttachment,XmATTACH_WIDGET);n++;
  111.   XtSetArg(args[n],XmNtopWidget,_X_filename);n++;
  112.   XtSetArg(args[n],XmNleftAttachment,XmATTACH_WIDGET);n++;
  113.   XtSetArg(args[n],XmNleftWidget,_X_framelabel);n++;
  114.   XtSetArg(args[n],XmNrightAttachment,XmATTACH_NONE);n++;
  115.   XtSetArg(args[n],XmNcolumns,10);n++;
  116.   _X_framerate = XmCreateText(_baseWidget, "rate",args,n);
  117.   XtManageChild(_X_framerate);
  118.   XtAddCallback(_X_framerate, XmNactivateCallback,
  119.         &CompressPanel::rateCallback, (XtPointer)this);
  120.   XtAddCallback(_X_framerate, XmNlosingFocusCallback,
  121.         &CompressPanel::rateCallback, (XtPointer)this);
  122. }
  123.  
  124. CompressPanel::~CompressPanel()
  125. {
  126.   int i;
  127.   for(i=0; i< getNumAlgs(); i++){
  128.     free(buttonLabels[i]);
  129.   }
  130.   free (buttonLabels);
  131.   for(i=0; i < getNumAlgs(); i++){
  132.     free ((void *)_algs[i]);
  133.   }
  134.   free((void *)_algs);
  135.   free (_filename);
  136. }
  137.  
  138. char *
  139. CompressPanel::getCompressor(int num)
  140. {
  141.   if(num >= _nAlgs) return NULL;
  142.   return strdup(_algs[num]);
  143. }
  144.  
  145. char *
  146. CompressPanel::getCurrentCompressor()
  147. {
  148.   return getCompressor(_currentAlg);
  149. }
  150.  
  151. int
  152. CompressPanel::validCompression(int *v)
  153. {
  154.   if(v[1] != CL_CODEC && v[1] != CL_COMPRESSOR) return (FALSE);
  155.   if(strcmp((char *)v[0], "RTR") == 0) return (FALSE);
  156.   if(strcmp((char *)v[0], "HDCC") == 0) return (FALSE);
  157.   if(strcmp((char *)v[0], "HwJpeg") == 0) return (FALSE);
  158.   return(TRUE);
  159. }
  160.  
  161. const char *CompressPanel::className()
  162. {
  163.   return "CompressPanel";
  164. }
  165.  
  166. void CompressPanel::actCallback(Widget, XtPointer clientData, XtPointer)
  167. {
  168.   int button = (int)clientData;
  169.   _currentAlg = button;
  170. }
  171.                 
  172. void CompressPanel::setFileName(char *n)
  173. {
  174.   Arg args[1];
  175.   if(_filename) free (_filename);
  176.   if(n){
  177.     _filename = strdup(n);
  178.     XtSetArg(args[0],XmNvalue,n);
  179.     XtSetValues(_X_filename,args,1);
  180.   }else{
  181.     XtSetArg(args[0],XmNvalue,"");
  182.     XtSetValues(_X_filename,args,1);
  183.     _filename = NULL;
  184.   }
  185. }
  186.  
  187. char *
  188. CompressPanel::getFileName()
  189. {
  190.   if(_filename){
  191.     return strdup(_filename);
  192.   }else{
  193.     return NULL;
  194.   }
  195. }
  196.  
  197. void CompressPanel::fileCallback(Widget w, XtPointer clientData, XtPointer)
  198. {
  199.   CompressPanel *obj = (CompressPanel *)clientData;
  200.   String str;
  201.   Arg args[1];
  202.   XtSetArg(args[0], XmNvalue, &str);
  203.   XtGetValues(w,args,1);
  204.   obj->setFileName((char *)str);
  205.   free(str);
  206. }
  207.  
  208. void CompressPanel::setFrameRate(float x)
  209. {
  210.   Arg args[1];
  211.   char str[6];
  212.   _rate = x;
  213.   sprintf(str,"%4.2f",_rate);
  214.   if(_rate < 0){
  215.     XtUnmanageChild(_X_framerate);
  216.     XtUnmanageChild(_X_framelabel);
  217.   }
  218.   XtSetArg(args[0],XmNvalue,str);
  219.   XtSetValues(_X_framerate,args,1);
  220. }
  221.  
  222. void CompressPanel::rateCallback(Widget w, XtPointer clientData, XtPointer)
  223. {
  224.   CompressPanel *obj = (CompressPanel *)clientData;
  225.   String str;
  226.   float val;
  227.   Arg args[1];
  228.   XtSetArg(args[0], XmNvalue, &str);
  229.   XtGetValues(w,args,1);
  230.   sscanf(str,"%f",&val);
  231.   obj->setFrameRate(val);
  232.   free(str);
  233. }
  234.  
  235. void CompressPanel::setCompressor(char *str)
  236. {
  237.   Arg args[3];
  238.   char *str2;
  239.   XmString xmStr, newStr;
  240.   Widget w,*wList;
  241.   int nList, i;
  242.   xmStr = XmStringCreateSimple(str);
  243. // Get the menu Widget
  244.   XtSetArg(args[0],XmNsubMenuId,&w);
  245.   XtGetValues(_X_compressMenu,args,1);
  246. // Now get the list of children
  247.   XtSetArg(args[0],XmNchildren,&wList);
  248.   XtSetArg(args[1],XmNnumChildren,&nList);
  249.   XtGetValues(w,args,2);
  250.   for(i = 0; i < nList; i++){
  251. // Is the labelString of the child == str ?
  252.     XtSetArg(args[0],XmNlabelString,&newStr);
  253.     XtGetValues(wList[i],args,1);
  254.     if(newStr){
  255.       if(XmStringCompare(newStr,xmStr)){
  256.     XtSetArg(args[0],XmNmenuHistory,wList[i]);
  257.     XtSetValues(_X_compressMenu,args,1);
  258.       }
  259.       XmStringFree(newStr);
  260.     }
  261.   }
  262.   XmStringFree(xmStr);
  263. // now set the _currentAlg
  264.   for(i = 0; i < getNumAlgs(); i++){
  265.     str2 = getCompressor(i);
  266.     if(strcmp(str2,str) == 0) _currentAlg = i;
  267.     free(str2);
  268.   }
  269. }
  270.