video_dialog.cpp
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:24k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*
  2.  * The contents of this file are subject to the Mozilla Public
  3.  * License Version 1.1 (the "License"); you may not use this file
  4.  * except in compliance with the License. You may obtain a copy of
  5.  * the License at http://www.mozilla.org/MPL/
  6.  * 
  7.  * Software distributed under the License is distributed on an "AS
  8.  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
  9.  * implied. See the License for the specific language governing
  10.  * rights and limitations under the License.
  11.  * 
  12.  * The Original Code is MPEG4IP.
  13.  * 
  14.  * The Initial Developer of the Original Code is Cisco Systems Inc.
  15.  * Portions created by Cisco Systems Inc. are
  16.  * Copyright (C) Cisco Systems Inc. 2001.  All Rights Reserved.
  17.  * 
  18.  * Contributor(s): 
  19.  * Dave Mackie dmackie@cisco.com
  20.  * Bill May  wmay@cisco.com
  21.  */
  22. #define __STDC_LIMIT_MACROS
  23. #include "mp4live.h"
  24. #include "mp4live_gui.h"
  25. #include "video_v4l_source.h"
  26. static GtkWidget *dialog;
  27. static char* source_type;
  28. static char* source_name;
  29. static GtkWidget *source_combo;
  30. static GtkWidget *source_entry;
  31. static GtkWidget *source_list;
  32. static GtkWidget *browse_button;
  33. static bool source_modified;
  34. static bool default_file_audio_dialog = false;
  35. static int32_t default_file_audio_source = -1;
  36. static GtkWidget *input_label;
  37. static GtkWidget *input_menu;
  38. static GtkWidget *signal_label;
  39. static GtkWidget *signal_menu;
  40. static GSList* signal_menu_items;
  41. static GtkWidget *channel_list_label;
  42. static GtkWidget *channel_list_menu;
  43. static GtkWidget *channel_label;
  44. static GtkWidget *channel_combo;
  45. static GtkWidget *track_label;
  46. static GtkWidget *track_menu;
  47. static GtkWidget *size_menu;
  48. static GtkWidget *aspect_menu;
  49. static GtkObject *frame_rate_ntsc_adjustment;
  50. static GtkObject *frame_rate_pal_adjustment;
  51. static GtkWidget *frame_rate_spinner;
  52. static GtkWidget *bit_rate_spinner;
  53. static CVideoCapabilities* pVideoCaps;
  54. static char** inputNames = NULL;
  55. static u_int8_t inputIndex = 0;
  56. static u_int8_t inputNumber = 0; // how many inputs total
  57. static char* signalNames[] = {
  58. "PAL", "NTSC", "SECAM"
  59. };
  60. static u_int8_t signalIndex;
  61. static u_int8_t channelListIndex;
  62. static u_int8_t channelIndex;
  63. static u_int32_t trackIndex;
  64. static u_int32_t trackNumber; // how many tracks total
  65. static u_int32_t* trackValues = NULL;
  66. static u_int16_t sizeWidthValues[] = {
  67. 128, 176, 320, 352, 352,
  68. 640, 704, 704, 720, 720, 768
  69. };
  70. static u_int16_t sizeHeightValues[] = {
  71. 96, 144, 240, 288, 480,
  72. 480, 480, 576, 480, 576, 576
  73. };
  74. static char* sizeNames[] = {
  75. "128 x 96 SQCIF", 
  76. "176 x 144 QCIF",
  77. "320 x 240 SIF",
  78. "352 x 288 CIF",
  79. "352 x 480 Half D1",
  80. "640 x 480 4SIF",
  81. "704 x 480 D1",
  82. "704 x 576 4CIF",
  83. "720 x 480 NTSC CCIR601",
  84. "720 x 576 PAL CCIR601",
  85. "768 x 576 PAL SQ Pixel"
  86. };
  87. static u_int8_t sizeIndex;
  88. static u_int8_t sizeMaxIndex;
  89. static float aspectValues[] = {
  90. VIDEO_STD_ASPECT_RATIO, VIDEO_LB1_ASPECT_RATIO, 
  91. VIDEO_LB2_ASPECT_RATIO, VIDEO_LB3_ASPECT_RATIO
  92. }; 
  93. static char* aspectNames[] = {
  94. "Standard 4:3", "Letterbox 2.35", "Letterbox 1.85", "HDTV 16:9"
  95. };
  96. static u_int8_t aspectIndex;
  97. // forward declarations
  98. static void SetAvailableSignals(void);
  99. static void on_destroy_dialog (GtkWidget *widget, gpointer *data)
  100. {
  101. gtk_grab_remove(dialog);
  102. gtk_widget_destroy(dialog);
  103. dialog = NULL;
  104. static bool SourceIsDevice()
  105. {
  106. return IsDevice(gtk_entry_get_text(GTK_ENTRY(source_entry)));
  107. }
  108. static void ShowSourceSpecificSettings()
  109. {
  110. if (SourceIsDevice()) {
  111. gtk_widget_show(input_label);
  112. gtk_widget_show(input_menu);
  113. gtk_widget_show(signal_label);
  114. gtk_widget_show(signal_menu);
  115. gtk_widget_show(channel_list_label);
  116. gtk_widget_show(channel_list_menu);
  117. gtk_widget_show(channel_label);
  118. gtk_widget_show(channel_combo);
  119. gtk_widget_hide(track_label);
  120. gtk_widget_hide(track_menu);
  121. } else {
  122. gtk_widget_hide(input_label);
  123. gtk_widget_hide(input_menu);
  124. gtk_widget_hide(signal_label);
  125. gtk_widget_hide(signal_menu);
  126. gtk_widget_hide(channel_list_label);
  127. gtk_widget_hide(channel_list_menu);
  128. gtk_widget_hide(channel_label);
  129. gtk_widget_hide(channel_combo);
  130. gtk_widget_show(track_label);
  131. gtk_widget_show(track_menu);
  132. }
  133. }
  134. static void EnableChannels()
  135. {
  136. bool hasTuner = false;
  137. if (pVideoCaps && pVideoCaps->m_inputHasTuners[inputIndex]) {
  138. hasTuner = true;
  139. }
  140. gtk_widget_set_sensitive(GTK_WIDGET(channel_list_menu), hasTuner);
  141. gtk_widget_set_sensitive(GTK_WIDGET(channel_combo), hasTuner);
  142. }
  143. static void ChangeInput(u_int8_t newIndex)
  144. {
  145. inputIndex = newIndex;
  146. SetAvailableSignals();
  147. EnableChannels();
  148. }
  149. static void on_input_menu_activate(GtkWidget *widget, gpointer data)
  150. {
  151. ChangeInput(((unsigned int)data) & 0xFF);
  152. }
  153. void CreateInputMenu(CVideoCapabilities* pNewVideoCaps)
  154. {
  155. u_int8_t newInputNumber;
  156. if (pNewVideoCaps) {
  157. newInputNumber = pNewVideoCaps->m_numInputs;
  158. } else {
  159. newInputNumber = 0;
  160. }
  161. if (inputIndex >= newInputNumber) {
  162. inputIndex = 0; 
  163. }
  164. // create new menu item names
  165. char** newInputNames = (char**)malloc(sizeof(char*) * newInputNumber);
  166. for (u_int8_t i = 0; i < newInputNumber; i++) {
  167. char buf[64];
  168. snprintf(buf, sizeof(buf), "%u - %s",
  169. i, pNewVideoCaps->m_inputNames[i]);
  170. newInputNames[i] = stralloc(buf);
  171. }
  172. // (re)create the menu
  173. input_menu = CreateOptionMenu(
  174. input_menu,
  175. newInputNames, 
  176. newInputNumber,
  177. inputIndex,
  178. GTK_SIGNAL_FUNC(on_input_menu_activate));
  179. // free up old names
  180. for (u_int8_t i = 0; i < inputNumber; i++) {
  181. free(inputNames[i]);
  182. }
  183. free(inputNames);
  184. inputNames = newInputNames;
  185. inputNumber = newInputNumber;
  186. }
  187. static void SourceV4LDevice()
  188. {
  189. char *newSourceName =
  190. gtk_entry_get_text(GTK_ENTRY(source_entry));
  191. // don't probe the already open device!
  192. if (!strcmp(newSourceName, 
  193.   MyConfig->GetStringValue(CONFIG_VIDEO_SOURCE_NAME))) {
  194. return;
  195. }
  196. // probe new source device
  197. CVideoCapabilities* pNewVideoCaps = 
  198. new CVideoCapabilities(newSourceName);
  199. // check for errors
  200. if (!pNewVideoCaps->IsValid()) {
  201. if (!pNewVideoCaps->m_canOpen) {
  202. ShowMessage("Change Video Source",
  203. "Specified video source can't be opened, check name");
  204. } else {
  205. ShowMessage("Change Video Source",
  206. "Specified video source doesn't support capture");
  207. }
  208. delete pNewVideoCaps;
  209. return;
  210. }
  211. // change inputs menu
  212. CreateInputMenu(pNewVideoCaps);
  213. if (pVideoCaps != MyConfig->m_videoCapabilities) {
  214. delete pVideoCaps;
  215. }
  216. pVideoCaps = pNewVideoCaps;
  217. ChangeInput(inputIndex);
  218. }
  219. static void on_yes_default_file_audio_source (GtkWidget *widget, gpointer *data)
  220. {
  221. default_file_audio_source = 
  222. FileDefaultAudio(gtk_entry_get_text(GTK_ENTRY(source_entry)));
  223. default_file_audio_dialog = false;
  224. }
  225. static void on_no_default_file_audio_source (GtkWidget *widget, gpointer *data)
  226. {
  227. default_file_audio_dialog = false;
  228. }
  229. static void ChangeSource()
  230. {
  231. char* new_source_name =
  232. gtk_entry_get_text(GTK_ENTRY(source_entry));
  233. if (!strcmp(new_source_name, source_name)) {
  234. source_modified = false;
  235. return;
  236. }
  237. free(source_name);
  238. source_name = stralloc(new_source_name);
  239. default_file_audio_source = -1;
  240. // decide what type of source we have
  241. if (SourceIsDevice()) {
  242. source_type = VIDEO_SOURCE_V4L;
  243. SourceV4LDevice();
  244. } else {
  245. if (pVideoCaps != MyConfig->m_videoCapabilities) {
  246. delete pVideoCaps;
  247. }
  248. pVideoCaps = NULL;
  249. if (IsUrl(source_name)) {
  250. source_type = URL_SOURCE;
  251. } else {
  252. if (access(source_name, R_OK) != 0) {
  253. ShowMessage("Change Video Source",
  254. "Specified video source can't be opened, check name");
  255. }
  256. source_type = FILE_SOURCE;
  257. }
  258. if (!default_file_audio_dialog
  259.   && FileDefaultAudio(source_name) >= 0) {
  260. YesOrNo(
  261. "Change Video Source",
  262. "Do you want to use this for the audio source also?",
  263. true,
  264. GTK_SIGNAL_FUNC(on_yes_default_file_audio_source),
  265. GTK_SIGNAL_FUNC(on_no_default_file_audio_source));
  266. }
  267. }
  268. track_menu = CreateTrackMenu(
  269. track_menu,
  270. 'V',
  271. source_name,
  272. &trackIndex,
  273. &trackNumber,
  274. &trackValues);
  275. ShowSourceSpecificSettings();
  276. source_modified = false;
  277. }
  278. static void on_source_browse_button (GtkWidget *widget, gpointer *data)
  279. {
  280. FileBrowser(source_entry, GTK_SIGNAL_FUNC(ChangeSource));
  281. }
  282. static void on_source_entry_changed(GtkWidget *widget, gpointer *data)
  283. {
  284. if (widget == source_entry) {
  285. source_modified = true;
  286. }
  287. }
  288. static void on_source_leave(GtkWidget *widget, gpointer *data)
  289. {
  290. if (source_modified) {
  291. ChangeSource();
  292. }
  293. }
  294. static void on_source_list_changed(GtkWidget *widget, gpointer *data)
  295. {
  296. if (widget == source_list) {
  297. ChangeSource();
  298. }
  299. }
  300. char* GetChannelName(size_t index, void* pUserData)
  301. {
  302. return ((struct CHANNEL*)pUserData)[index].name;
  303. }
  304. static void CreateChannelCombo()
  305. {
  306. struct CHANNEL_LIST* pChannelList =
  307. ListOfChannelLists[signalIndex];
  308. GList* list = NULL;
  309. for (int i = 0; i < pChannelList[channelListIndex].count; i++) {
  310. list = g_list_append(list, 
  311. pChannelList[channelListIndex].list[i].name);
  312. }
  313. channel_combo = gtk_combo_new();
  314. gtk_combo_set_popdown_strings(GTK_COMBO(channel_combo), list);
  315. // although we do want to limit the combo choices to the ones we provide
  316. // this call results is some odd UI behaviors
  317. // gtk_combo_set_value_in_list(GTK_COMBO(channel_combo), 1, 0);
  318. gtk_combo_set_use_arrows_always(GTK_COMBO(channel_combo), 1);
  319. GtkWidget* entry = GTK_COMBO(channel_combo)->entry;
  320. gtk_entry_set_text(GTK_ENTRY(entry), 
  321. pChannelList[channelListIndex].list[channelIndex].name);
  322. gtk_widget_show(channel_combo);
  323. }
  324. void ChangeChannelList(u_int8_t newIndex)
  325. {
  326. channelListIndex = newIndex;
  327. // change channel index to zero
  328. channelIndex = 0;
  329. // recreate channel menu
  330. CreateChannelCombo();
  331. }
  332. static void on_channel_list_menu_activate(GtkWidget *widget, gpointer data)
  333. {
  334. ChangeChannelList((unsigned int)data & 0xFF);
  335. }
  336. char* GetChannelListName(size_t index, void* pUserData)
  337. {
  338. return ((struct CHANNEL_LIST*)pUserData)[index].name;
  339. }
  340. static void CreateChannelListMenu()
  341. {
  342. struct CHANNEL_LIST* pChannelList =
  343. ListOfChannelLists[signalIndex];
  344. channel_list_menu = CreateOptionMenu(
  345. channel_list_menu,
  346. GetChannelListName,
  347. pChannelList,
  348. 0xFF,
  349. channelListIndex,
  350. GTK_SIGNAL_FUNC(on_channel_list_menu_activate));
  351. }
  352. static void on_size_menu_activate(GtkWidget *widget, gpointer data)
  353. {
  354. sizeIndex = ((unsigned int)data) & 0xFF;
  355. }
  356. static void CreateSizeMenu()
  357. {
  358. sizeMaxIndex = sizeof(sizeNames) / sizeof(char*);
  359. if (signalIndex == 1) {
  360. // NTSC can't support the two largest sizes
  361. sizeMaxIndex -= 2;
  362. }
  363. if (sizeIndex >= sizeMaxIndex) {
  364. sizeIndex = sizeMaxIndex - 1;
  365. }
  366. size_menu = CreateOptionMenu(
  367. size_menu,
  368. sizeNames, 
  369. sizeMaxIndex,
  370. sizeIndex,
  371. GTK_SIGNAL_FUNC(on_size_menu_activate));
  372. }
  373. void ChangeSignal(u_int8_t newIndex)
  374. {
  375. signalIndex = newIndex;
  376. CreateChannelListMenu();
  377. ChangeChannelList(0);
  378. CreateSizeMenu();
  379. // change max frame rate spinner
  380. if (signalIndex == 1) {
  381. // NTSC 
  382. gtk_spin_button_set_adjustment(GTK_SPIN_BUTTON(frame_rate_spinner),
  383. GTK_ADJUSTMENT(frame_rate_ntsc_adjustment));
  384. } else {
  385. // PAL or SECAM
  386. float frameRate = gtk_spin_button_get_value_as_float(
  387. GTK_SPIN_BUTTON(frame_rate_spinner));
  388. if (frameRate > VIDEO_PAL_FRAME_RATE) {
  389. gtk_spin_button_set_value(GTK_SPIN_BUTTON(frame_rate_spinner),
  390. VIDEO_PAL_FRAME_RATE);
  391. }
  392. gtk_spin_button_set_adjustment(GTK_SPIN_BUTTON(frame_rate_spinner),
  393. GTK_ADJUSTMENT(frame_rate_pal_adjustment));
  394. }
  395. }
  396. static void on_signal_menu_activate(GtkWidget *widget, gpointer data)
  397. {
  398. ChangeSignal(((unsigned int)data) & 0xFF);
  399. }
  400. static void SetAvailableSignals(void)
  401. {
  402. GSList* item = signal_menu_items;
  403. u_int8_t i = 0;
  404. u_int8_t validSignalIndex = 0xFF;
  405. // for all menu items in the signal menu
  406. while (item != NULL) {
  407. // all signals are enabled
  408. bool enabled = true;
  409. // unless input is a tuner
  410. if (pVideoCaps != NULL
  411.   && pVideoCaps->m_inputHasTuners[inputIndex]) {
  412. // this signal type is valid for this tuner
  413.    if (pVideoCaps->m_inputTunerSignalTypes[inputIndex] & (1 << i)) {
  414. // remember first valid signal type for this tuner
  415. if (validSignalIndex == 0xFF) {
  416. validSignalIndex = i;
  417. }
  418. } else { // this signal type is invalid for this tuner
  419. // so disable this menu item
  420. enabled = false;
  421. // check if our current signal type is invalid for this tuner
  422. if (signalIndex == i) {
  423. signalIndex = 0xFF;
  424. }
  425. }
  426. }
  427. gtk_widget_set_sensitive(GTK_WIDGET(item->data), enabled);
  428. item = item->next;
  429. i++;
  430. }
  431. // try to choose a valid signal type if we don't have one
  432. if (signalIndex == 0xFF) {
  433. if (validSignalIndex == 0xFF) {
  434. // we're in trouble
  435. debug_message("SetAvailableSignals: no valid signal type!");
  436. signalIndex = 0;
  437. } else {
  438. signalIndex = validSignalIndex;
  439. }
  440. // cause the displayed value to be updated
  441. gtk_option_menu_set_history(GTK_OPTION_MENU(signal_menu), signalIndex);
  442. // TBD check that signal activate is called here
  443. }
  444. }
  445. static void on_aspect_menu_activate(GtkWidget *widget, gpointer data)
  446. {
  447. aspectIndex = ((unsigned int)data) & 0xFF;
  448. }
  449. static bool ValidateAndSave(void)
  450. {
  451. // if source has been modified
  452. if (source_modified) {
  453. // validate it
  454. ChangeSource();
  455. // can't validate
  456. if (source_modified) {
  457. return false;
  458. }
  459. }
  460. // if previewing, stop video source
  461. AVFlow->StopVideoPreview();
  462. // copy new values to config
  463. MyConfig->SetStringValue(CONFIG_VIDEO_SOURCE_TYPE,
  464. source_type);
  465. MyConfig->SetStringValue(CONFIG_VIDEO_SOURCE_NAME,
  466. gtk_entry_get_text(GTK_ENTRY(source_entry)));
  467. MyConfig->UpdateFileHistory(
  468. gtk_entry_get_text(GTK_ENTRY(source_entry)));
  469. if (MyConfig->m_videoCapabilities != pVideoCaps) {
  470. delete MyConfig->m_videoCapabilities;
  471. MyConfig->m_videoCapabilities = pVideoCaps;
  472. pVideoCaps = NULL;
  473. }
  474. if (strcasecmp(source_type, VIDEO_SOURCE_V4L) 
  475.   && default_file_audio_source >= 0) {
  476. MyConfig->SetStringValue(CONFIG_AUDIO_SOURCE_TYPE,
  477. source_type);
  478. MyConfig->SetStringValue(CONFIG_AUDIO_SOURCE_NAME,
  479. gtk_entry_get_text(GTK_ENTRY(source_entry)));
  480. MyConfig->SetIntegerValue(CONFIG_AUDIO_SOURCE_TRACK,
  481. default_file_audio_source);
  482. }
  483. MyConfig->SetIntegerValue(CONFIG_VIDEO_INPUT,
  484. inputIndex);
  485. MyConfig->SetIntegerValue(CONFIG_VIDEO_SIGNAL,
  486. signalIndex);
  487. MyConfig->SetIntegerValue(CONFIG_VIDEO_CHANNEL_LIST_INDEX,
  488. channelListIndex);
  489. // extract channel index out of combo (not so simple)
  490. GtkWidget* entry = GTK_COMBO(channel_combo)->entry;
  491. char* channelName = gtk_entry_get_text(GTK_ENTRY(entry));
  492. struct CHANNEL_LIST* pChannelList =
  493. ListOfChannelLists[signalIndex];
  494. for (int i = 0; i < pChannelList[channelListIndex].count; i++) {
  495. if (!strcmp(channelName, 
  496.   pChannelList[channelListIndex].list[i].name)) {
  497. channelIndex = i;
  498. break;
  499. }
  500. }
  501. MyConfig->SetIntegerValue(CONFIG_VIDEO_CHANNEL_INDEX,
  502. channelIndex);
  503. MyConfig->SetIntegerValue(CONFIG_VIDEO_SOURCE_TRACK,
  504. trackValues ? trackValues[trackIndex] : 0);
  505. MyConfig->SetIntegerValue(CONFIG_VIDEO_RAW_WIDTH,
  506. sizeWidthValues[sizeIndex]);
  507. MyConfig->SetIntegerValue(CONFIG_VIDEO_RAW_HEIGHT,
  508. sizeHeightValues[sizeIndex]);
  509. MyConfig->SetFloatValue(CONFIG_VIDEO_ASPECT_RATIO,
  510. aspectValues[aspectIndex]);
  511. MyConfig->SetFloatValue(CONFIG_VIDEO_FRAME_RATE,
  512. gtk_spin_button_get_value_as_float(
  513. GTK_SPIN_BUTTON(frame_rate_spinner)));
  514. MyConfig->SetIntegerValue(CONFIG_VIDEO_BIT_RATE,
  515. gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(bit_rate_spinner)));
  516. // now put the new configuration into effect
  517. MyConfig->Update();
  518. NewVideoWindow();
  519. // restart video source
  520. if (MyConfig->GetBoolValue(CONFIG_VIDEO_ENABLE)) {
  521. AVFlow->StartVideoPreview();
  522. }
  523. // refresh display of settings in main window
  524. DisplayVideoSettings();  
  525. DisplayStatusSettings();  
  526. return true;
  527. }
  528. static void on_ok_button (GtkWidget *widget, gpointer *data)
  529. {
  530. // check and save values
  531. if (!ValidateAndSave()) {
  532. return;
  533. }
  534.     on_destroy_dialog(NULL, NULL);
  535. }
  536. static void on_cancel_button (GtkWidget *widget, gpointer *data)
  537. {
  538. on_destroy_dialog(NULL, NULL);
  539. }
  540. void CreateVideoDialog (void) 
  541. {
  542. GtkWidget* hbox;
  543. GtkWidget* vbox;
  544. GtkWidget* hbox2;
  545. GtkWidget* label;
  546. GtkWidget* button;
  547. GtkObject* adjustment;
  548. pVideoCaps = MyConfig->m_videoCapabilities;
  549. default_file_audio_source = -1;
  550. dialog = gtk_dialog_new();
  551. gtk_signal_connect(GTK_OBJECT(dialog),
  552. "destroy",
  553. GTK_SIGNAL_FUNC(on_destroy_dialog),
  554. &dialog);
  555. gtk_window_set_title(GTK_WINDOW(dialog), "Video Settings");
  556. gtk_window_set_modal(GTK_WINDOW(dialog), TRUE);
  557. gtk_container_set_resize_mode(GTK_CONTAINER(dialog), GTK_RESIZE_IMMEDIATE);
  558. hbox = gtk_hbox_new(FALSE, 1);
  559. gtk_widget_show(hbox);
  560. gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), hbox,
  561. FALSE, FALSE, 5);
  562. vbox = gtk_vbox_new(TRUE, 1);
  563. gtk_widget_show(vbox);
  564. gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 5);
  565. label = gtk_label_new(" Source:");
  566. gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
  567. gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
  568. gtk_widget_show(label);
  569. input_label = gtk_label_new("   Port:");
  570. gtk_misc_set_alignment(GTK_MISC(input_label), 0.0, 0.5);
  571. gtk_box_pack_start(GTK_BOX(vbox), input_label, FALSE, FALSE, 0);
  572. signal_label = gtk_label_new("   Signal:");
  573. gtk_misc_set_alignment(GTK_MISC(signal_label), 0.0, 0.5);
  574. gtk_box_pack_start(GTK_BOX(vbox), signal_label, FALSE, FALSE, 0);
  575. channel_list_label = gtk_label_new("   Channel List:");
  576. gtk_misc_set_alignment(GTK_MISC(channel_list_label), 0.0, 0.5);
  577. gtk_box_pack_start(GTK_BOX(vbox), channel_list_label, FALSE, FALSE, 0);
  578. channel_label = gtk_label_new("   Channel:");
  579. gtk_misc_set_alignment(GTK_MISC(channel_label), 0.0, 0.5);
  580. gtk_box_pack_start(GTK_BOX(vbox), channel_label, FALSE, FALSE, 0);
  581. track_label = gtk_label_new("   Track:");
  582. gtk_misc_set_alignment(GTK_MISC(track_label), 0.0, 0.5);
  583. gtk_box_pack_start(GTK_BOX(vbox), track_label, FALSE, FALSE, 0);
  584. label = gtk_label_new(" Output:");
  585. gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
  586. gtk_widget_show(label);
  587. gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
  588. label = gtk_label_new("   Size:");
  589. gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
  590. gtk_widget_show(label);
  591. gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
  592. label = gtk_label_new("   Aspect Ratio:");
  593. gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
  594. gtk_widget_show(label);
  595. gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
  596. label = gtk_label_new("   Frame Rate (fps):");
  597. gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
  598. gtk_widget_show(label);
  599. gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
  600. label = gtk_label_new("   Bit Rate (kbps):");
  601. gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
  602. gtk_widget_show(label);
  603. gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
  604. vbox = gtk_vbox_new(TRUE, 1);
  605. gtk_widget_show(vbox);
  606. gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 5);
  607. hbox2 = gtk_hbox_new(FALSE, 1);
  608. gtk_widget_show(hbox2);
  609. gtk_box_pack_start(GTK_BOX(vbox), hbox2, FALSE, FALSE, 0);
  610. source_type = MyConfig->GetStringValue(CONFIG_VIDEO_SOURCE_TYPE);
  611. // source entry
  612. free(source_name);
  613. source_name = 
  614. stralloc(MyConfig->GetStringValue(CONFIG_VIDEO_SOURCE_NAME));
  615. source_modified = false;
  616. source_combo = CreateFileCombo(source_name);
  617. source_entry = GTK_COMBO(source_combo)->entry;
  618. source_list = GTK_COMBO(source_combo)->list;
  619. gtk_signal_connect(GTK_OBJECT(source_list), "select_child",
  620. GTK_SIGNAL_FUNC(on_source_list_changed), NULL);
  621. SetEntryValidator(GTK_OBJECT(source_entry),
  622. GTK_SIGNAL_FUNC(on_source_entry_changed), 
  623. GTK_SIGNAL_FUNC(on_source_leave));
  624. gtk_widget_show(source_combo);
  625. gtk_box_pack_start(GTK_BOX(hbox2), source_combo, TRUE, TRUE, 0);
  626. // browse button
  627. browse_button = gtk_button_new_with_label(" Browse... ");
  628. gtk_signal_connect(GTK_OBJECT(browse_button),
  629.  "clicked",
  630.  GTK_SIGNAL_FUNC(on_source_browse_button),
  631.  NULL);
  632. gtk_widget_show(browse_button);
  633. gtk_box_pack_start(GTK_BOX(hbox2), browse_button, FALSE, FALSE, 5);
  634. // N.B. because of the dependencies of 
  635. // input, signal, channel list, channel, and sizes
  636. // order of operations is important here
  637. channelIndex = 
  638. MyConfig->GetIntegerValue(CONFIG_VIDEO_CHANNEL_INDEX);
  639. channelListIndex = 
  640. MyConfig->GetIntegerValue(CONFIG_VIDEO_CHANNEL_LIST_INDEX);
  641. signalIndex = 
  642. MyConfig->GetIntegerValue(CONFIG_VIDEO_SIGNAL); 
  643. inputIndex = 
  644. MyConfig->GetIntegerValue(CONFIG_VIDEO_INPUT);
  645. channel_combo = NULL;
  646. CreateChannelCombo();
  647. channel_list_menu = NULL;
  648. CreateChannelListMenu();
  649. track_menu = NULL;
  650. track_menu = CreateTrackMenu(
  651. track_menu,
  652. 'V',
  653. gtk_entry_get_text(GTK_ENTRY(source_entry)),
  654. &trackIndex,
  655. &trackNumber,
  656. &trackValues);
  657. trackIndex = 0; 
  658. for (u_int8_t i = 0; i < trackNumber; i++) {
  659. if (MyConfig->GetIntegerValue(CONFIG_VIDEO_SOURCE_TRACK)
  660.    == trackValues[i]) {
  661. trackIndex = i;
  662. break;
  663. }
  664. }
  665. sizeIndex = 0; 
  666. for (u_int8_t i = 0; i < sizeof(sizeWidthValues) / sizeof(u_int16_t); i++) {
  667. if (MyConfig->GetIntegerValue(CONFIG_VIDEO_RAW_WIDTH)
  668.     == sizeWidthValues[i]
  669.   && MyConfig->GetIntegerValue(CONFIG_VIDEO_RAW_HEIGHT)
  670.     == sizeHeightValues[i]) {
  671. sizeIndex = i;
  672. break;
  673. }
  674. }
  675. size_menu = NULL;
  676. CreateSizeMenu();
  677. signal_menu = CreateOptionMenu(
  678. NULL,
  679. signalNames, 
  680. sizeof(signalNames) / sizeof(char*),
  681. signalIndex,
  682. GTK_SIGNAL_FUNC(on_signal_menu_activate),
  683. &signal_menu_items);
  684. input_menu = NULL;
  685. CreateInputMenu(pVideoCaps);
  686. ChangeInput(inputIndex);
  687. gtk_box_pack_start(GTK_BOX(vbox), input_menu, FALSE, FALSE, 0);
  688. gtk_box_pack_start(GTK_BOX(vbox), signal_menu, FALSE, FALSE, 0);
  689. gtk_box_pack_start(GTK_BOX(vbox), channel_list_menu, FALSE, FALSE, 0);
  690. gtk_box_pack_start(GTK_BOX(vbox), channel_combo, FALSE, FALSE, 0);
  691. gtk_box_pack_start(GTK_BOX(vbox), track_menu, FALSE, FALSE, 0);
  692. // spacer
  693. label = gtk_label_new(" ");
  694. gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
  695. gtk_widget_show(label);
  696. gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
  697. gtk_box_pack_start(GTK_BOX(vbox), size_menu, FALSE, FALSE, 0);
  698. aspectIndex = 0; 
  699. for (u_int8_t i = 0; i < sizeof(aspectValues) / sizeof(float); i++) {
  700. if (MyConfig->GetFloatValue(CONFIG_VIDEO_ASPECT_RATIO)
  701.   == aspectValues[i]) {
  702. aspectIndex = i;
  703. break;
  704. }
  705. }
  706. aspect_menu = CreateOptionMenu(
  707. NULL,
  708. aspectNames, 
  709. sizeof(aspectNames) / sizeof(char*),
  710. aspectIndex,
  711. GTK_SIGNAL_FUNC(on_aspect_menu_activate));
  712. gtk_box_pack_start(GTK_BOX(vbox), aspect_menu, FALSE, FALSE, 0);
  713. frame_rate_pal_adjustment = gtk_adjustment_new(
  714. MyConfig->GetFloatValue(CONFIG_VIDEO_FRAME_RATE),
  715. 1, VIDEO_PAL_FRAME_RATE, 1, 0, 0);
  716. gtk_object_ref(frame_rate_pal_adjustment);
  717. frame_rate_ntsc_adjustment = gtk_adjustment_new(
  718. MyConfig->GetFloatValue(CONFIG_VIDEO_FRAME_RATE),
  719. 1, VIDEO_NTSC_FRAME_RATE, 1, 0, 0);
  720. gtk_object_ref(frame_rate_ntsc_adjustment);
  721. if (signalIndex == 1) {
  722. frame_rate_spinner = gtk_spin_button_new(
  723. GTK_ADJUSTMENT(frame_rate_ntsc_adjustment), 1, 2);
  724. } else {
  725. frame_rate_spinner = gtk_spin_button_new(
  726. GTK_ADJUSTMENT(frame_rate_pal_adjustment), 1, 2);
  727. }
  728. gtk_widget_show(frame_rate_spinner);
  729. gtk_box_pack_start(GTK_BOX(vbox), frame_rate_spinner, FALSE, FALSE, 0);
  730. adjustment = gtk_adjustment_new(
  731. MyConfig->GetIntegerValue(CONFIG_VIDEO_BIT_RATE),
  732. 25, 4000, 50, 0, 0);
  733. bit_rate_spinner = gtk_spin_button_new(GTK_ADJUSTMENT(adjustment), 50, 0);
  734. gtk_widget_show(bit_rate_spinner);
  735. gtk_box_pack_start(GTK_BOX(vbox), bit_rate_spinner, FALSE, FALSE, 0);
  736. // Add standard buttons at bottom
  737. button = AddButtonToDialog(dialog,
  738. " OK ", 
  739. GTK_SIGNAL_FUNC(on_ok_button));
  740. GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT);
  741. AddButtonToDialog(dialog,
  742. " Cancel ", 
  743. GTK_SIGNAL_FUNC(on_cancel_button));
  744. ShowSourceSpecificSettings();
  745. gtk_widget_show(dialog);
  746. }
  747. /* end video_dialog.cpp */