private void DecodeProc(object param)
            {
                DecodeProcParams request = (DecodeProcParams)param;
                List <FrameData> frames  = new List <FrameData>();
                int width  = 0;
                int height = 0;

                GifStream gifStream = new GifStream(request.filePath);
                int       readFrame = 0;

                while (gifStream.HasMoreData)
                {
                    if (readFrame >= request.frameToRead && request.frameToRead > 0)
                    {
                        break;
                    }
                    switch (gifStream.CurrentToken)
                    {
                    case GifStream.Token.Image:
                        var image = gifStream.ReadImage();
                        width  = gifStream.Header.width;
                        height = gifStream.Header.height;
                        Color32[] copiedColors = new Color32[image.colors.Length];
                        image.colors.CopyTo(copiedColors, 0);
                        frames.Add(new FrameData()
                        {
                            colors = copiedColors,
                            delay  = image.DelaySeconds
                        });
                        readFrame++;
                        break;

                    default:
                        gifStream.SkipToken();
                        break;
                    }
                }
                gifStream.Dispose();

                request.runner.RunInMainThread(() =>
                {
                    Texture2D[] textures = new Texture2D[frames.Count];
                    int fps         = 2;
                    float totalTime = 0;
                    for (int i = 0; i < frames.Count; i++)
                    {
                        textures[i]      = new Texture2D(width, height, TextureFormat.ARGB32, false, false);
                        textures[i].name = i.ToString();
                        textures[i].SetPixels32(frames[i].colors);
                        textures[i].Apply();
                        totalTime += frames[i].delay;
                        fps        = Mathf.RoundToInt(frames.Count / totalTime);
                    }
                    animatedClip = new AnimatedClip(width, height, fps, textures);
                    IsCompleted  = true;
                    request.runner.DestroySelf();
                });
            }