Пример #1
0
        public MediaTrackInfosStructure[] GetMediaTracksInformations(VlcMediaInstance mediaInstance)
        {
            if (mediaInstance == IntPtr.Zero)
            {
                throw new ArgumentException("Media instance is not initialized.");
            }
            IntPtr fullBuffer;
            var    cpt = myLibraryLoader.GetInteropDelegate <GetMediaTracksInformations>().Invoke(mediaInstance, out fullBuffer);

            if (cpt <= 0)
            {
                return(new MediaTrackInfosStructure[0]);
            }
            var result = new MediaTrackInfosStructure[cpt];
            var buffer = fullBuffer;

            for (int index = 0; index < cpt; index++)
            {
                result[index] = MarshalHelper.PtrToStructure <MediaTrackInfosStructure>(buffer);
                buffer        = IntPtr.Size == 4
                    ? new IntPtr(buffer.ToInt32() + MarshalHelper.SizeOf <MediaTrackInfosStructure>())
                    : new IntPtr(buffer.ToInt64() + MarshalHelper.SizeOf <MediaTrackInfosStructure>());
            }
            Free(fullBuffer);
            return(result);
        }
        /// <summary>
        /// Register callbacks in order to handle VLC dialogs. LibVLC 3.0.0 and later.
        /// </summary>
        public void SetDialogCallbacks(DialogCallbacks?callbacks, IntPtr data)
        {
            if (VlcVersionNumber.Major < 3)
            {
                throw new InvalidOperationException($"You need VLC version 3.0 or higher to be able to use {nameof(SetDialogCallbacks)}");
            }

            if (this.dialogCallbacks.HasValue)
            {
                Marshal.FreeHGlobal(this.dialogCallbacksPointer);
                this.dialogCallbacksPointer = IntPtr.Zero;
            }

            this.dialogCallbacks = callbacks;
            if (this.dialogCallbacks.HasValue)
            {
                this.dialogCallbacksPointer = Marshal.AllocHGlobal(MarshalHelper.SizeOf <DialogCallbacks>());
                Marshal.StructureToPtr(this.dialogCallbacks.Value, this.dialogCallbacksPointer, false);
            }

            myLibraryLoader.GetInteropDelegate <SetDialogCallbacks>().Invoke(this.myVlcInstance, this.dialogCallbacksPointer, data);
        }
        public MediaTrack[] GetMediaTracks(VlcMediaInstance mediaInstance)
        {
            if (mediaInstance == IntPtr.Zero)
            {
                throw new ArgumentException("Media instance is not initialized.");
            }

            var cpt = GetInteropDelegate <GetMediaTracks>().Invoke(mediaInstance, out var fullBuffer);

            if (cpt <= 0)
            {
                return(new MediaTrack[0]);
            }
            try
            {
                var result = new MediaTrack[cpt];
                for (int index = 0; index < cpt; index++)
                {
                    var current = MarshalHelper.PtrToStructure <LibvlcMediaTrackT>(Marshal.ReadIntPtr(fullBuffer, index * MarshalHelper.SizeOf <IntPtr>()));

                    TrackInfo trackInfo = null;

                    switch (current.Type)
                    {
                    case MediaTrackTypes.Audio:
                        var audio = MarshalHelper.PtrToStructure <LibvlcAudioTrackT>(current.TypedTrack);
                        trackInfo = new AudioTrack
                        {
                            Channels = audio.Channels,
                            Rate     = audio.Rate
                        };
                        break;

                    case MediaTrackTypes.Video:
                        var video = MarshalHelper.PtrToStructure <LibvlcVideoTrackT>(current.TypedTrack);
                        trackInfo = new VideoTrack
                        {
                            Height       = video.Height,
                            Width        = video.Width,
                            SarNum       = video.SarNum,
                            SarDen       = video.SarDen,
                            FrameRateNum = video.FrameRateNum,
                            FrameRateDen = video.FrameRateDen,
                            Orientation  = video.Orientation,
                            Projection   = video.Projection,
                            Pose         = video.Pose
                        };
                        break;

                    case MediaTrackTypes.Text:
                        var text = MarshalHelper.PtrToStructure <LibvlcSubtitleTrackT>(current.TypedTrack);
                        trackInfo = new SubtitleTrack
                        {
                            Encoding = Utf8InteropStringConverter.Utf8InteropToString(text.Encoding)
                        };
                        break;
                    }

                    result[index] = new MediaTrack
                    {
                        CodecFourcc    = current.Codec,
                        OriginalFourcc = current.OriginalFourCC,
                        Id             = current.Id,
                        Type           = current.Type,
                        Profile        = current.Profile,
                        Level          = current.Level,
                        TrackInfo      = trackInfo,
                        Bitrate        = current.Bitrate,
                        Language       = Utf8InteropStringConverter.Utf8InteropToString(current.Language),
                        Description    = Utf8InteropStringConverter.Utf8InteropToString(current.Description)
                    };
                }
                return(result);
            }
            finally
            {
                GetInteropDelegate <ReleaseMediaTracks>().Invoke(fullBuffer, cpt);
            }
        }