[server] / trunk / server / src / mmdevice.cxx Repository:
ViewVC logotype

Diff of /trunk/server/src/mmdevice.cxx

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 537, Wed Dec 30 11:06:00 2009 UTC revision 538, Wed Dec 30 16:39:24 2009 UTC
# Line 54  Line 54 
54                      DialogicChannelManager& channelMgr )                      DialogicChannelManager& channelMgr )
55          : DialogicDevice(name, channelMgr),          : DialogicDevice(name, channelMgr),
56            playActive_ (false),            playActive_ (false),
57            recordActive_ (false),            recordActive_ (false)
           mediaIsMpeg4_ (false),  
           mediaIsCif_ (true)  
58  {  {
59          busy_ = false;          busy_ = false;
   
         std::string media_dir("/var/lib/diastar/media");  
         std::string lang("en_US");  
         mediaFinder_ = new MediaFinder(media_dir, lang);  
60  }  }
61    
62    
# Line 71  Line 65 
65   */   */
66  MmDevice::~MmDevice()  MmDevice::~MmDevice()
67  {  {
         delete mediaFinder_;  
68  }  }
69    
70    
# Line 105  Line 98 
98    
99                          case MmCommand::RECORD:                          case MmCommand::RECORD:
100                                  record(pending_.front().audioFile,                                  record(pending_.front().audioFile,
101                                         pending_.front().videoFile);                                         pending_.front().audioCoder,
102                                           pending_.front().videoFile,
103                                           pending_.front().videoCoder,
104                                           pending_.front().lang);
105                                  break;                                  break;
106    
107                          case MmCommand::STOPPLAY:                          case MmCommand::STOPPLAY:
# Line 631  Line 627 
627          {          {
628                  std::string foundAudioEncoding;                  std::string foundAudioEncoding;
629    
630                  if ( !mediaFinder_->find(audioFile,                  if ( !channelMgr_.getMediaFinder()->find(audioFile,
631                                           audioCoder.encoding,                                           audioCoder.encoding,
632                                           lang,                                           lang,
633                                           foundAudioFile,                                           foundAudioFile,
# Line 687  Line 683 
683                  std::string foundVideoEncoding;                  std::string foundVideoEncoding;
684                  unsigned int foundSize;                  unsigned int foundSize;
685    
686                  if ( !mediaFinder_->find(videoFile,                  if ( !channelMgr_.getMediaFinder()->find(videoFile,
687                                           videoCoder.encoding,                                           videoCoder.encoding,
688                                           videoCoder.active_fmt.imageWidth,                                           videoCoder.active_fmt.imageWidth,
689                                           lang,                                           lang,
# Line 774  Line 770 
770   * Start recording.   * Start recording.
771   */   */
772  bool MmDevice::record( const std::string& audioFile,  bool MmDevice::record( const std::string& audioFile,
773                         const std::string& videoFile )                         const AudioCoderInfo& audioCoder,
774                           const std::string& videoFile,
775                           const VideoCoderInfo& videoCoder,
776                           const std::string& lang )
777  {  {
778          if ( busy_ )          if ( busy_ )
779          {          {
780                  pending_.push(MmCommand(MmCommand::RECORD, audioFile, videoFile));                  pending_.push(MmCommand(MmCommand::RECORD, audioFile, audioCoder, videoFile, videoCoder, lang));
781                  return true;                  return true;
782          }          }
783    
784            std::string audioFilePath = channelMgr_.getMediaFinder()->getMediaDir();
785            std::string videoFilePath = channelMgr_.getMediaFinder()->getMediaDir();
786    
787            int count = 0;  /* index for playRecordList_ */
788    
789          /* init audio          /* init audio
790           */           */
791          MM_AUDIO_CODEC audioCodec;          if ( !audioFile.empty() )
792          INIT_MM_AUDIO_CODEC(&audioCodec);          {
793          audioCodec.unCoding = MM_DATA_FORMAT_PCM;                  audioFilePath += '/';
794          audioCodec.unSampleRate = MM_DRT_8KHZ;                  if ( !lang.empty() )
795          audioCodec.unBitsPerSample = 16;                  {
796                            audioFilePath += lang;
797                            audioFilePath += '/';
798                    }
799                    audioFilePath += audioCoder.encoding;
800                    audioFilePath += '/';
801                    audioFilePath += audioFile;
802    
803          INIT_MM_MEDIA_ITEM_LIST(&audioMediaList_);          INIT_MM_MEDIA_ITEM_LIST(&audioMediaList_);
804          INIT_MM_MEDIA_AUDIO(&audioMediaList_.item.audio);          INIT_MM_MEDIA_AUDIO(&audioMediaList_.item.audio);
805          audioMediaList_.ItemChain  = EMM_ITEM_EOT;          audioMediaList_.ItemChain  = EMM_ITEM_EOT;
806          audioMediaList_.item.audio.szFileName = audioFile.c_str();  
807          audioMediaList_.item.audio.codec = audioCodec;                  if ( audioCoder.encoding == "vox" )
808          audioMediaList_.item.audio.unMode = MM_MODE_AUD_FILE_TYPE_VOX;                  {
809                            audioMediaList_.item.audio.codec.unCoding = MM_DATA_FORMAT_PCM;
810                            audioMediaList_.item.audio.codec.unSampleRate = MM_DRT_8KHZ;
811                            audioMediaList_.item.audio.codec.unBitsPerSample = 16;
812                            audioMediaList_.item.audio.eFileFormat = EMM_AUD_FILEFORMAT_VOX;
813                            audioMediaList_.item.audio.unOffset = 0;
814                    }
815                    else if ( audioCoder.encoding == "pcma" )
816                    {
817                            audioMediaList_.item.audio.codec.unCoding = MM_DATA_FORMAT_ALAW;
818                            audioMediaList_.item.audio.codec.unSampleRate = MM_DRT_8KHZ;
819                            audioMediaList_.item.audio.codec.unBitsPerSample = 8;
820          audioMediaList_.item.audio.eFileFormat = EMM_AUD_FILEFORMAT_VOX;          audioMediaList_.item.audio.eFileFormat = EMM_AUD_FILEFORMAT_VOX;
821                            audioMediaList_.item.audio.unOffset = 0;
822                    }
823                    else if ( audioCoder.encoding == "pcmu" )
824                    {
825                            audioMediaList_.item.audio.codec.unCoding = MM_DATA_FORMAT_MULAW;
826                            audioMediaList_.item.audio.codec.unSampleRate = MM_DRT_8KHZ;
827                            audioMediaList_.item.audio.codec.unBitsPerSample = 8;
828                            audioMediaList_.item.audio.eFileFormat = EMM_AUD_FILEFORMAT_VOX;
829                            audioMediaList_.item.audio.unOffset = 0;
830                    }
831                    else
832                    {
833                            return false;
834                    }
835    
836                    audioMediaList_.item.audio.szFileName = audioFilePath.c_str();
837    
838                    INIT_MM_PLAY_RECORD_LIST(&playRecordList_[count]);
839                    playRecordList_[count].ItemType = EMM_MEDIA_TYPE_AUDIO;
840                    playRecordList_[count].list = &audioMediaList_;
841                    playRecordList_[count].ItemChain = EMM_ITEM_EOT;
842            }
843    
844          /* init video          /* init video
845           */           */
846          INIT_MM_MEDIA_ITEM_LIST(&videoMediaList_);          if ( !videoFile.empty() )
         INIT_MM_MEDIA_VIDEO(&videoMediaList_.item.video);  
         if ( mediaIsMpeg4_ )  
847          {          {
848                    videoFilePath += '/';
849                    if ( !lang.empty() )
850                    {
851                            videoFilePath += lang;
852                            videoFilePath += '/';
853                    }
854                    videoFilePath += videoCoder.encoding;
855                    videoFilePath += '/';
856    
857                  INIT_MM_MEDIA_ITEM_LIST(&videoMediaList_);                  INIT_MM_MEDIA_ITEM_LIST(&videoMediaList_);
858                  INIT_MM_MEDIA_VIDEO(&videoMediaList_.item.video);                  INIT_MM_MEDIA_VIDEO(&videoMediaList_.item.video);
859                  if ( mediaIsCif_)                  videoMediaList_.ItemChain = EMM_ITEM_EOT;
860    
861                    if ( videoCoder.encoding == "mpv4-es" )
862                    {
863                            if ( videoCoder.active_fmt.imageWidth == VIDEO_IMAGE_WIDTH_352 )
864                  {                  {
865                          LOGDEBUG("MmDevice::record() Using MPEG4 CIF device: " << getDeviceName());                                  videoFilePath += "CIF/";
866                          videoMediaList_.item.video.codec.Coding = VIDEO_CODING_MP4V_ES;                          videoMediaList_.item.video.codec.Coding = VIDEO_CODING_MP4V_ES;
867                          videoMediaList_.item.video.codec.Profile = VIDEO_PROFILE_LEVEL_SP3_MPEG4;                          videoMediaList_.item.video.codec.Profile = VIDEO_PROFILE_LEVEL_SP3_MPEG4;
868                          videoMediaList_.item.video.codec.ImageWidth = VIDEO_IMAGE_WIDTH_352;                          videoMediaList_.item.video.codec.ImageWidth = VIDEO_IMAGE_WIDTH_352;
# Line 817  Line 871 
871                  }                  }
872                  else                  else
873                  {                  {
874                          LOGDEBUG("MmDevice::record() Using MPEG4 QCIF device: " << getDeviceName());                                  videoFilePath += "QCIF/";
875                          videoMediaList_.item.video.codec.Coding = VIDEO_CODING_MP4V_ES;                          videoMediaList_.item.video.codec.Coding = VIDEO_CODING_MP4V_ES;
876                          videoMediaList_.item.video.codec.Profile = VIDEO_PROFILE_LEVEL_SP1_MPEG4;                          videoMediaList_.item.video.codec.Profile = VIDEO_PROFILE_LEVEL_SP1_MPEG4;
877                          videoMediaList_.item.video.codec.ImageWidth = VIDEO_IMAGE_WIDTH_176;                          videoMediaList_.item.video.codec.ImageWidth = VIDEO_IMAGE_WIDTH_176;
# Line 825  Line 879 
879                          videoMediaList_.item.video.codec.FramesPerSec = VIDEO_FRAMESPERSEC_15;                          videoMediaList_.item.video.codec.FramesPerSec = VIDEO_FRAMESPERSEC_15;
880                  }                  }
881          }          }
882          else                  else /* h263 */
883          {          {
884                  if ( mediaIsCif_ )                          if ( videoCoder.active_fmt.imageWidth == VIDEO_IMAGE_WIDTH_352 )
885                  {                  {
886                          LOGDEBUG("MmDevice::record() Using H.263 CIF device: " << getDeviceName());                                  videoFilePath += "CIF/";
887                          videoMediaList_.item.video.codec.Coding = VIDEO_CODING_H263;                          videoMediaList_.item.video.codec.Coding = VIDEO_CODING_H263;
888                          videoMediaList_.item.video.codec.Profile = VIDEO_PROFILE_0_H263;                          videoMediaList_.item.video.codec.Profile = VIDEO_PROFILE_0_H263;
889                          videoMediaList_.item.video.codec.ImageWidth = VIDEO_IMAGE_WIDTH_352;                          videoMediaList_.item.video.codec.ImageWidth = VIDEO_IMAGE_WIDTH_352;
# Line 838  Line 892 
892                  }                  }
893                  else                  else
894                  {                  {
895                          LOGDEBUG("MmDevice::record() Using H.263 QCIF device: " << getDeviceName());                                  videoFilePath += "QCIF/";
896                          videoMediaList_.item.video.codec.Coding = VIDEO_CODING_H263;                          videoMediaList_.item.video.codec.Coding = VIDEO_CODING_H263;
897                          videoMediaList_.item.video.codec.Profile = VIDEO_PROFILE_0_H263;                          videoMediaList_.item.video.codec.Profile = VIDEO_PROFILE_0_H263;
898                          videoMediaList_.item.video.codec.ImageWidth = VIDEO_IMAGE_WIDTH_176;                          videoMediaList_.item.video.codec.ImageWidth = VIDEO_IMAGE_WIDTH_176;
# Line 847  Line 901 
901                  }                  }
902          }          }
903    
904          videoMediaList_.ItemChain = EMM_ITEM_EOT;                  videoFilePath += videoFile;
905          videoMediaList_.item.video.szFileName = videoFile.c_str();                  videoMediaList_.item.video.szFileName = videoFilePath.c_str();
906          videoMediaList_.item.video.eFileFormat = EMM_FILE_FORMAT_PROPRIETARY;  
907          videoMediaList_.item.video.unMode = 0;                  /* append */
908          videoMediaList_.item.video.unOffset = 0;                  playRecordList_[count++].ItemChain = EMM_ITEM_CONT;
909    
910          INIT_MM_PLAY_RECORD_LIST(&playRecordList_[0]);                  INIT_MM_PLAY_RECORD_LIST(&playRecordList_[count]);
911          playRecordList_[0].ItemType = EMM_MEDIA_TYPE_AUDIO;                  playRecordList_[count].ItemType = EMM_MEDIA_TYPE_VIDEO;
912          playRecordList_[0].list = &audioMediaList_;                  playRecordList_[count].list = &videoMediaList_;
913          playRecordList_[0].ItemChain = EMM_ITEM_CONT;                  playRecordList_[count].ItemChain = EMM_ITEM_EOT;
914            }
         INIT_MM_PLAY_RECORD_LIST(&playRecordList_[1]);  
         playRecordList_[1].ItemType     = EMM_MEDIA_TYPE_VIDEO;  
         playRecordList_[1].list = &videoMediaList_;  
         playRecordList_[1].ItemChain = EMM_ITEM_EOT;  
915    
916          INIT_MM_RECORD_INFO(&recordInfo_);          INIT_MM_RECORD_INFO(&recordInfo_);
917          recordInfo_.eFileFormat = EMM_FILE_FORMAT_UNDEFINED;          recordInfo_.eFileFormat = EMM_FILE_FORMAT_UNDEFINED;
918          recordInfo_.list = playRecordList_;          recordInfo_.list = playRecordList_;
919    
         // XXX sendIFrameRequest();  
   
920          LOGDEBUG("MmDevice::record() device: " << getDeviceName() <<          LOGDEBUG("MmDevice::record() device: " << getDeviceName() <<
921                   " a=" << audioMediaList_.item.audio.szFileName <<                   " a=" << audioMediaList_.item.audio.szFileName <<
922                   ", v=" << videoMediaList_.item.video.szFileName);                   ", v=" << videoMediaList_.item.video.szFileName);
923    
924            // XXX sendIFrameRequest();
925    
926          if ( mm_Record(devHandle_, &recordInfo_, NULL, 0) == EMM_ERROR )          if ( mm_Record(devHandle_, &recordInfo_, NULL, 0) == EMM_ERROR )
927          {          {
928                  LOGERROR("mm_Record() failed on device: " << getDeviceName());                  LOGERROR("mm_Record() failed on device: " << getDeviceName());
929                  return false;                  return false;
930          }          }
   
931          recordActive_ = true;          recordActive_ = true;
932          busy_ = true;          busy_ = true;
933          return true;          return true;

Legend:
Removed from v.537  
changed lines
  Added in v.538

No admin address has been configured
ViewVC Help
Powered by ViewVC 1.0.8