public VlcPreparsedMedia(Io.MediaInput mediaInput, VlcMediaInternal media) : base(mediaInput) { if (media == null) { throw new ArgumentNullException("media"); } this.media = media; this.Duration = media.Duration; // List <AudioTrackInfo> audioTracks = new List <AudioTrackInfo>(); List <VideoTrackInfo> videoTracks = new List <VideoTrackInfo>(); libvlc_media_track_info_t[] tracks = media.GetTracksInfo(); foreach (libvlc_media_track_info_t track in tracks) { if (track.i_type == libvlc_track_t.libvlc_track_audio) { AudioTrackInfo audioTrack = new AudioTrackInfo(); audioTrack.BitRate = track.i_rate; audioTrack.Channels = (int)Math.Min(track.i_channels, (uint)int.MaxValue); audioTrack.Code = track.i_codec; audioTrack.Description = LibVlcInterop.vlc_fourcc_GetDescription(0, track.i_codec); audioTracks.Add(audioTrack); } else if (track.i_type == libvlc_track_t.libvlc_track_video) { VideoTrackInfo videoTrack = new VideoTrackInfo(); videoTrack.Code = track.i_codec; videoTrack.Description = LibVlcInterop.vlc_fourcc_GetDescription(0, track.i_codec); videoTrack.Height = (int)Math.Min((uint)int.MaxValue, (uint)track.i_height); videoTrack.Width = (int)Math.Min((uint)int.MaxValue, (uint)track.i_width); videoTracks.Add(videoTrack); } } // SetTracksInfo(videoTracks, audioTracks); }
public void Parse() { VerifyObjectIsNotDisposed(); // lock (staticLock) { if (!IsParsed()) { LibVlcInterop.libvlc_media_parse(this.descriptor); } // if (tracksInfo == null) { parseState = new ParseState(); parseState.waitHandle = new EventWaitHandle(false, EventResetMode.AutoReset); try { IntPtr player = LibVlcInterop.libvlc_media_player_new_from_media(this.descriptor); if (player == IntPtr.Zero) { throw new VlcInternalException(String.Format("Can't create an instance of player when parsing. LibVlc tells: {0}", LibVlcInterop.libvlc_errmsg())); } IntPtr playerEvents = LibVlcInterop.libvlc_media_player_event_manager(player); if (playerEvents == IntPtr.Zero) { throw new VlcInternalException(String.Format("Can't get event manager of player when parsing. LibVlc tells: {0}", LibVlcInterop.libvlc_errmsg())); } // try { parseState.eventHandler = new LibVlcInterop.VlcEventHandlerDelegate(onTrackInfoEndReached); IntPtr function = Marshal.GetFunctionPointerForDelegate(parseState.eventHandler); // int res = LibVlcInterop.libvlc_event_attach(playerEvents, libvlc_event_type_e.libvlc_MediaPlayerEndReached, function, IntPtr.Zero); if (res != 0) { throw new VlcInternalException(String.Format("Unable to attach event {0}", libvlc_event_type_e.libvlc_MediaPlayerEndReached.ToString())); } // LibVlcInterop.libvlc_media_add_option(descriptor, "sout=#description"); LibVlcInterop.libvlc_media_player_play(player); // if (parseState.waitHandle.WaitOne(parseTimeout)) { // LibVlcInterop.libvlc_media_player_release(player); player = IntPtr.Zero; // tracksInfo = LibVlcInterop.libvlc_media_get_tracks_info(descriptor); // if (logger.IsInfoEnabled) { StringBuilder builder = new StringBuilder(); builder.Append("Parsed tracks info: "); // foreach (libvlc_media_track_info_t track in tracksInfo) { builder.AppendLine(""); if (track.i_type == libvlc_track_t.libvlc_track_audio) { builder.AppendLine("Type: audio"); builder.AppendLine("Channels: " + track.i_channels); builder.AppendLine("Rate: " + track.i_rate); } else if (track.i_type == libvlc_track_t.libvlc_track_text) { builder.AppendLine("Type: text"); } else if (track.i_type == libvlc_track_t.libvlc_track_video) { builder.AppendLine("Type: video"); } else { builder.AppendLine("Type: unknown"); } builder.AppendLine("Description: " + LibVlcInterop.vlc_fourcc_GetDescription(0, track.i_codec)); } // builder.AppendLine("Total tracks: " + tracksInfo.Length); logger.Info(builder.ToString()); } } else { throw new VlcTimeoutException("Can't get tracks information."); } } finally { if (player != IntPtr.Zero) { LibVlcInterop.libvlc_media_player_release(player); } } } catch (Exception exc) { if (logger.IsErrorEnabled) { logger.Error("An error occured during parse.", exc); } throw; } finally { parseState.waitHandle.Close(); parseState = null; } } } }