public void StartAndStopMulticastStreamingAACIPv4AudioOnly() { MediaConfigurationChangeLog changeLog = new MediaConfigurationChangeLog(); Profile profile = null; bool multicastStarted = false; RunTest(() => { //profile creating if (CreateOrSelectAudioProfile(ref profile, AudioEncoding.AAC, changeLog) == false) { // test should be passed if there is no appropriate ready profiles found // or we can't create new profile return; } // adding AudioSource and AudioEncoder configurations with support of necessary audio codec AudioEncoderConfigurationOptions audioOptions = null; SelectAudioSourceEncoderConfigs(ref profile, AudioEncoding.AAC, ref audioOptions); // streaming AudioMulticastStreamingSetup2(ref profile, audioOptions, AudioEncoding.AAC, TransportProtocol.UDP, StreamType.RTPMulticast, IPType.IPv4, out multicastStarted, changeLog); }, () => { if (multicastStarted) { StopMulticastStreaming2(profile); } RestoreMediaConfiguration(changeLog); } ); }
protected AudioEncoderConfigurationOptions GetAudioEncoderConfigurationOptions() { MediaClient mediaClient = MediaClient; AudioEncoderConfigurationOptions options = null; RunStep(() => { options = mediaClient.GetAudioEncoderConfigurationOptions(null, null); }, "Get Audio Encoder Configuration Options"); DoRequestDelay(); return(options); }
public void GetAudioEncoderConfigOptions(string config) { RunInBackground(new Action(() => { AudioEncoderConfigurationOptions options = Client.GetAudioEncoderConfigurationOptions(config, null); if (OnAudioEncoderConfigOptionsReceived != null) { OnAudioEncoderConfigOptionsReceived(options); } })); }
int FindNearestAudioSamplerate(int current, AudioEncoding encoding, AudioEncoderConfigurationOptions options) { int samplerate = 0; int difference = int.MaxValue; foreach (AudioEncoderConfigurationOption opt in options.Options) { if (opt.Encoding == encoding && opt.SampleRateList != null) { foreach (int val in opt.SampleRateList) { int diff = System.Math.Abs(val - current); if (diff < difference) { difference = diff; samplerate = val; } } } } return(samplerate); }
int FindNearestAudioBitrate(int current, AudioEncoding encoding, AudioEncoderConfigurationOptions options) { int bitrate = 0; int difference = int.MaxValue; foreach (AudioEncoderConfigurationOption opt in options.Options) { if (opt.Encoding == encoding && opt.BitrateList != null) { foreach (int b in opt.BitrateList) { int diff = System.Math.Abs(b - current); if (diff < difference) { difference = diff; bitrate = b; } } } } return(bitrate); }
public void ProfilesAudioEncoderConfigurationAndConfigurationOptionsConsistencyTest() { RunTest(() => { Profile[] profiles = GetProfiles(); Assert(profiles != null, "DUT did not return any profile", "Check if the DUT returned media profiles"); foreach (Profile profile in profiles) { if (profile.AudioEncoderConfiguration != null) { AudioEncoderConfigurationOptions options = GetAudioEncoderConfigurationOptions(profile.AudioEncoderConfiguration.token, profile.token); CheckOptionsExist(options, profile.AudioEncoderConfiguration); } } }); }
public void AudioEncoderConfigurationAndConfigurationOptionsConsistencyTest() { RunTest(() => { // Audio Encoder configurations AudioEncoderConfiguration[] configurations = GetAudioEncoderConfigurations(); Assert(configurations != null, "DUT did not return any configuration", "Check if the DUT returned configurations"); foreach (AudioEncoderConfiguration configuration in configurations) { AudioEncoderConfigurationOptions options = GetAudioEncoderConfigurationOptions(configuration.token, null); Assert(options != null, "DUT did not return audio encoder configuration options", "Check if the DUT returned audio encoder configuration options"); CheckOptionsExist(options, configuration); } }); }
MediaUri GetAudioMediaUri( TestAudioEncoderConfigurationOptions audioTest, string audioCodec, AudioEncoding audioEncoding, StreamType streamType, TransportProtocol protocol, IPType?multicastAddressType) { Profile[] profiles = GetProfiles(); Profile profile = null; AudioEncoderConfigurationOptions audioOptions = null; int bitrate = 0; int sampleRate = 0; RunStep(() => { foreach (Profile p in profiles) { if (p.AudioEncoderConfiguration != null && p.AudioSourceConfiguration != null) { LogStepEvent("GetAudioEncoderConfigurationOptions"); audioOptions = Client.GetAudioEncoderConfigurationOptions(p.AudioEncoderConfiguration.token, p.token); DoRequestDelay(); if (audioTest(audioOptions)) { profile = p; LogStepEvent("OK - profile found"); break; } } else { LogStepEvent("GetAudioEncoderConfigurations"); AudioEncoderConfiguration[] audioEncoderConfigurations = Client.GetAudioEncoderConfigurations(); DoRequestDelay(); bool audioEncoderConfigurationFound = false; foreach (AudioEncoderConfiguration configuration in audioEncoderConfigurations) { LogStepEvent("GetAudioEncoderConfigurationOptions"); audioOptions = Client.GetAudioEncoderConfigurationOptions(configuration.token, p.token); DoRequestDelay(); if (audioTest(audioOptions)) { if (p.AudioSourceConfiguration == null) { AudioSourceConfiguration[] audioSourceConfigurations = Client.GetAudioSourceConfigurations(); DoRequestDelay(); if (audioSourceConfigurations.Length > 0) { LogStepEvent("AddAudioSourceConfiguration"); Client.AddAudioSourceConfiguration(p.token, audioSourceConfigurations[0].token); DoRequestDelay(); } else { throw new DutPropertiesException("Audio Source Configurations not found"); } } LogStepEvent("AddAudioEncoderConfiguration"); Client.AddAudioEncoderConfiguration(p.token, configuration.token); DoRequestDelay(); p.AudioEncoderConfiguration = configuration; profile = p; LogStepEvent(string.Format("Add Audio configuration to the {0} profile - OK", profile.Name)); audioEncoderConfigurationFound = true; break; } } if (!audioEncoderConfigurationFound) { throw new DutPropertiesException("Audio Encoder Configuration with required properties not found"); } } } if (profile == null) { throw new DutPropertiesException("Respective profile cannot be found or created"); } }, string.Format("Select or create profile with {0} Audio encoder configuration", audioCodec)); // find nearest bitrate and samplerate bitrate = FindNearestAudioBitrate(profile.AudioEncoderConfiguration.Bitrate, audioEncoding, audioOptions); sampleRate = FindNearestAudioSamplerate(profile.AudioEncoderConfiguration.SampleRate, audioEncoding, audioOptions); if (multicastAddressType.HasValue) { SetMulticastSettings(profile, false, true, multicastAddressType.Value); } profile.AudioEncoderConfiguration.Encoding = audioEncoding; profile.AudioEncoderConfiguration.Bitrate = bitrate; profile.AudioEncoderConfiguration.SampleRate = sampleRate; SetAudioEncoderConfiguration(profile.AudioEncoderConfiguration, false, multicastAddressType.HasValue); StreamSetup streamSetup = new StreamSetup(); streamSetup.Transport = new Transport(); streamSetup.Transport.Protocol = protocol; streamSetup.Stream = streamType; UsedProfileToken = profile.token; MediaUri streamUri = GetStreamUri(streamSetup, profile.token); AdjustVideo(protocol, streamType, streamUri, profile.VideoEncoderConfiguration); return(streamUri); }
bool CheckAudioSupport(AudioEncoderConfigurationOptions options, AudioEncoding audioEncoding) { return((options.Options != null) && (options.Options.Where(o => o.Encoding == audioEncoding).FirstOrDefault() != null)); }
MediaUri GetAudioVideoMediaUri(TestVideoEncoderConfigurationOptions videoTest, string videoCodec, VideoEncoding encoding, TestAudioEncoderConfigurationOptions audioTest, string audioCodec, AudioEncoding audioEncoding, StreamType streamType, TransportProtocol protocol, IPType?multicastAddressType) { Profile[] profiles = GetProfiles(); Profile profile = null; VideoEncoderConfigurationOptions options = null; int bitrate = 0; int sampleRate = 0; RunStep(() => { foreach (Profile p in profiles) { LogStepEvent(string.Format("Check if {0} profile satisfies current needs", p.Name)); if (p.VideoEncoderConfiguration != null) { LogStepEvent("GetVideoEncoderConfigurationOptions"); VideoEncoderConfigurationOptions videoOptions = Client.GetVideoEncoderConfigurationOptions(p.VideoEncoderConfiguration.token, p.token); DoRequestDelay(); if (videoTest(videoOptions)) { // Video configuration OK - configure Audio, if needed. options = videoOptions; if (p.AudioEncoderConfiguration != null && p.AudioSourceConfiguration != null) { LogStepEvent("GetAudioEncoderConfigurationOptions"); AudioEncoderConfigurationOptions audioOptions = Client.GetAudioEncoderConfigurationOptions(p.AudioEncoderConfiguration.token, p.token); DoRequestDelay(); if (audioTest(audioOptions)) { profile = p; LogStepEvent("OK - profile found"); // find nearest bitrate and samplerate bitrate = FindNearestAudioBitrate(p.AudioEncoderConfiguration.Bitrate, audioEncoding, audioOptions); sampleRate = FindNearestAudioSamplerate(p.AudioEncoderConfiguration.SampleRate, audioEncoding, audioOptions); break; } } else { LogStepEvent("GetAudioEncoderConfigurations"); AudioEncoderConfiguration[] audioEncoderConfigurations = Client.GetAudioEncoderConfigurations(); DoRequestDelay(); bool audioEncoderConfigurationFound = false; foreach (AudioEncoderConfiguration configuration in audioEncoderConfigurations) { LogStepEvent("GetAudioEncoderConfigurationOptions"); AudioEncoderConfigurationOptions audioOptions = Client.GetAudioEncoderConfigurationOptions(configuration.token, p.token); DoRequestDelay(); if (audioTest(audioOptions)) { if (p.AudioSourceConfiguration == null) { AudioSourceConfiguration[] audioSourceConfigurations = Client.GetAudioSourceConfigurations(); DoRequestDelay(); if (audioSourceConfigurations.Length > 0) { LogStepEvent("AddAudioSourceConfiguration"); Client.AddAudioSourceConfiguration(p.token, audioSourceConfigurations[0].token); DoRequestDelay(); } else { throw new DutPropertiesException("Audio Source Configurations not found"); } } bitrate = FindNearestAudioBitrate(configuration.Bitrate, audioEncoding, audioOptions); sampleRate = FindNearestAudioSamplerate(configuration.SampleRate, audioEncoding, audioOptions); LogStepEvent("AddAudioEncoderConfiguration"); Client.AddAudioEncoderConfiguration(p.token, configuration.token); DoRequestDelay(); p.AudioEncoderConfiguration = configuration; profile = p; LogStepEvent(string.Format("Add Audio configuration to the {0} profile - OK", profile.Name)); audioEncoderConfigurationFound = true; break; } } if (!audioEncoderConfigurationFound) { throw new DutPropertiesException("Audio Encoder Configuration with required properties not found"); } } } } } if (profile == null) { throw new DutPropertiesException("Respective profile cannot be found or created"); } }, string.Format("Select or create profile with {0} Video encoder configuration and {1} Audio encoder configuration", videoCodec, audioCodec)); // profile found profile.VideoEncoderConfiguration.Encoding = encoding; // support for extensions (bitrate limits) // fix for Panasonic if (encoding == VideoEncoding.JPEG) { profile.VideoEncoderConfiguration.MPEG4 = null; profile.VideoEncoderConfiguration.H264 = null; // support for extensions (bitrate limits) if (options.Extension != null) { if (options.Extension.JPEG != null) { if (options.Extension.JPEG.BitrateRange != null) { if (profile.VideoEncoderConfiguration.RateControl.BitrateLimit < options.Extension.JPEG.BitrateRange.Min) { profile.VideoEncoderConfiguration.RateControl.BitrateLimit = options.Extension.JPEG.BitrateRange.Min; } if (profile.VideoEncoderConfiguration.RateControl.BitrateLimit > options.Extension.JPEG.BitrateRange.Max) { profile.VideoEncoderConfiguration.RateControl.BitrateLimit = options.Extension.JPEG.BitrateRange.Max; } } } } } if (encoding == VideoEncoding.MPEG4) { profile.VideoEncoderConfiguration.H264 = null; // support for extensions (bitrate limits) if (options.Extension != null) { if (options.Extension.MPEG4 != null) { if (options.Extension.MPEG4.BitrateRange != null) { if (profile.VideoEncoderConfiguration.RateControl.BitrateLimit < options.Extension.MPEG4.BitrateRange.Min) { profile.VideoEncoderConfiguration.RateControl.BitrateLimit = options.Extension.MPEG4.BitrateRange.Min; } if (profile.VideoEncoderConfiguration.RateControl.BitrateLimit > options.Extension.MPEG4.BitrateRange.Max) { profile.VideoEncoderConfiguration.RateControl.BitrateLimit = options.Extension.MPEG4.BitrateRange.Max; } } } } } if (encoding == VideoEncoding.H264) { profile.VideoEncoderConfiguration.MPEG4 = null; // support for extensions (bitrate limits) if (options.Extension != null) { if (options.Extension.H264 != null) { if (options.Extension.H264.BitrateRange != null) { if (profile.VideoEncoderConfiguration.RateControl.BitrateLimit < options.Extension.H264.BitrateRange.Min) { profile.VideoEncoderConfiguration.RateControl.BitrateLimit = options.Extension.H264.BitrateRange.Min; } if (profile.VideoEncoderConfiguration.RateControl.BitrateLimit > options.Extension.H264.BitrateRange.Max) { profile.VideoEncoderConfiguration.RateControl.BitrateLimit = options.Extension.H264.BitrateRange.Max; } } } } } if (multicastAddressType.HasValue) { SetMulticastSettings(profile, true, true, multicastAddressType.Value); } SetVideoEncoderConfiguration(profile.VideoEncoderConfiguration, false, multicastAddressType.HasValue); profile.AudioEncoderConfiguration.Encoding = audioEncoding; profile.AudioEncoderConfiguration.Bitrate = bitrate; profile.AudioEncoderConfiguration.SampleRate = sampleRate; SetAudioEncoderConfiguration(profile.AudioEncoderConfiguration, false, multicastAddressType.HasValue); StreamSetup streamSetup = new StreamSetup(); streamSetup.Transport = new Transport(); streamSetup.Transport.Protocol = protocol; streamSetup.Stream = streamType; UsedProfileToken = profile.token; MediaUri streamUri = GetStreamUri(streamSetup, profile.token); AdjustVideo(protocol, streamType, streamUri, profile.VideoEncoderConfiguration); return(streamUri); }
/// <summary> /// Handles audio encoder configuration options received event /// </summary> /// <param name="options">Received profiles</param> protected void OnAudioEncoderConfigOptionsReceived(AudioEncoderConfigurationOptions options) { View.SetAudioEncoderConfigOptions(options); }
public void SetAudioSourceConfigurationTest() { Profile deletedProfile = null; Profile createdProfile = null; Profile modifiedProfile = null; AudioEncoding backupEncoding = AudioEncoding.G711; AudioEncoderConfiguration configBackup = null; RunTest( () => { string reason; bool executeAnnex = false; Profile profile = null; //3. ONVIF Client invokes CreateProfileRequest message (ProfileToken = ‘testprofileX’) // to create new profile. //4. Verify CreateProfileResponse message or SOAP 1.2 fault message (Action/MaxNVTProfiles) // from the DUT. If fault was received execute Annex A.1 /// create profile try { BeginStep("Create profile"); profile = Client.CreateProfile("testprofileX", null); StepPassed(); Assert(IsEmptyProfile(profile, out reason), reason, Resources.StepValidatingNewProfile_Title); createdProfile = profile; } catch (FaultException exc) { LogFault(exc); string faultDump; if (exc.IsValidOnvifFault("Receiver/Action/MaxNVTProfiles", out faultDump)) { LogStepEvent("Unable to create profile - delete one or select existing for test"); executeAnnex = true; StepPassed(); } else { throw exc; } } if (executeAnnex) { Profile[] profiles = GetProfiles(); bool nonFixedFound = false; foreach (Profile p in profiles) { if (!(p.fixedSpecified && p.@fixed)) { nonFixedFound = true; deletedProfile = p; DeleteProfile(p.token); break; } } if (nonFixedFound) { profile = CreateProfile("testprofileX", null); createdProfile = profile; } else { bool audioProfileFound = false; foreach (Profile p in profiles) { if (p.AudioSourceConfiguration != null) { profile = p; LogTestEvent(string.Format("Use profile with token '{0}' for test{1}", p.token, System.Environment.NewLine)); modifiedProfile = p; audioProfileFound = true; break; } } if (!audioProfileFound) { LogTestEvent("Unable to create or select profile with Audio configuration for test."); return; } } } //5. ONVIF Client will invoke GetCompatibleAudioSourceConfigurationsRequest message // (ProfileToken = ‘testprofileX’) to retrieve the list of audio source configurations // compatible with profile. //6. ONVIF Client verifies the list of audio source configurations sent by DUT. // Audio source AudioSourceConfiguration[] configs = GetCompatibleAudioSourceConfigurations(profile.token); Assert(ValidateAudioSourceConfigs(configs, out reason), reason, Resources.StepValidatingAudioSources_Title); //7. ONVIF Client invokes AddAudioSourceConfigurationRequest message // (ProfileToken = ‘testprofileX’, ConfigurationToken as one of the tokens received in the // GetCompatibleAudioSourceConfigurationsResponse message) to add audio source configuration // to profile. //8. DUT adds the audio source configuration to the profile and sends the response. AudioSourceConfiguration config = configs[0]; AddAudioSourceConfiguration(profile.token, config.token); //9. ONVIF Client invokes GetCompatibleAudioEncoderConfigurationsRequest message // (ProfileToken = ‘testprofileX’) to retrieve audio encoder configurations compatible with // profile. //10. DUT sends the list of audio encoder configurations compatible with the received // media profile token. // Audio encoder AudioEncoderConfiguration[] encoderConfigurations = GetCompatibleAudioEncoderConfigurations(profile.token); Assert(ValidateAudioEncoderConfigs(encoderConfigurations, out reason), reason, Resources.StepValidatingAudioEncoders_Title); //11. ONVIF Client invokes AddAudioEncoderConfigurationRequest message (ProfileToken = // ‘testprofileX’, ConfigurationToken as one of the tokens received in the // GetCompatibleAudioencoderConfigurationsResponse message) to add audio encoder // configuration to profile. //12. DUT adds the audio encoder configuration to the profile and sends the response. AudioEncoderConfiguration encoderConfig = encoderConfigurations[0]; AddAudioEncoderConfiguration(profile.token, encoderConfig.token); //13. ONVIF Client invokes GetAudioEncoderConfigurationOptionsRequest // (ProfileToken = ‘testprofileX’) request to retrieve audio encoder options for // specified profile. //14. DUT sends the audio encoder configuration options which could be applied // to audio encoder from specified profile. AudioEncoderConfigurationOptions options = GetAudioEncoderConfigurationOptions(null, profile.token); Assert(options != null && options.Options != null, "No Audio Encoder Configuration options returned", "Validate response received"); // Select valid options List <AudioEncoderConfigurationOption> validOptions = options.Options.Where(o => o.BitrateList != null && o.SampleRateList != null).ToList(); Assert(validOptions.Count > 0, "No valid options can be selected", "Select AudioEncoderConfigurationOption to check configuration changing"); configBackup = Utils.CopyMaker.CreateCopy(encoderConfig); backupEncoding = encoderConfig.Encoding; List <AudioEncoderConfigurationOption> opts = validOptions.Where(O => O.Encoding != backupEncoding).ToList(); AudioEncoderConfigurationOption encodingDifferent = opts.FirstOrDefault(); if (opts.Count == 0) { opts = validOptions; } // select with different encoding AudioEncoderConfigurationOption selectedOptions = null; AudioEncoderConfigurationOption bitrateDifferent = null; AudioEncoderConfigurationOption sampleRateDifferent = null; foreach (AudioEncoderConfigurationOption opt in opts) { bool bitrateDiffers = opt.BitrateList.Where(B => B != encoderConfig.Bitrate).Count() > 0; bool sampleRateDiffers = opt.SampleRateList.Where(SR => SR != encoderConfig.SampleRate).Count() > 0; if (bitrateDiffers && sampleRateDiffers) { selectedOptions = opt; break; } if (bitrateDiffers) { bitrateDifferent = opt; } if (sampleRateDiffers) { sampleRateDifferent = opt; } } if (selectedOptions == null) { selectedOptions = (encodingDifferent != null) ? encodingDifferent : (bitrateDifferent != null ? bitrateDifferent : sampleRateDifferent); } if (selectedOptions != null) { //15. ONVIF Client invokes SetAudioEncoderConfigurationRequest message // (ConfigurationToken, Encoding=[other than current], Bitrate = [other than current], // SampleRate = [other than current], ForcePersistence = false, where all values was // taken from audio encoder configuration options) to change //16. DUT sends SetAudioEncoderConfigurationResponse message. // Update encoder configuration encoderConfig.Encoding = selectedOptions.Encoding; List <int> bitrates = selectedOptions.BitrateList.Where(B => B != encoderConfig.Bitrate).ToList(); if (bitrates.Count > 0) { encoderConfig.Bitrate = bitrates[0]; } List <int> sampleRates = selectedOptions.SampleRateList.Where(SR => SR != encoderConfig.SampleRate).ToList(); if (sampleRates.Count > 0) { encoderConfig.SampleRate = sampleRates[0]; } SetAudioEncoderConfiguration(encoderConfig, false); //17. ONVIF Client invokes GetAudioEncoderConfigurationRequest message // (ConfigurationToken) to get new audio encoder configuration parameters. //18. DUT sends GetAudioEncoderConfigurationResponse message with parameters // specified in set request. AudioEncoderConfiguration actual = GetAudioEncoderConfiguration(encoderConfig.token); //19. ONVIF Client checks that Audio configuration in GetAudioEncoderConfigurationResponse // message is the same as in SetAudioEncoderConfigurationRequest message. string err = null; bool equal = EqualConfigurations(encoderConfig, actual, out err); string message = string.Format(Resources.ErrorAudioEncoderConfigNotEqual_Format, System.Environment.NewLine + err); Assert(equal, message, Resources.StepCompareAudioEncoderConfigs_Title); } //20. If used created Media Profile then ONVIF Client invokes DeleteProfileRequest // message (ProfileToken = ‘testprofileX’). Otherwise ONVIF client skip rest steps // and and restore profile settings. //21. DUT deletes the media profile and sends the response. if (modifiedProfile == null) { // // if modifiedProfile != null, it means that all profiles have "fixed" attribute // and one of them has been selected for test. // In this case we cannot delete this profile. // DeleteProfile(profile.token); createdProfile = null; } }, () => { if (configBackup != null) { SetAudioEncoderConfiguration(configBackup, true); } if (createdProfile != null) { DeleteProfile(createdProfile.token); } string remark = null; bool create = true; Profile profileToRestore = null; if (deletedProfile != null) { profileToRestore = deletedProfile; remark = "Restore profile deleted during the test"; } if (modifiedProfile != null) { // // We did not change video etc. configirations during the test. // The only configurations which (possible) need to be restored are // audio source and audio encoder (add) // profileToRestore = modifiedProfile; remark = "Restore profile modified during the test"; create = false; } if (profileToRestore != null) { // profile has been deleted for test: add all possible configurations // profile has been selected for test: it has been deleted at the end. RestoreProfile(profileToRestore, remark, create); } }); }
// ANNEX A.X1 Media Profile Configuration for Audio Streaming protected Profile SelectAudioProfile( AudioEncoding audioEncoding, string audioCodec, TestAudioEncoderConfigurationOptions testAudio, ref AudioEncoderConfigurationOptions audioOptions) { Profile[] profiles = GetProfiles(); Profile profile = null; AudioEncoderConfigurationOptions audioOptionsTmp = null; RunStep(() => { foreach (Profile p in profiles) { if (p.AudioEncoderConfiguration != null && p.AudioSourceConfiguration != null) { LogStepEvent("GetAudioEncoderConfigurationOptions"); audioOptionsTmp = Client.GetAudioEncoderConfigurationOptions(p.AudioEncoderConfiguration.token, p.token); DoRequestDelay(); if (testAudio(audioOptionsTmp)) { profile = p; LogStepEvent("OK - profile found"); break; } } else { LogStepEvent("GetAudioEncoderConfigurations"); AudioEncoderConfiguration[] audioEncoderConfigurations = Client.GetAudioEncoderConfigurations(); DoRequestDelay(); bool audioEncoderConfigurationFound = false; foreach (AudioEncoderConfiguration configuration in audioEncoderConfigurations) { LogStepEvent("GetAudioEncoderConfigurationOptions"); audioOptionsTmp = Client.GetAudioEncoderConfigurationOptions(configuration.token, p.token); DoRequestDelay(); if (testAudio(audioOptionsTmp)) { if (p.AudioSourceConfiguration == null) { AudioSourceConfiguration[] audioSourceConfigurations = Client.GetAudioSourceConfigurations(); DoRequestDelay(); if (audioSourceConfigurations.Length > 0) { LogStepEvent("AddAudioSourceConfiguration"); Client.AddAudioSourceConfiguration(p.token, audioSourceConfigurations[0].token); DoRequestDelay(); } else { throw new DutPropertiesException("Audio Source Configurations not found"); } } LogStepEvent("AddAudioEncoderConfiguration"); Client.AddAudioEncoderConfiguration(p.token, configuration.token); DoRequestDelay(); p.AudioEncoderConfiguration = configuration; profile = p; LogStepEvent(string.Format("Add Audio configuration to the {0} profile - OK", profile.Name)); audioEncoderConfigurationFound = true; break; } } if (!audioEncoderConfigurationFound) { throw new DutPropertiesException("Audio Encoder Configuration with required properties not found"); } } } if (profile == null) { throw new DutPropertiesException("Respective profile cannot be found or created"); } }, string.Format("Select or create profile with {0} Audio encoder configuration", audioCodec)); // find nearest bitrate and samplerate profile.AudioEncoderConfiguration.Bitrate = FindNearestAudioBitrate(profile.AudioEncoderConfiguration.Bitrate, audioEncoding, audioOptions); profile.AudioEncoderConfiguration.SampleRate = FindNearestAudioSamplerate(profile.AudioEncoderConfiguration.SampleRate, audioEncoding, audioOptions); audioOptions = audioOptionsTmp; return(profile); }
public void SetAudioSourceConfigurationTest() { Profile deletedProfile = null; Profile createdProfile = null; Profile modifiedProfile = null; AudioEncoding backupEncoding = AudioEncoding.G711; AudioEncoderConfiguration configBackup = null; RunTest( () => { Profile profile = CreateProfileByAnnex3("testprofileX", null, out deletedProfile, out createdProfile, out modifiedProfile); string reason; //5. ONVIF Client will invoke GetCompatibleAudioSourceConfigurationsRequest message // (ProfileToken = ‘testprofileX’) to retrieve the list of audio source configurations // compatible with profile. //6. ONVIF Client verifies the list of audio source configurations sent by DUT. // Audio source AudioSourceConfiguration[] configs = GetCompatibleAudioSourceConfigurations(profile.token); Assert(ValidateAudioSourceConfigs(configs, out reason), reason, Resources.StepValidatingAudioSources_Title); //7. ONVIF Client invokes AddAudioSourceConfigurationRequest message // (ProfileToken = ‘testprofileX’, ConfigurationToken as one of the tokens received in the // GetCompatibleAudioSourceConfigurationsResponse message) to add audio source configuration // to profile. //8. DUT adds the audio source configuration to the profile and sends the response. AudioSourceConfiguration config = configs[0]; AddAudioSourceConfiguration(profile.token, config.token); //9. ONVIF Client invokes GetCompatibleAudioEncoderConfigurationsRequest message // (ProfileToken = ‘testprofileX’) to retrieve audio encoder configurations compatible with // profile. //10. DUT sends the list of audio encoder configurations compatible with the received // media profile token. // Audio encoder AudioEncoderConfiguration[] encoderConfigurations = GetCompatibleAudioEncoderConfigurations(profile.token); Assert(ValidateAudioEncoderConfigs(encoderConfigurations, out reason), reason, Resources.StepValidatingAudioEncoders_Title); //11. ONVIF Client invokes AddAudioEncoderConfigurationRequest message (ProfileToken = // ‘testprofileX’, ConfigurationToken as one of the tokens received in the // GetCompatibleAudioencoderConfigurationsResponse message) to add audio encoder // configuration to profile. //12. DUT adds the audio encoder configuration to the profile and sends the response. AudioEncoderConfiguration encoderConfig = encoderConfigurations[0]; AddAudioEncoderConfiguration(profile.token, encoderConfig.token); //13. ONVIF Client invokes GetAudioEncoderConfigurationOptionsRequest // (ProfileToken = ‘testprofileX’) request to retrieve audio encoder options for // specified profile. //14. DUT sends the audio encoder configuration options which could be applied // to audio encoder from specified profile. AudioEncoderConfigurationOptions options = GetAudioEncoderConfigurationOptions(null, profile.token); Assert(options != null && options.Options != null, "No Audio Encoder Configuration options returned", "Validate response received"); // Select valid options List <AudioEncoderConfigurationOption> validOptions = options.Options.Where(o => o.BitrateList != null && o.SampleRateList != null).ToList(); Assert(validOptions.Count > 0, "No valid options can be selected", "Select AudioEncoderConfigurationOption to check configuration changing"); configBackup = Utils.CopyMaker.CreateCopy(encoderConfig); backupEncoding = encoderConfig.Encoding; List <AudioEncoderConfigurationOption> opts = validOptions.Where(O => O.Encoding != backupEncoding).ToList(); AudioEncoderConfigurationOption encodingDifferent = opts.FirstOrDefault(); if (opts.Count == 0) { opts = validOptions; } // select with different encoding AudioEncoderConfigurationOption selectedOptions = null; AudioEncoderConfigurationOption bitrateDifferent = null; AudioEncoderConfigurationOption sampleRateDifferent = null; foreach (AudioEncoderConfigurationOption opt in opts) { bool bitrateDiffers = opt.BitrateList.Where(B => B != encoderConfig.Bitrate).Count() > 0; bool sampleRateDiffers = opt.SampleRateList.Where(SR => SR != encoderConfig.SampleRate).Count() > 0; if (bitrateDiffers && sampleRateDiffers) { selectedOptions = opt; break; } if (bitrateDiffers) { bitrateDifferent = opt; } if (sampleRateDiffers) { sampleRateDifferent = opt; } } if (selectedOptions == null) { selectedOptions = (encodingDifferent != null) ? encodingDifferent : (bitrateDifferent != null ? bitrateDifferent : sampleRateDifferent); } if (selectedOptions != null) { //15. ONVIF Client invokes SetAudioEncoderConfigurationRequest message // (ConfigurationToken, Encoding=[other than current], Bitrate = [other than current], // SampleRate = [other than current], ForcePersistence = false, where all values was // taken from audio encoder configuration options) to change //16. DUT sends SetAudioEncoderConfigurationResponse message. // Update encoder configuration encoderConfig.Encoding = selectedOptions.Encoding; List <int> bitrates = selectedOptions.BitrateList.Where(B => B != encoderConfig.Bitrate).ToList(); if (bitrates.Count > 0) { encoderConfig.Bitrate = bitrates[0]; } List <int> sampleRates = selectedOptions.SampleRateList.Where(SR => SR != encoderConfig.SampleRate).ToList(); if (sampleRates.Count > 0) { encoderConfig.SampleRate = sampleRates[0]; } SetAudioEncoderConfiguration(encoderConfig, false); //17. ONVIF Client invokes GetAudioEncoderConfigurationRequest message // (ConfigurationToken) to get new audio encoder configuration parameters. //18. DUT sends GetAudioEncoderConfigurationResponse message with parameters // specified in set request. AudioEncoderConfiguration actual = GetAudioEncoderConfiguration(encoderConfig.token); //19. ONVIF Client checks that Audio configuration in GetAudioEncoderConfigurationResponse // message is the same as in SetAudioEncoderConfigurationRequest message. string err = null; bool equal = EqualConfigurations(encoderConfig, actual, out err); string message = string.Format(Resources.ErrorAudioEncoderConfigNotEqual_Format, System.Environment.NewLine + err); Assert(equal, message, Resources.StepCompareAudioEncoderConfigs_Title); } }, () => { if (configBackup != null) { SetAudioEncoderConfiguration(configBackup, true); } RestoreProfileByAnnex3(deletedProfile, createdProfile, modifiedProfile); }); }