Changeset 4761

Show
Ignore:
Timestamp:
04/06/10 21:06:53 (4 years ago)
Author:
turam
Message:

Properly map input pins to output pins (e.g. Winnov Videum); Select currently selected port in Port menu; Sort Device menu

Location:
vic/branches/mpeg4
Files:
3 modified

Legend:

Unmodified
Added
Removed
  • vic/branches/mpeg4/tcl/ui-ctrlmenu.tcl

    r4706 r4761  
    799799} 
    800800 
     801proc compare {a b} { 
     802 
     803        return [string compare [$a nickname] [$b nickname]] 
     804 
     805    set a0 [$a nickname] 
     806 
     807    set b0 [$b nickname] 
     808 
     809    if {$a0 < $b0} { 
     810 
     811        return -1 
     812 
     813    } elseif {$a0 > $b0} { 
     814 
     815        return 1 
     816 
     817    } 
     818 
     819    return 0 
     820 
     821} 
     822 
     823 
     824 
    801825proc build.device w { 
    802826        set f [smallfont] 
     
    833857                return 
    834858        } 
    835         foreach d $inputDeviceList { 
     859         
     860    set inputDeviceListSorted [lsort -command compare $inputDeviceList] 
     861        foreach d $inputDeviceListSorted { 
    836862                if { [$d nickname] == "still" && ![yesno stillGrabber] } { 
    837863                        set defaultFormat($d) $videoFormat 
     
    10871113                                set defaultPort($device) $s 
    10881114                        } else { 
    1089                                 set defaultPort($device) [lindex $portnames 0] 
     1115                                # use current port setting 
     1116                                set s [string trim [attribute_class [$device attributes] selected_port]] 
     1117                                if { $s != "" } { 
     1118                                        set defaultPort($device) $s 
     1119                                } else { 
     1120                                        set defaultPort($device) [lindex $portnames 0] 
     1121                                } 
    10901122                        } 
    10911123                } 
     
    19281960        set_dither 
    19291961} 
    1930  
  • vic/branches/mpeg4/video/grabber-win32DS.cpp

    r4750 r4761  
    213213   capturing_=0; 
    214214   max_fps_ = 30; 
    215  
    216215   memset(inputPorts, 0, NUM_PORTS); 
    217216        
     
    522521    IAMCrossbar *xb; 
    523522 
     523        long tmp_input_port; 
     524 
    524525    if( crossbar_ == NULL ) return; 
    525526 
    526527    xb = crossbar_->getXBar(); 
    527528 
    528     xb->get_IsRoutedTo(0, &input); 
    529     debug_msg("DirectShowGrabber::routeCrossbar():  pin %d is routed to output pin 0\n", input); 
    530529 
    531530    hr = xb->get_PinCounts(&output, &input); 
     531        debug_msg("num input %d num output %d", input, output); 
     532 
     533 
     534        long selectedPort = -1; 
     535        long inport = -1; 
     536    for( int i = 0; i < output; ++i ) { 
     537                xb->get_IsRoutedTo(i, &inport); 
     538                debug_msg("DirectShowGrabber::routeCrossbar():  input pin %d is mapped to output pin %d\n", inport, i); 
     539                if( inport >= 0 ) 
     540                        selectedPort = inport; 
     541    } 
     542 
     543 
    532544    if(initializedPorts == 0) { 
    533         initializedPorts=1; 
    534         svideoPortNum = 1; 
    535         compositePortNum = 1; 
    536         numInputPorts = 0; 
    537         for( int i = 0; i < input; ++i ) { 
    538             xb->get_CrossbarPinInfo(TRUE, i, &related, &pinType); 
    539             if( pinType == PhysConn_Video_SVideo ) { 
    540                 debug_msg("Found svideo port %d\n", svideoPortNum); 
    541                 inputPorts[numInputPorts] = new Port(); 
    542                 inputPorts[numInputPorts]->id = i; 
    543                 if( svideoPortNum > 1 ) 
    544                     sprintf(inputPorts[numInputPorts]->name,"S-Video%d", svideoPortNum ); 
    545                 else 
    546                     strcpy(inputPorts[numInputPorts]->name,"S-Video"); 
    547                 numInputPorts++; 
    548                 svideoPortNum++; 
    549  
    550             } 
    551             if( pinType == PhysConn_Video_Composite ) { 
    552                 debug_msg("Found composite port %d\n", compositePortNum); 
    553                 inputPorts[numInputPorts] = new Port(); 
    554                 inputPorts[numInputPorts]->id = i; 
    555                 if(compositePortNum > 1 ) 
    556                     sprintf(inputPorts[numInputPorts]->name,"Composite%d", compositePortNum); 
    557                 else 
    558                     strcpy(inputPorts[numInputPorts]->name,"Composite"); 
    559                 numInputPorts++; 
    560                 compositePortNum++; 
    561             } 
     545                initializedPorts=1; 
     546                svideoPortNum = 1; 
     547                compositePortNum = 1; 
     548                numInputPorts = 0; 
     549                for( int i = 0; i < input; ++i ) { 
     550                        xb->get_CrossbarPinInfo(TRUE, i, &related, &pinType); 
     551                        if( pinType == PhysConn_Video_SVideo ) { 
     552                                debug_msg("Found svideo port %d\n", svideoPortNum); 
     553                                inputPorts[numInputPorts] = new Port(); 
     554                                inputPorts[numInputPorts]->id = i; 
     555                                if( svideoPortNum > 1 ) 
     556                                        sprintf(inputPorts[numInputPorts]->name,"S-Video%d", svideoPortNum ); 
     557                                else 
     558                                        strcpy(inputPorts[numInputPorts]->name,"S-Video"); 
     559                                if( selectedPort == i ) 
     560                                        strcpy(input_port_, inputPorts[numInputPorts]->name); 
     561                                numInputPorts++; 
     562                                svideoPortNum++; 
     563 
     564                        } 
     565                        if( pinType == PhysConn_Video_Composite ) { 
     566                                debug_msg("Found composite port %d\n", compositePortNum); 
     567                                inputPorts[numInputPorts] = new Port(); 
     568                                inputPorts[numInputPorts]->id = i; 
     569                                if(compositePortNum > 1 ) 
     570                                        sprintf(inputPorts[numInputPorts]->name,"Composite%d", compositePortNum); 
     571                                else 
     572                                        strcpy(inputPorts[numInputPorts]->name,"Composite"); 
     573                                if( selectedPort == i ) 
     574                                        strcpy(input_port_, inputPorts[numInputPorts]->name); 
     575                                numInputPorts++; 
     576                                compositePortNum++; 
     577                        } 
     578                } 
    562579        } 
     580 
     581    for( int i = 0; i < output; ++i ) { 
     582                xb->get_CrossbarPinInfo(FALSE, i, &related, &pinType); 
     583                if( pinType == PhysConn_Video_VideoDecoder ) { 
     584                        videoDecoderPort = i; 
     585                        break; 
     586                } 
    563587    } 
    564588 
    565     for( int i = 0; i < output; ++i ) { 
    566         xb->get_CrossbarPinInfo(FALSE, i, &related, &pinType); 
    567         if( pinType == PhysConn_Video_VideoDecoder ) { 
    568             videoDecoderPort = i; 
    569             break; 
    570         } 
     589    port = -1; 
     590    for( int i=0; i<numInputPorts; i++) { 
     591                if (strcmp(input_port_,inputPorts[i]->name) == 0) { 
     592                        port = inputPorts[i]->id; 
     593                        break; 
     594                } 
    571595    } 
    572  
    573     port = 0; 
    574     for( int i=0; i<numInputPorts; i++) { 
    575         if (strcmp(input_port_,inputPorts[i]->name) == 0) { 
    576             port = inputPorts[i]->id; 
    577             break; 
    578         } 
     596    if( port == -1 ) {  
     597                debug_msg("**** Failed to find port for %s\n", input_port_); 
     598                return; 
    579599    } 
    580     if( port == 0 ) {  
    581         debug_msg("**** Failed to find port for %s\n", input_port_); 
    582     } 
    583600 
    584601    if( xb->CanRoute(videoDecoderPort, port) == S_FALSE ) 
    585         debug_msg("DirectShowGrabber::routeCrossbar():  cannot route input pin %d to output pin %d\n", port, videoDecoderPort); 
     602                debug_msg("DirectShowGrabber::routeCrossbar():  cannot route input pin %d to output pin %d\n", port, videoDecoderPort); 
    586603    else { 
    587         debug_msg("DirectShowGrabber::routeCrossbar() routing pin %d to pin %d\n", port, videoDecoderPort); 
    588         hr = xb->Route(videoDecoderPort, port); 
    589         //showErrorMessage(hr); 
     604                debug_msg("DirectShowGrabber::routeCrossbar() routing pin %d to pin %d\n", port, videoDecoderPort); 
     605                hr = xb->Route(videoDecoderPort, port); 
     606                //showErrorMessage(hr); 
    590607    } 
    591608 
     
    11711188       strcat(attri_, "external-in "); 
    11721189   } 
     1190   debug_msg("new DirectShowDevice():  after appending ports\n"); 
    11731191 
    11741192   strcat(attri_, "} "); 
     1193 
     1194   char *inport = o.getInputPort(); 
     1195   sprintf(attri_, "%s selected_port { %s }", attri_, inport ); 
     1196   free(inport); 
    11751197   attributes_ = attri_; 
     1198   debug_msg("attributes: %s", attributes_); 
    11761199} 
    11771200 
  • vic/branches/mpeg4/video/grabber-win32DS.h

    r4744 r4761  
    8787 
    8888class Callback; 
    89  
    9089struct Port { 
    9190       int id; 
     
    128127                  return inputPorts; 
    129128          } 
    130  
     129          char *                getInputPort(){ 
     130                  return strdup(input_port_); 
     131          } 
    131132      int          capturing_; 
    132133      HANDLE       cb_mutex_; 
     
    255256 
    256257}; 
     258 
     259