Example #1
0
        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);
            }
                    );
        }
Example #2
0
        protected AudioEncoderConfigurationOptions GetAudioEncoderConfigurationOptions()
        {
            MediaClient mediaClient = MediaClient;
            AudioEncoderConfigurationOptions options = null;

            RunStep(() => { options = mediaClient.GetAudioEncoderConfigurationOptions(null, null); }, "Get Audio Encoder Configuration Options");
            DoRequestDelay();
            return(options);
        }
Example #3
0
 public void GetAudioEncoderConfigOptions(string config)
 {
     RunInBackground(new Action(() =>
     {
         AudioEncoderConfigurationOptions options = Client.GetAudioEncoderConfigurationOptions(config, null);
         if (OnAudioEncoderConfigOptionsReceived != null)
         {
             OnAudioEncoderConfigOptionsReceived(options);
         }
     }));
 }
Example #4
0
        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);
        }
Example #5
0
        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);
                }
            });
        }
Example #8
0
        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);
        }
Example #9
0
 bool CheckAudioSupport(AudioEncoderConfigurationOptions options, AudioEncoding audioEncoding)
 {
     return((options.Options != null) &&
            (options.Options.Where(o => o.Encoding == audioEncoding).FirstOrDefault() != null));
 }
Example #10
0
        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);
        }
Example #11
0
 /// <summary>
 /// Handles audio encoder configuration options received event
 /// </summary>
 /// <param name="options">Received profiles</param>
 protected void OnAudioEncoderConfigOptionsReceived(AudioEncoderConfigurationOptions options)
 {
     View.SetAudioEncoderConfigOptions(options);
 }
Example #12
0
        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);
                }
            });
        }
Example #13
0
        // 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);
            });
        }