video_v4l_source.h
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:3k
源码类别:

流媒体/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. #ifndef __VIDEO_V4L_SOURCE_H__
  23. #define __VIDEO_V4L_SOURCE_H__
  24. #include <sys/types.h>
  25. #include <sys/ioctl.h>
  26. #include <linux/videodev.h>
  27. #include "media_source.h"
  28. #include "video_encoder.h"
  29. void CalculateVideoFrameSize(CLiveConfig* pConfig);
  30. class CV4LVideoSource : public CMediaSource {
  31. public:
  32. CV4LVideoSource() : CMediaSource() {
  33. m_videoDevice = -1;
  34. m_videoMap = NULL;
  35. m_videoFrameMap = NULL;
  36. }
  37. static bool InitialVideoProbe(CLiveConfig* pConfig);
  38. bool IsDone() {
  39. return false; // live capture is inexhaustible
  40. }
  41. float GetProgress() {
  42. return 0.0; // live capture device is inexhaustible
  43. }
  44. protected:
  45. int ThreadMain(void);
  46. void DoStartCapture(void);
  47. void DoStopCapture(void);
  48. bool Init(void);
  49. bool InitDevice(void);
  50. void ReleaseDevice(void);
  51. void ProcessVideo(void);
  52. int8_t AcquireFrame(void);
  53. inline bool ReleaseFrame(int8_t frameNumber) {
  54. return (ioctl(m_videoDevice, VIDIOCMCAPTURE, 
  55. &m_videoFrameMap[frameNumber]) == 0);
  56. }
  57. void SetVideoAudioMute(bool mute);
  58. protected:
  59. u_int8_t m_maxPasses;
  60. int m_videoDevice;
  61. struct video_mbuf m_videoMbuf;
  62. void* m_videoMap;
  63. struct video_mmap* m_videoFrameMap;
  64. int8_t m_captureHead;
  65. int8_t m_encodeHead;
  66. float m_videoSrcFrameRate;
  67. };
  68. class CVideoCapabilities {
  69. public:
  70. CVideoCapabilities(char* deviceName) {
  71. m_deviceName = stralloc(deviceName);
  72. m_canOpen = false;
  73. m_canCapture = false;
  74. m_driverName = NULL;
  75. m_numInputs = 0;
  76. m_inputNames = NULL;
  77. m_inputSignalTypes = NULL;
  78. m_inputHasTuners = NULL;
  79. m_inputTunerSignalTypes = NULL;
  80. m_hasAudio = false;
  81. ProbeDevice();
  82. }
  83. ~CVideoCapabilities() {
  84. free(m_deviceName);
  85. free(m_driverName);
  86. for (int i = 0; i < m_numInputs; i++) {
  87. free(m_inputNames[i]);
  88. }
  89. free(m_inputNames);
  90. free(m_inputSignalTypes);
  91. free(m_inputHasTuners);
  92. free(m_inputTunerSignalTypes);
  93. }
  94. inline bool IsValid() {
  95. return m_canOpen && m_canCapture;
  96. }
  97. public:
  98. char* m_deviceName; 
  99. bool m_canOpen;
  100. bool m_canCapture;
  101. // N.B. the rest of the fields are only valid 
  102. // if m_canOpen and m_canCapture are both true
  103. char* m_driverName; 
  104. u_int16_t m_numInputs;
  105. u_int16_t m_minWidth;
  106. u_int16_t m_minHeight;
  107. u_int16_t m_maxWidth;
  108. u_int16_t m_maxHeight;
  109. // each of these points at m_numInputs values
  110. char** m_inputNames;
  111. u_int8_t* m_inputSignalTypes; // current signal type of input
  112. bool* m_inputHasTuners;
  113. u_int8_t* m_inputTunerSignalTypes; // possible signal types from tuner
  114. bool m_hasAudio;
  115. protected:
  116. bool ProbeDevice(void);
  117. };
  118. #endif /* __VIDEO_V4L_SOURCE_H__ */