// This file was generated by the Gtk# code generator.
// Any changes made will be lost if regenerated.

namespace Gst.Video {

	using System;
	using System.Collections;
	using System.Collections.Generic;
	using System.Runtime.InteropServices;

#region Autogenerated code
	[StructLayout(LayoutKind.Sequential)]
	public partial struct VideoTimeCodeConfig : IEquatable<VideoTimeCodeConfig> {

		public uint FpsN;
		public uint FpsD;
		public Gst.Video.VideoTimeCodeFlags Flags;
		private IntPtr _latest_daily_jam;

		public static Gst.Video.VideoTimeCodeConfig Zero = new Gst.Video.VideoTimeCodeConfig ();

		public static Gst.Video.VideoTimeCodeConfig New(IntPtr raw) {
			if (raw == IntPtr.Zero)
				return Gst.Video.VideoTimeCodeConfig.Zero;
			return (Gst.Video.VideoTimeCodeConfig) Marshal.PtrToStructure (raw, typeof (Gst.Video.VideoTimeCodeConfig));
		}

		public bool Equals (VideoTimeCodeConfig other)
		{
			return true && FpsN.Equals (other.FpsN) && FpsD.Equals (other.FpsD) && Flags.Equals (other.Flags) && _latest_daily_jam.Equals (other._latest_daily_jam);
		}

		public override bool Equals (object other)
		{
			return other is VideoTimeCodeConfig && Equals ((VideoTimeCodeConfig) other);
		}

		public override int GetHashCode ()
		{
			return this.GetType ().FullName.GetHashCode () ^ FpsN.GetHashCode () ^ FpsD.GetHashCode () ^ Flags.GetHashCode () ^ _latest_daily_jam.GetHashCode ();
		}

		private static GLib.GType GType {
			get { return GLib.GType.Pointer; }
		}
#endregion
	}
}
