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

流媒体/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. #include "mp4live.h"
  23. #include "video_v4l_source.h"
  24. #include "audio_oss_source.h"
  25. CLiveConfig::CLiveConfig(
  26. SConfigVariable* variables, 
  27. config_index_t numVariables, 
  28. const char* defaultFileName)
  29. : CConfigSet(variables, numVariables, defaultFileName) 
  30. {
  31. m_appAutomatic = false;
  32. m_videoCapabilities = NULL;
  33. m_videoEncode = true;
  34. m_videoPreviewWindowId = 0;
  35. m_videoMaxWidth = 768;
  36. m_videoMaxHeight = 576;
  37. m_videoNeedRgbToYuv = false;
  38. m_videoMpeg4ConfigLength = 0;
  39. m_videoMpeg4Config = NULL;
  40. m_videoMaxVopSize = 128 * 1024;
  41. m_audioCapabilities = NULL;
  42. m_audioEncode = true;
  43. m_recordEstFileSize = 0;
  44. }
  45. CLiveConfig::~CLiveConfig()
  46. {
  47. delete m_videoCapabilities;
  48. delete m_audioCapabilities;
  49. }
  50. // recalculate derived values
  51. void CLiveConfig::Update() 
  52. {
  53. UpdateVideo();
  54. UpdateAudio();
  55. UpdateRecord();
  56. }
  57. void CLiveConfig::UpdateFileHistory(char* fileName)
  58. {
  59. u_int8_t i;
  60. u_int8_t end = NUM_FILE_HISTORY - 1;
  61. // check if fileName is already in file history list
  62. for (i = 0; i < end; i++) {
  63. if (!strcmp(fileName, GetStringValue(CONFIG_APP_FILE_0 + i))) {
  64. end = i; 
  65. }
  66. }
  67. // move all entries down 1 position
  68. for (i = end; i > 0; i--) {
  69. SetStringValue(CONFIG_APP_FILE_0 + i, 
  70. GetStringValue(CONFIG_APP_FILE_0 + i - 1));
  71. }
  72. // put new value in first position
  73. SetStringValue(CONFIG_APP_FILE_0, fileName);
  74. }
  75. void CLiveConfig::UpdateVideo() 
  76. {
  77. m_videoEncode =
  78. GetBoolValue(CONFIG_VIDEO_ENCODED_PREVIEW)
  79. || GetBoolValue(CONFIG_RTP_ENABLE)
  80. || (GetBoolValue(CONFIG_RECORD_ENABLE)
  81. && GetBoolValue(CONFIG_RECORD_ENCODED_VIDEO));
  82. CalculateVideoFrameSize(this);
  83. GenerateMpeg4VideoConfig(this);
  84. }
  85. void CLiveConfig::UpdateAudio() 
  86. {
  87. m_audioEncode =
  88. GetBoolValue(CONFIG_RTP_ENABLE)
  89. || (GetBoolValue(CONFIG_RECORD_ENABLE)
  90. && GetBoolValue(CONFIG_RECORD_ENCODED_AUDIO));
  91. }
  92. void CLiveConfig::UpdateRecord() 
  93. {
  94. u_int32_t videoBytesPerSec = 0;
  95. if (GetBoolValue(CONFIG_VIDEO_ENABLE)) {
  96. if (GetBoolValue(CONFIG_RECORD_RAW_VIDEO)) {
  97. videoBytesPerSec += (u_int32_t)
  98. (((m_videoWidth * m_videoHeight * 3) / 2)
  99. * GetFloatValue(CONFIG_VIDEO_FRAME_RATE) + 0.5);
  100. }
  101. if (GetBoolValue(CONFIG_RECORD_ENCODED_VIDEO)) {
  102. videoBytesPerSec +=
  103. (GetIntegerValue(CONFIG_VIDEO_BIT_RATE) * 1000) / 8;
  104. }
  105. }
  106. u_int32_t audioBytesPerSec = 0;
  107. if (GetBoolValue(CONFIG_AUDIO_ENABLE)) {
  108. if (GetBoolValue(CONFIG_RECORD_RAW_AUDIO)) {
  109. audioBytesPerSec +=
  110. GetIntegerValue(CONFIG_AUDIO_SAMPLE_RATE) 
  111. * GetIntegerValue(CONFIG_AUDIO_CHANNELS)
  112. * sizeof(u_int16_t);
  113. }
  114. if (GetBoolValue(CONFIG_RECORD_ENCODED_AUDIO)) {
  115. audioBytesPerSec +=
  116. (GetIntegerValue(CONFIG_AUDIO_BIT_RATE) * 1000) / 8;
  117. }
  118. }
  119. u_int32_t duration = GetIntegerValue(CONFIG_APP_DURATION) 
  120. * GetIntegerValue(CONFIG_APP_DURATION_UNITS);
  121. m_recordEstFileSize = (u_int64_t)
  122. ((double)((videoBytesPerSec + audioBytesPerSec) * duration) * 1.025);
  123. }
  124. bool CLiveConfig::IsOneSource()
  125. {
  126. bool sameSourceType =
  127. !strcasecmp(GetStringValue(CONFIG_VIDEO_SOURCE_TYPE),
  128. GetStringValue(CONFIG_AUDIO_SOURCE_TYPE));
  129. if (!sameSourceType) {
  130. return false;
  131. }
  132. bool sameSourceName =
  133. !strcmp(GetStringValue(CONFIG_VIDEO_SOURCE_NAME),
  134. GetStringValue(CONFIG_AUDIO_SOURCE_NAME));
  135. return sameSourceName;
  136. }
  137. bool CLiveConfig::IsCaptureVideoSource()
  138. {
  139. const char *sourceType =
  140. GetStringValue(CONFIG_VIDEO_SOURCE_TYPE);
  141. return !strcasecmp(sourceType, VIDEO_SOURCE_V4L);
  142. }
  143. bool CLiveConfig::IsCaptureAudioSource()
  144. {
  145. const char *sourceType =
  146. GetStringValue(CONFIG_AUDIO_SOURCE_TYPE);
  147. return !strcasecmp(sourceType, AUDIO_SOURCE_OSS);
  148. }