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

流媒体/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. 2000, 2001.  All Rights Reserved.
  17.  * 
  18.  * Contributor(s): 
  19.  * Dave Mackie dmackie@cisco.com
  20.  * Bill May  wmay@cisco.com
  21.  */
  22. #define DECLARE_CONFIG_VARIABLES 1
  23. #include "mp4live.h"
  24. #include "media_flow.h"
  25. #include "video_v4l_source.h"
  26. #include "audio_oss_source.h"
  27. #include <getopt.h>
  28. int main(int argc, char** argv)
  29. {
  30. int rc;
  31. char* configFileName = NULL;
  32. bool automatic = false;
  33. bool headless = false;
  34. bool sdpOnly = false;
  35. extern int nogui_main(CLiveConfig* pConfig);
  36. extern int gui_main(int argc, char**argv, CLiveConfig* pConfig);
  37. // command line parsing
  38. while (true) {
  39. int c = -1;
  40. int option_index = 0;
  41. static struct option long_options[] = {
  42. { "automatic", 0, 0, 'a' },
  43. { "file", 1, 0, 'f' },
  44. { "headless", 0, 0, 'h' },
  45. { "sdp", 0, 0, 's' }, 
  46. { "version", 0, 0, 'v' },
  47. { NULL, 0, 0, 0 }
  48. };
  49. c = getopt_long_only(argc, argv, "af:hsv",
  50. long_options, &option_index);
  51. if (c == -1)
  52. break;
  53. switch (c) {
  54. case 'a':
  55. automatic = true;
  56. break;
  57. case 'f': // -f <config-file>
  58. configFileName = stralloc(optarg);
  59. break;
  60. case 'h':
  61. headless = true;
  62. break;
  63. case 's':
  64. sdpOnly = true;
  65. break;
  66. case 'v':
  67. fprintf(stderr, "%s version %sn", argv[0], VERSION);
  68. exit(0);
  69. case '?':
  70. default:
  71. fprintf(stderr, 
  72. "Usage: %s [-f config_file] [--automatic] [--headless]n",
  73. argv[0]);
  74. exit(-1);
  75. }
  76. }
  77. char userFileName[MAXPATHLEN];
  78. char* home = getenv("HOME");
  79. if (home) {
  80. strcpy(userFileName, home);
  81. strcat(userFileName, "/.mp4live_rc");
  82. }
  83. CLiveConfig* pConfig = NULL;
  84. try {
  85. pConfig = new CLiveConfig(MyConfigVariables,
  86. sizeof(MyConfigVariables) / sizeof(SConfigVariable),
  87. home ? userFileName : NULL);
  88. if (configFileName) {
  89. pConfig->ReadFromFile(configFileName);
  90. } else {
  91. // read user config file if present
  92. pConfig->ReadDefaultFile();
  93. }
  94. pConfig->m_appAutomatic = automatic;
  95. extern bool PrintDebugMessages;
  96. PrintDebugMessages =
  97. pConfig->GetIntegerValue(CONFIG_APP_DEBUG);
  98. catch (CConfigException* e) {
  99. delete e;
  100. }
  101. // probe for capture cards
  102. if (!strcasecmp(pConfig->GetStringValue(CONFIG_VIDEO_SOURCE_TYPE),
  103.   VIDEO_SOURCE_V4L)) {
  104. CV4LVideoSource::InitialVideoProbe(pConfig);
  105. }
  106. // probe for sound card capabilities
  107. if (!strcasecmp(pConfig->GetStringValue(CONFIG_AUDIO_SOURCE_TYPE),
  108.   AUDIO_SOURCE_OSS)) {
  109. pConfig->m_audioCapabilities = new CAudioCapabilities(
  110. pConfig->GetStringValue(CONFIG_AUDIO_SOURCE_NAME));
  111. }
  112. pConfig->Update();
  113. // initialization done, time to execute
  114. // first case: just want to generate the SDP file
  115. if (sdpOnly) {
  116. rc = GenerateSdpFile(pConfig);
  117. delete pConfig;
  118. exit(rc);
  119. }
  120. // other cases:
  121. // attempt to exploit any real time features of the OS
  122. // will probably only succeed if user has root privileges
  123. if (pConfig->GetBoolValue(CONFIG_APP_REAL_TIME_SCHEDULER)) {
  124. #ifdef _POSIX_PRIORITY_SCHEDULING
  125. // put us into the lowest real-time scheduling queue
  126. struct sched_param sp;
  127. sp.sched_priority = 1;
  128. if (sched_setscheduler(0, SCHED_RR, &sp) < 0) {
  129. # ifdef DEBUG
  130. debug_message("Unable to set scheduling priority: %s",
  131. strerror(errno));
  132. # endif
  133. }
  134. #endif /* _POSIX_PRIORITY_SCHEDULING */
  135. #ifdef _POSIX_MEMLOCK
  136. // recommendation is to reserve some stack pages
  137. u_int8_t huge[1024 * 1024];
  138. memset(huge, 1, sizeof(huge));
  139. // and then lock memory
  140. if (mlockall(MCL_CURRENT|MCL_FUTURE) < 0) {
  141. # ifdef DEBUG
  142. debug_message("Unable to lock memory: %s", 
  143. strerror(errno));
  144. # endif
  145. }
  146. #endif /* _POSIX_MEMLOCK */
  147. }
  148. #ifdef NOGUI
  149. rc = nogui_main(pConfig);
  150. #else
  151. if (headless) {
  152. rc = nogui_main(pConfig);
  153. } else {
  154. // hand over control to GUI
  155. try {
  156. rc = gui_main(argc, argv, pConfig);
  157. }
  158. catch (void* e) {
  159. rc = -1;
  160. }
  161. }
  162. #endif
  163. // save any changes to user config file
  164. if (configFileName == NULL) {
  165. pConfig->WriteToFile(pConfig->GetFileName());
  166. } else {
  167. free(configFileName);
  168. }
  169. if (pConfig->GetBoolValue(CONFIG_APP_REAL_TIME_SCHEDULER)) {
  170. #ifdef _POSIX_MEMLOCK
  171. munlockall();
  172. #endif /* _POSIX_MEMLOCK */
  173. }
  174. // cleanup
  175. delete pConfig;
  176. exit (rc);
  177. }
  178. int nogui_main(CLiveConfig* pConfig)
  179. {
  180. if (!pConfig->GetBoolValue(CONFIG_AUDIO_ENABLE)
  181.   && !pConfig->GetBoolValue(CONFIG_VIDEO_ENABLE)) {
  182. return -1;
  183. }
  184. // override any configured value of preview
  185. bool previewValue =
  186. pConfig->GetBoolValue(CONFIG_VIDEO_PREVIEW);
  187. pConfig->SetBoolValue(CONFIG_VIDEO_PREVIEW, false);
  188. CAVMediaFlow* pFlow = new CAVMediaFlow(pConfig);
  189. pFlow->Start();
  190. sleep(pConfig->GetIntegerValue(CONFIG_APP_DURATION)
  191. * pConfig->GetIntegerValue(CONFIG_APP_DURATION_UNITS));
  192. pFlow->Stop();
  193. delete pFlow;
  194. pConfig->SetBoolValue(CONFIG_VIDEO_PREVIEW, previewValue);
  195. return 0;
  196. }