/// <summary>
        /// Computes the main component.
        /// </summary>
        private void ComputeMainComponent()
        {
            // Try for the main component to be the video (if it's not stuff like audio album art, that is)
            if (HasVideo && HasAudio &&
                (Video.StreamInfo.Disposition & ffmpeg.AV_DISPOSITION_ATTACHED_PIC) != ffmpeg.AV_DISPOSITION_ATTACHED_PIC)
            {
                Main = Video;
                return;
            }

            // If it was not vide, then it has to be audio (if it has audio)
            if (HasAudio)
            {
                Main = Audio;
                return;
            }

            // Set it to video even if it's attached pic stuff
            if (HasVideo)
            {
                Main = Video;
                return;
            }

            // As a last resort, set the main component to be the subtitles
            if (HasSubtitles)
            {
                Main = Subtitles;
                return;
            }

            // We whould never really hit this line
            if (Items.Count > 0)
                Main = Items.First().Value;
        }
        /// <summary>
        /// Gets or sets the <see cref="MediaComponent"/> with the specified media type.
        /// Setting a new component on an existing media type component will throw.
        /// Getting a non existing media component fro the given media type will return null.
        /// </summary>
        /// <param name="mediaType">Type of the media.</param>
        /// <returns>The media component</returns>
        /// <exception cref="ArgumentException">When the media type is invalid</exception>
        /// <exception cref="ArgumentNullException">MediaComponent</exception>
        public MediaComponent this[MediaType mediaType]
        {
            get
            {
                lock (SyncLock) return(Items.ContainsKey(mediaType) ? Items[mediaType] : null);
            }
            set
            {
                lock (SyncLock)
                {
                    if (Items.ContainsKey(mediaType))
                    {
                        throw new ArgumentException($"A component for '{mediaType}' is already registered.");
                    }
                    Items[mediaType] = value ?? throw new ArgumentNullException($"{nameof(MediaComponent)} {nameof(value)} must not be null.");

                    // Try for the main component to be the video (if it's not stuff like audio album art, that is)
                    if (HasVideo && HasAudio &&
                        (Video.StreamInfo.Disposition & ffmpeg.AV_DISPOSITION_ATTACHED_PIC) != ffmpeg.AV_DISPOSITION_ATTACHED_PIC)
                    {
                        Main = Video;
                        return;
                    }

                    // If it was not vide, then it has to be audio (if it has audio)
                    if (HasAudio)
                    {
                        Main = Audio;
                        return;
                    }

                    // Set it to video even if it's attached pic stuff
                    if (HasVideo)
                    {
                        Main = Video;
                        return;
                    }

                    // As a last resort, set the main component to be the subtitles
                    if (HasSubtitles)
                    {
                        Main = Subtitles;
                        return;
                    }

                    // We whould never really hit this line
                    if (Items.Count > 0)
                    {
                        Main = Items.First().Value;
                    }
                }
            }
        }