| 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 |
|
|
| 65 |
*/ |
*/ |
| 66 |
MmDevice::~MmDevice() |
MmDevice::~MmDevice() |
| 67 |
{ |
{ |
|
delete mediaFinder_; |
|
| 68 |
} |
} |
| 69 |
|
|
| 70 |
|
|
| 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: |
| 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, |
| 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, |
| 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; |
| 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; |
| 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; |
| 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; |
| 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; |