/* * vidinput_names.cxx * * Classes to support streaming video input (grabbing) and output. * * Portable Windows Library * * Copyright (c) 1993-2000 Equivalence Pty. Ltd. * * The contents of this file are subject to the Mozilla Public License * Version 1.0 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See * the License for the specific language governing rights and limitations * under the License. * * The Original Code is Portable Windows Library. * * The Initial Developer of the Original Code is Equivalence Pty. Ltd. * * Contributor(s): Derek Smithies (derek@indranet.co.nz) * Mark Cooke (mpc@star.sr.bham.ac.uk) * Nicola Orru' * * $Log: vidinput_names.cxx,v $ * Revision 1.4.4.2 2007/01/03 22:37:37 dsandras * Backports from HEAD. * * Revision 1.4.4.1 2006/11/28 21:07:03 dsandras * Added a few missing mutexes in order to prevent collection * corruption when the update is called from different threads. * Hopefully fixes Ekiga report #376078. * * Revision 1.4 2006/01/07 16:09:58 dsandras * Removed name duplication for now. * * Revision 1.3 2005/11/30 12:47:39 csoutheren * Removed tabs, reformatted some code, and changed tags for Doxygen * * Revision 1.2 2004/11/07 22:48:47 dominance * fixed copyright of v4l2 plugin. Last commit's credits go to Nicola Orru' ... * */ #include "vidinput_names.h" void V4LXNames::ReadDeviceDirectory(PDirectory devdir, POrdinalToString & vid) { if (!devdir.Open()) return; do { PString filename = devdir.GetEntryName(); PString devname = devdir + filename; if (devdir.IsSubDir()) ReadDeviceDirectory(devname, vid); else { PFileInfo info; if (devdir.GetInfo(info) && info.type == PFileInfo::CharDevice) { struct stat s; if (lstat(devname, &s) == 0) { static const int deviceNumbers[] = { 81 }; for (PINDEX i = 0; i < PARRAYSIZE(deviceNumbers); i++) { if (MAJOR(s.st_rdev) == deviceNumbers[i]) { PINDEX num = MINOR(s.st_rdev); if (num <= 63 && num >= 0) { vid.SetAt(num, devname); } } } } } } } while (devdir.Next()); } void V4LXNames::PopulateDictionary() { PWaitAndSignal m(mutex); PINDEX i, j; PStringToString tempList; for (i = 0; i < inputDeviceNames.GetSize(); i++) { PString ufname = BuildUserFriendly(inputDeviceNames[i]); tempList.SetAt(inputDeviceNames[i], ufname); } //Now, we need to cope with the case where there are two video //devices available, which both have the same user friendly name. //Matching user friendly names have a (X) appended to the name. for (i = 0; i < tempList.GetSize(); i++) { PString userName = tempList.GetDataAt(i); PINDEX matches = 1; for (j = i + 1; j < tempList.GetSize(); j++) { if (tempList.GetDataAt(j) == userName) { matches++; PStringStream revisedUserName; revisedUserName << userName << " (" << matches << ")"; tempList.SetDataAt(j, revisedUserName); } } } //At this stage, we have correctly modified the temp list of names. for (j = 0; j < tempList.GetSize(); j++) AddUserDeviceName(tempList.GetDataAt(j), tempList.GetKeyAt(j)); } PString V4LXNames::GetUserFriendly(PString devName) { PWaitAndSignal m(mutex); PString result= deviceKey(devName); if (result.IsEmpty()) return devName; return result; } PString V4LXNames::GetDeviceName(PString userName) { PWaitAndSignal m(mutex); for (PINDEX i = 0; i < userKey.GetSize(); i++) if (userKey.GetKeyAt(i).Find(userName) != P_MAX_INDEX) return userKey.GetDataAt(i); return userName; } void V4LXNames::AddUserDeviceName(PString userName, PString devName) { PWaitAndSignal m(mutex); if (userName != devName) { // must be a real userName! userKey.SetAt(userName, devName); deviceKey.SetAt(devName, userName); } else { // we didn't find a good userName if (!deviceKey.Contains (devName)) { // never met before: fallback userKey.SetAt(userName, devName); deviceKey.SetAt(devName, userName); } // no else: we already know the pair } } PStringList V4LXNames::GetInputDeviceNames() { PWaitAndSignal m(mutex); PStringList result; for (PINDEX i = 0; i < inputDeviceNames.GetSize(); i++) { result += GetUserFriendly (inputDeviceNames[i]); } return result; }