public static void OnAssetInitialised(
            int error,
            IntPtr userData
            )
        {
            if (userData != IntPtr.Zero)
            {
                AssetInterface asset = Helper.GCHandleToObject <AssetInterface>((GCHandle)userData);

                if (asset != null)
                {
                    asset.OnAssetInitialised(error, userData);
                }
            }
        }
        public static void OnAssetRepresentationDataReceived(
            string mimeType,
            string codec,
            float startTime,
            IntPtr data,
            uint dataSize,
            IntPtr userData
            )
        {
            if (userData != IntPtr.Zero)
            {
                AssetInterface asset = Helper.GCHandleToObject <AssetInterface>((GCHandle)userData);

                if (asset != null)
                {
                    asset.OnAssetRepresentationDataReceived(mimeType, codec, startTime, data, dataSize, userData);
                }
            }
        }
        public static bool OnAssetSelectRepresentation(
            IntPtr adaptionSet,
            uint representationIndex,
            IntPtr representations,
            uint representationCount,
            IntPtr userData
            )
        {
            CommonTypes.HVRAdaptationSet _adaptionSet = Helper.PtrToStruct <CommonTypes.HVRAdaptationSet>(adaptionSet);

            CommonTypes.HVRRepresentation[] _representations = new CommonTypes.HVRRepresentation[(int)representationCount];

            int representationStructSize = Marshal.SizeOf(typeof(CommonTypes.HVRRepresentation));

            for (int i = 0; i < _representations.Length; ++i)
            {
                IntPtr dataPtr = new IntPtr(representations.ToInt64() + representationStructSize * i);
                _representations[i] = Helper.PtrToStruct <CommonTypes.HVRRepresentation>(dataPtr);
            }

            if (userData != IntPtr.Zero)
            {
                AssetInterface asset = Helper.GCHandleToObject <AssetInterface>((GCHandle)userData);

                if (asset != null)
                {
                    return(asset.OnAssetSelectRepresentation(_adaptionSet, representationIndex, _representations, representationCount, userData));
                }
            }

            // at least must return true for one of the representationIndex within [0, representationCount)
            if (representationIndex == representationCount - 1)
            {
                return(true);
            }

            return(false);
        }