private void TestDescription() { StringBuilder sb = null; int i = 0; m_pProfile.SetDescription("moo2"); m_pProfile.GetDescription(sb, ref i); sb = new StringBuilder(i); m_pProfile.GetDescription(sb, ref i); Debug.Assert(sb.ToString() == "moo2"); }
private void SetCutomProfile(int vidbitrate, int audbitrate, int vidheight, int vidwidth, double fps) { //seperate method atm braindump for adjusting an existing profile (prx file) //method call is not enabled yet IWMProfileManager profileManager = null; IWMProfileManager2 profileManager2 = null; IWMProfile profile = null; IWMStreamConfig streamConfig; //IWMInputMediaProps inputProps = null; IWMProfileManagerLanguage profileManagerLanguage = null; WMVersion wmversion = WMVersion.V8_0; int nbrProfiles = 0; short langID; StringBuilder profileName = new StringBuilder(MAXLENPROFNAME); StringBuilder profileDescription = new StringBuilder(MAXLENPROFDESC); int profileNameLen = MAXLENPROFNAME; int profileDescLen = MAXLENPROFDESC; profileName.Length = 0; profileDescription.Length = 0; double videoFps = fps; long singleFramePeriod = (long)((10000000L / fps)); //Guid guidInputType; //int dwInputCount = 0; int hr; int videoBitrate = vidbitrate; int audioBitrate = audbitrate; int videoHeight = vidheight; int videoWidth = vidwidth; double videofps = fps; int streamCount = 0; IWMMediaProps streamMediaProps = null; IntPtr mediaTypeBufferPtr = IntPtr.Zero; uint mediaTypeBufferSize = 0; Guid streamType = Guid.Empty; WmMediaType videoMediaType = new WmMediaType(); //Set WMVIDEOHEADER WMVIDEOINFOHEADER videoInfoHeader = new WMVIDEOINFOHEADER(); //Setup the profile manager hr = WMLib.WMCreateProfileManager(out profileManager); profileManager2 = (IWMProfileManager2)profileManager; //Set profile version - possibly not needed in this case. profileManager2.SetSystemProfileVersion(WMVersion.V8_0); //get the profile to modify string strprofileType = Config.GetFile(Config.Dir.Base, @"Profiles\MPCustom.prx"); //read the profile contents string profileContents = ""; using (StreamReader prx = new StreamReader(strprofileType)) { profileContents = prx.ReadToEnd(); } profileManager2 = profileManager as IWMProfileManager2; profileManagerLanguage = profileManager as IWMProfileManagerLanguage; hr = profileManager2.GetSystemProfileVersion(out wmversion); Log.Info("DVRMS2WMV: WM version=" + wmversion.ToString()); hr = profileManagerLanguage.GetUserLanguageID(out langID); Log.Info("DVRMS2WMV: WM language ID=" + langID.ToString()); hr = profileManager2.SetSystemProfileVersion(DefaultWMversion); hr = profileManager2.GetSystemProfileCount(out nbrProfiles); Log.Info("DVRMS2WMV: ProfileCount=" + nbrProfiles.ToString()); //load the profile contents hr = profileManager.LoadProfileByData(profileContents, out profile); //get the profile name hr = profile.GetName(profileName, ref profileNameLen); Log.Info("DVRMS2WMV: profile name {0}", profileName.ToString()); //get the profile description hr = profile.GetDescription(profileDescription, ref profileDescLen); Log.Info("DVRMS2WMV: profile description {0}", profileDescription.ToString()); //get the stream count hr = profile.GetStreamCount(out streamCount); for (int i = 0; i < streamCount; i++) { profile.GetStream(i, out streamConfig); streamMediaProps = (IWMMediaProps)streamConfig; streamConfig.GetStreamType(out streamType); if (streamType == MediaType.Video) { //adjust the video details based on the user input values. streamConfig.SetBitrate(videoBitrate); streamConfig.SetBufferWindow(-1); //3 or 5 seconds ??? streamMediaProps.GetMediaType(IntPtr.Zero, ref mediaTypeBufferSize); mediaTypeBufferPtr = Marshal.AllocHGlobal((int)mediaTypeBufferSize); streamMediaProps.GetMediaType(mediaTypeBufferPtr, ref mediaTypeBufferSize); Marshal.PtrToStructure(mediaTypeBufferPtr, videoMediaType); Marshal.FreeHGlobal(mediaTypeBufferPtr); Marshal.PtrToStructure(videoMediaType.pbFormat, videoInfoHeader); videoInfoHeader.TargetRect.right = 0; // set to zero to take source size videoInfoHeader.TargetRect.bottom = 0; // set to zero to take source size videoInfoHeader.BmiHeader.Width = videoWidth; videoInfoHeader.BmiHeader.Height = videoHeight; videoInfoHeader.BitRate = videoBitrate; videoInfoHeader.AvgTimePerFrame = singleFramePeriod; //Need to check how this is to be calculated IntPtr vidInfoPtr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(WMVIDEOINFOHEADER))); Marshal.StructureToPtr(videoInfoHeader, vidInfoPtr, false); videoMediaType.pbFormat = vidInfoPtr; hr = streamMediaProps.SetMediaType(videoMediaType); Marshal.FreeHGlobal(vidInfoPtr); } if (streamType == MediaType.Audio) { //adjust the audio details based on the user input //audio is determined from bitrate selection and thus effects audio profile. hr = streamConfig.SetBitrate(audioBitrate); hr = streamConfig.SetBufferWindow(-1); //3 or 5 seconds ??? //TODO: set the WaveformatEx profile info etc } //recofigures the stream ready for saving hr = profile.ReconfigStream(streamConfig); } //save the profile //You should make two calls to SaveProfile. //On the first call, pass NULL as pwszProfile. int profileLength = 0; hr = profileManager2.SaveProfile(profile, null, ref profileLength); //On return, the value of pdwLength is set to the length required to hold the profile in string form. //TODO: set memory buffer to profileLength //Then you can allocate the required amount of memory for the buffer and pass a pointer to it as pwszProfile on the second call. hr = profileManager2.SaveProfile(profile, profileContents, ref profileLength); }
/// <summary> /// Add profile item to the list /// </summary> /// <param name="avformat"></param> /// <param name="profile"></param> /// <param name="guid"></param> /// <param name="filename"></param> /// <returns></returns> public bool AddProfileItem(AsfFormatSelection avformat, IWMProfile profile, Guid guid, string filename) { if(profile == null) { return false; } try { StringBuilder profileName = new StringBuilder(MAXLENPROFNAME); StringBuilder profileDescription = new StringBuilder(MAXLENPROFDESC); int profileNameLen = MAXLENPROFNAME; int profileDescLen = MAXLENPROFDESC; int streamCount = 0; bool audio = false; bool video = false; int audioBitrate = 0; int videoBitrate = 0; profileName.Length = 0; profileDescription.Length = 0; int hr = profile.GetName(profileName, ref profileNameLen); #if DEBUG if(hr < 0) { Debug.WriteLine("GetName failed"); } #endif if(hr >= 0) { hr = profile.GetDescription(profileDescription, ref profileDescLen); #if DEBUG if(hr < 0) { Debug.WriteLine("GetDescription failed"); } #endif } if(hr >= 0) { hr = profile.GetStreamCount(out streamCount); #if DEBUG if(hr < 0) { Debug.WriteLine("GetStreamCount failed"); } #endif } if((streamCount > 0)&&(hr >= 0)) { IWMStreamConfig streamConfig = null; Guid streamGuid = Guid.Empty; audio = false; video = false; audioBitrate = 0; videoBitrate = 0; for(short i = 1;(i <= streamCount)&&(hr >= 0); i++) { hr = profile.GetStreamByNumber(i, out streamConfig); if((hr >= 0)&&(streamConfig != null)) { hr = streamConfig.GetStreamType(out streamGuid); if(hr >= 0) { if(streamGuid == MediaType.Video) { video = true; hr = streamConfig.GetBitrate(out videoBitrate); if(hr < 0) { videoBitrate = 0; } } else if(streamGuid == MediaType.Audio) { audio = true; hr = streamConfig.GetBitrate(out audioBitrate); if(hr < 0) { audioBitrate = 0; } } hr = 0; // Allow possible unreadable bitrates } #if DEBUG else { Debug.WriteLine("GetStreamByNumber failed"); } #endif } // for i } // Create profile format item if(hr >= 0) { WMProfileData profileInfo = new WMProfileData( guid, profileName.ToString(), profileDescription.ToString(), audioBitrate, videoBitrate, audio, video); bool StoreInfo = false; // Check if all profiles are allowed switch(avformat) { case AsfFormatSelection.AllFormats: StoreInfo = true; break; case AsfFormatSelection.AudioOnly: if((profileInfo.Audio)&&(!profileInfo.Video)) { StoreInfo = true; } break; case AsfFormatSelection.Video: if(profileInfo.Video) { StoreInfo = true; } break; case AsfFormatSelection.VideoOnly: if((profileInfo.Video)&&(!profileInfo.Audio)) { StoreInfo = true; } break; default: break; } if(StoreInfo) { if((guid == Guid.Empty)&&(filename != null)&&(filename.Length > 0)) { // Store filename profileInfo.Filename = filename; } else if(guid != Guid.Empty) { profileInfo.Filename = ""; } else { // Either a filename or guid must be supplied profileInfo.Dispose(); return false; } this.InnerList.Add(profileInfo); return true; } } } } catch { // Fatal error occured ... } return false; }
/// <summary> /// Add profile item to the list /// </summary> /// <param name="avformat"></param> /// <param name="profile"></param> /// <param name="guid"></param> /// <param name="filename"></param> /// <returns></returns> public bool AddProfileItem(AsfFormatSelection avformat, IWMProfile profile, Guid guid, string filename) { if (profile == null) { return(false); } try { StringBuilder profileName = new StringBuilder(MAXLENPROFNAME); StringBuilder profileDescription = new StringBuilder(MAXLENPROFDESC); int profileNameLen = MAXLENPROFNAME; int profileDescLen = MAXLENPROFDESC; int streamCount = 0; bool audio = false; bool video = false; int audioBitrate = 0; int videoBitrate = 0; profileName.Length = 0; profileDescription.Length = 0; int hr = profile.GetName(profileName, ref profileNameLen); #if DEBUG if (hr < 0) { Debug.WriteLine("GetName failed"); } #endif if (hr >= 0) { hr = profile.GetDescription(profileDescription, ref profileDescLen); #if DEBUG if (hr < 0) { Debug.WriteLine("GetDescription failed"); } #endif } if (hr >= 0) { hr = profile.GetStreamCount(out streamCount); #if DEBUG if (hr < 0) { Debug.WriteLine("GetStreamCount failed"); } #endif } if ((streamCount > 0) && (hr >= 0)) { IWMStreamConfig streamConfig = null; Guid streamGuid = Guid.Empty; audio = false; video = false; audioBitrate = 0; videoBitrate = 0; for (short i = 1; (i <= streamCount) && (hr >= 0); i++) { hr = profile.GetStreamByNumber(i, out streamConfig); if ((hr >= 0) && (streamConfig != null)) { hr = streamConfig.GetStreamType(out streamGuid); if (hr >= 0) { if (streamGuid == MediaType.Video) { video = true; hr = streamConfig.GetBitrate(out videoBitrate); if (hr < 0) { videoBitrate = 0; } } else if (streamGuid == MediaType.Audio) { audio = true; hr = streamConfig.GetBitrate(out audioBitrate); if (hr < 0) { audioBitrate = 0; } } hr = 0; // Allow possible unreadable bitrates } #if DEBUG else { Debug.WriteLine("GetStreamByNumber failed"); } #endif } // for i } // Create profile format item if (hr >= 0) { WMProfileData profileInfo = new WMProfileData( guid, profileName.ToString(), profileDescription.ToString(), audioBitrate, videoBitrate, audio, video); bool StoreInfo = false; // Check if all profiles are allowed switch (avformat) { case AsfFormatSelection.AllFormats: StoreInfo = true; break; case AsfFormatSelection.AudioOnly: if ((profileInfo.Audio) && (!profileInfo.Video)) { StoreInfo = true; } break; case AsfFormatSelection.Video: if (profileInfo.Video) { StoreInfo = true; } break; case AsfFormatSelection.VideoOnly: if ((profileInfo.Video) && (!profileInfo.Audio)) { StoreInfo = true; } break; } if (StoreInfo) { if ((guid == Guid.Empty) && (filename != null) && (filename.Length > 0)) { // Store filename profileInfo.Filename = filename; } else if (guid != Guid.Empty) { profileInfo.Filename = ""; } else { // Either a filename or guid must be supplied profileInfo.Dispose(); return(false); } InnerList.Add(profileInfo); return(true); } } } } catch { // Fatal error occured ... } return(false); }