Exemplo n.º 1
0
 private int queue_page(Xiph.ogg_page page)
 {
     if (this.theora_p != 0)
     {
         Xiph.ogg_stream_pagein(this.to, page);
     }
     return(0);
 }
Exemplo n.º 2
0
 private void open_video()
 {
     this.width  = (int)this.ti.frame_width;
     this.height = (int)this.ti.frame_height;
     Xiph.th_stripe_callback stripe_callback;
     stripe_callback.ctx            = null;
     stripe_callback.stripe_decoded = new Xiph.th_stripe_decoded_func(this.stripe_decoded);
     Xiph.th_decode_ctl_opts th_decode_ctl_opts = new Xiph.th_decode_ctl_opts();
     th_decode_ctl_opts.stripe_callback = stripe_callback;
     Xiph.th_decode_ctl(this.td, 7, th_decode_ctl_opts);
 }
Exemplo n.º 3
0
        private int buffer_data(Stream sin, Xiph.ogg_sync_state oy)
        {
            int num = 0;

            byte[] buffer = null;
            int    offset = 0;

            lock (sin)
            {
                if (Xiph.ogg_sync_buffer(oy, 4096, out buffer, out offset))
                {
                    sin.Position = this.instream_pos;
                    num          = sin.Read(buffer, offset, 4096);
                    Xiph.ogg_sync_wrote(oy, num);
                    this.instream_pos = sin.Position;
                }
            }
            return(num);
        }
Exemplo n.º 4
0
 public void InBackground()
 {
     if (!this.loaded && this.instream != null)
     {
         this.LoadVideo();
     }
     if (!this.control_.Ready)
     {
         return;
     }
     if (!this.control_.Play)
     {
         return;
     }
     if (this.rnd_frame != this.rdy_frame)
     {
         if (this.cur_frame == this.rdy_frame)
         {
             if (!this.skip)
             {
                 Color32[] array = this.colors_y_rnd;
                 this.colors_y_rnd = this.colors_y;
                 this.colors_y     = array;
             }
             this.rdy_frame = this.rnd_frame;
             this.skip      = true;
         }
         return;
     }
     while (this.theora_p != 0 && this.videobuf_ready == 0)
     {
         if (Xiph.ogg_stream_packetout(this.to, this.op) <= 0)
         {
             break;
         }
         if (Xiph.th_decode_packetin(this.td, this.op, ref this.videobuf_granulepos) >= 0)
         {
             this.videobuf_time  = Xiph.th_granule_time(this.td.state, this.videobuf_granulepos);
             this.videobuf_ready = 1;
         }
     }
     if (this.videobuf_ready == 0 && this.instream.Length == this.instream_pos)
     {
         if (this.control_.Loop)
         {
             this.control_.PlaySession += 1u;
             this.LoadVideo();
         }
         else
         {
             this.control_.Playing = false;
         }
         return;
     }
     if (this.videobuf_ready == 0)
     {
         this.buffer_data(this.instream, this.oy);
         while (Xiph.ogg_sync_pageout(this.oy, this.og) > 0)
         {
             this.queue_page(this.og);
         }
     }
     else
     {
         this.rnd_frame++;
         if (this.cur_frame == this.rdy_frame)
         {
             if (!this.skip)
             {
                 Color32[] array2 = this.colors_y_rnd;
                 this.colors_y_rnd = this.colors_y;
                 this.colors_y     = array2;
             }
             this.rdy_frame = this.rnd_frame;
             this.skip      = true;
         }
     }
     this.videobuf_ready = 0;
 }
Exemplo n.º 5
0
 private bool LoadVideo()
 {
     this.op           = new Xiph.ogg_packet();
     this.og           = new Xiph.ogg_page();
     this.to           = new Xiph.ogg_stream_state();
     this.oy           = new Xiph.ogg_sync_state();
     this.ti           = default(Xiph.th_info);
     this.tc           = new Xiph.th_comment();
     this.ts           = null;
     this.fps          = 0f;
     this.frame_in_sec = 0f;
     this.instream_pos = 0L;
     this.stateflag    = 0;
     this.theora_p     = 0;
     this.theora_processing_headers = 0;
     this.videobuf_time             = 0.0;
     this.videobuf_ready            = 0;
     this.videobuf_granulepos       = -1L;
     this.rnd_frame = -1;
     this.rdy_frame = -1;
     this.cur_frame = -1;
     this.elapsedTimeSamples.Clear();
     this.elapsedTimeTimestamps.Clear();
     Xiph.ogg_sync_init(this.oy);
     Xiph.th_comment_init(this.tc);
     Xiph.th_info_init(ref this.ti);
     while (this.stateflag == 0)
     {
         if (this.buffer_data(this.instream, this.oy) == 0)
         {
             break;
         }
         while (Xiph.ogg_sync_pageout(this.oy, this.og) > 0)
         {
             Xiph.ogg_stream_state os = new Xiph.ogg_stream_state();
             if (Xiph.ogg_page_bos(this.og) == 0)
             {
                 this.queue_page(this.og);
                 this.stateflag = 1;
                 break;
             }
             Xiph.ogg_stream_init(os, Xiph.ogg_page_serialno(this.og));
             Xiph.ogg_stream_pagein(os, this.og);
             int num = Xiph.ogg_stream_packetpeek(os, this.op);
             if (num == 1 && this.theora_p == 0 && (this.theora_processing_headers = Xiph.th_decode_headerin(ref this.ti, this.tc, ref this.ts, this.op)) >= 0)
             {
                 this.to       = Xiph.ogg_stream_clone(os);
                 this.theora_p = 1;
                 if (this.theora_processing_headers != 0)
                 {
                     Xiph.ogg_stream_packetout(this.to, null);
                 }
             }
             else
             {
                 Xiph.ogg_stream_clear(os);
             }
         }
     }
     while (this.theora_p != 0 && this.theora_processing_headers != 0)
     {
         int num2;
         while (this.theora_processing_headers != 0 && (num2 = Xiph.ogg_stream_packetpeek(this.to, this.op)) != 0)
         {
             if (num2 >= 0)
             {
                 this.theora_processing_headers = Xiph.th_decode_headerin(ref this.ti, this.tc, ref this.ts, this.op);
                 if (this.theora_processing_headers < 0)
                 {
                     this.error = "Error parsing Theora stream headers; corrupt stream?\n";
                     return(false);
                 }
                 if (this.theora_processing_headers > 0)
                 {
                     Xiph.ogg_stream_packetout(this.to, null);
                 }
                 this.theora_p++;
             }
         }
         if (this.theora_p == 0 || this.theora_processing_headers == 0)
         {
             break;
         }
         if (Xiph.ogg_sync_pageout(this.oy, this.og) > 0)
         {
             this.queue_page(this.og);
         }
         else if (this.buffer_data(this.instream, this.oy) == 0)
         {
             this.error = "End of file while searching for codec headers.\n";
             return(false);
         }
     }
     if (this.theora_p != 0)
     {
         this.dump_comments(this.tc);
         this.td   = Xiph.th_decode_alloc(this.ti, this.ts);
         this.info = string.Format("Ogg logical stream {0} is Theora {1}x{2} {3} fps video\nEncoded frame content is {4}x{5} with {6}x{7} offset\n", new object[]
         {
             this.to.serialno,
             this.ti.frame_width,
             this.ti.frame_height,
             this.ti.fps_numerator / this.ti.fps_denominator,
             this.ti.pic_width,
             this.ti.pic_height,
             this.ti.pic_x,
             this.ti.pic_y
         });
         this.fps          = this.ti.fps_numerator / this.ti.fps_denominator;
         this.frame_in_sec = 1f / this.fps;
     }
     else
     {
         Xiph.th_info_clear(ref this.ti);
         Xiph.th_comment_clear(this.tc);
     }
     Xiph.th_setup_free(this.ts);
     if (this.theora_p != 0)
     {
         this.open_video();
     }
     this.stateflag = 0;
     while (Xiph.ogg_sync_pageout(this.oy, this.og) > 0)
     {
         this.queue_page(this.og);
     }
     this.colors_y_1   = new Color32[this.width * this.height];
     this.colors_y_2   = new Color32[this.width * this.height];
     this.colors_y     = this.colors_y_1;
     this.colors_y_rnd = this.colors_y_2;
     while (this.theora_p != 0 && this.videobuf_ready == 0)
     {
         if (Xiph.ogg_stream_packetout(this.to, this.op) <= 0)
         {
             break;
         }
         if (Xiph.th_decode_packetin(this.td, this.op, ref this.videobuf_granulepos) >= 0)
         {
             this.videobuf_time  = Xiph.th_granule_time(this.td.state, this.videobuf_granulepos);
             this.videobuf_ready = 1;
         }
     }
     this.loaded = true;
     return(true);
 }
Exemplo n.º 6
0
 public void InBackground()
 {
     if (this.instream == null)
     {
         return;
     }
     if (this.playSession != this.control_.PlaySession)
     {
         this.playSession  = this.control_.PlaySession;
         this.Pcm          = null;
         this.control_.Pcm = this.Pcm;
         this.loaded       = false;
     }
     if (!this.loaded)
     {
         this.control_.AudioAvailable = this.LoadAudio();
         this.loaded = true;
         return;
     }
     if (!this.control_.AudioAvailable)
     {
         return;
     }
     if (!this.control_.Ready)
     {
         return;
     }
     if (!this.control_.Playing)
     {
         return;
     }
     while (!this.eos && this.vorbis_p && this.need_more_data && this.need_next_pcm)
     {
         int num = this.buffer_data(this.instream, this.oy);
         if (num <= 0)
         {
             this.need_next_pcm  = false;
             this.need_more_data = false;
             this.eos            = true;
             break;
         }
         int num2 = Xiph.ogg_sync_pageout(this.oy, this.og);
         if (num2 != 0)
         {
             if (num2 < 0)
             {
                 this.error = "Corrupt or missing data in bitstream; continuing...\n";
                 break;
             }
             this.need_more_data = false;
         }
     }
     if (!this.eos && this.vorbis_p && !this.need_more_data && this.need_next_pcm)
     {
         this.DecodePage();
     }
     if (!this.need_next_pcm)
     {
         long num3 = (long)(this.control_.ElapsedTime * (double)this.control_.PcmRate) + 44100L;
         if (this.Pcm != null && this.curPcmOffset < 352800 && !this.eos && num3 > this.PcmSampleOffset + (long)(176400 / this.PcmChannels))
         {
             this.control_.SamplesPerMillisecond = (double)this.control_.Scale * 44.1;
             this.need_next_pcm = true;
         }
         if ((this.Pcm == null && this.curPcmOffset >= 352800) || (this.last_buf && num3 > this.PcmSampleOffset + (long)(264600 / this.PcmChannels)) || (!this.need_next_pcm && num3 > this.PcmSampleOffset + (long)(264600 / this.PcmChannels)))
         {
             this.last_buf      = false;
             this.curPcmOffset -= 176400;
             float[] array = this.curPcm;
             this.curPcm = this.nxtPcm;
             this.nxtPcm = this.rdyPcm;
             this.rdyPcm = array;
             if (this.curPcmOffset > 176400)
             {
                 for (int i = 0; i < this.curPcmOffset - 352800 + 176400; i++)
                 {
                     int num4 = i + 352800 - 176400;
                     if (num4 >= 352800)
                     {
                         Debug.LogError("(i > srcind)");
                     }
                     this.nxtPcm[i] = this.curPcm[num4];
                 }
             }
             this.PcmSampleOffset += (long)(176400 / this.PcmChannels);
             this.Pcm              = this.rdyPcm;
             this.lastReadIdx++;
             long num5 = DateTime.Now.Ticks / 10000L;
             if (this.lastReadIdx > 9)
             {
                 for (int j = 1; j < 10; j++)
                 {
                     this.lastReadSamples[j - 1] = this.lastReadSamples[j];
                     this.lastReadTime[j - 1]    = this.lastReadTime[j];
                 }
                 this.lastReadIdx = 9;
             }
             this.lastReadSamples[this.lastReadIdx] = 176400 / this.PcmChannels;
             this.lastReadTime[this.lastReadIdx]    = num5;
             long num6 = 0L;
             long num7 = 0L;
             for (int k = 1; k <= this.lastReadIdx; k++)
             {
                 num6 += (long)this.lastReadSamples[k - 1];
                 num7 += this.lastReadTime[k] - this.lastReadTime[k - 1];
             }
             if (num6 > 0L)
             {
                 this.readspeed = (double)num6 / (double)num7;
             }
             this.control_.Pcm                   = this.Pcm;
             this.control_.PcmSampleOffset       = this.PcmSampleOffset;
             this.control_.PcmSampleCount        = this.PcmSampleCount;
             this.control_.SamplesPerMillisecond = this.readspeed;
         }
     }
 }
Exemplo n.º 7
0
        private void DecodePage()
        {
            this.need_more_data = false;
            Xiph.ogg_stream_pagein(this.os, this.og);
            while (true)
            {
                int num = Xiph.ogg_stream_packetout(this.os, this.op);
                if (num == 0)
                {
                    break;
                }
                if (num < 0)
                {
                    goto Block_2;
                }
                if (Xiph.vorbis_synthesis(this.vb, this.op) == 0)
                {
                    Xiph.vorbis_synthesis_blockin(this.vd, this.vb);
                }
                float[][] array;
                int[]     array2;
                int       num2;
                while ((num2 = Xiph.vorbis_synthesis_pcmout(this.vd, out array, out array2)) > 0)
                {
                    int num3 = num2;
                    for (int i = 0; i < this.vi.channels; i++)
                    {
                        int     num4   = i;
                        float[] array3 = array[i];
                        int     num5   = array2[i];
                        for (int j = 0; j < num3; j++)
                        {
                            float num6 = array3[num5 + j];
                            if (num6 > 1f)
                            {
                                num6 = 1f;
                            }
                            if (num6 < -1f)
                            {
                                num6 = -1f;
                            }
                            int num7 = this.curPcmOffset + num4;
                            if (num7 < 352800)
                            {
                                this.curPcm[num7] = num6;
                            }
                            int num8 = num7 - 352800 + 176400;
                            if (num8 >= 0 && num8 < 352800)
                            {
                                this.nxtPcm[num8] = num6;
                            }
                            num4 += this.vi.channels;
                        }
                    }
                    this.PcmSampleCount += (long)num3;
                    this.curPcmOffset   += num3 * this.vi.channels;
                    Xiph.vorbis_synthesis_read(this.vd, num3);
                }
                if (!this.need_more_data && this.curPcmOffset >= 352800)
                {
                    this.need_next_pcm = false;
                }
            }
            this.need_more_data = true;
Block_2:
            if (Xiph.ogg_page_eos(this.og) != 0)
            {
                this.need_next_pcm  = false;
                this.need_more_data = false;
                this.last_buf       = true;
                this.eos            = true;
            }
        }
Exemplo n.º 8
0
 private bool LoadAudio()
 {
     this.oy              = new Xiph.ogg_sync_state();
     this.os              = new Xiph.ogg_stream_state();
     this.og              = new Xiph.ogg_page();
     this.op              = new Xiph.ogg_packet();
     this.vi              = new Xiph.vorbis_info();
     this.vc              = new Xiph.vorbis_comment();
     this.vd              = new Xiph.vorbis_dsp_state();
     this.vb              = new Xiph.vorbis_block();
     this.instream_pos    = 0L;
     this.eos             = false;
     this.last_buf        = false;
     this.need_more_data  = false;
     this.need_next_pcm   = true;
     this.vorbis_p        = false;
     this.stateflag       = false;
     this.comments_header = false;
     this.instream_pos    = 0L;
     this.curPcmOffset    = 0;
     this.Pcm             = null;
     this.PcmSampleCount  = 0L;
     this.PcmSampleOffset = 0L;
     this.readspeed       = (double)this.control_.Scale + 44.1;
     this.lastReadIdx     = -1;
     Xiph.ogg_sync_init(this.oy);
     Xiph.vorbis_info_init(this.vi);
     Xiph.vorbis_comment_init(this.vc);
     while (!this.stateflag)
     {
         if (this.buffer_data(this.instream, this.oy) == 0)
         {
             break;
         }
         while (Xiph.ogg_sync_pageout(this.oy, this.og) > 0)
         {
             Xiph.ogg_stream_state ogg_stream_state = new Xiph.ogg_stream_state();
             if (Xiph.ogg_page_bos(this.og) == 0)
             {
                 this.stateflag = true;
                 break;
             }
             Xiph.ogg_stream_init(ogg_stream_state, Xiph.ogg_page_serialno(this.og));
             Xiph.ogg_stream_pagein(ogg_stream_state, this.og);
             int num = Xiph.ogg_stream_packetpeek(ogg_stream_state, this.op);
             if (num == 1 && !this.vorbis_p && Xiph.vorbis_synthesis_headerin(this.vi, this.vc, this.op) >= 0)
             {
                 this.os       = Xiph.ogg_stream_clone(ogg_stream_state);
                 this.vorbis_p = true;
                 Xiph.ogg_stream_packetout(this.os, null);
             }
             else
             {
                 Xiph.ogg_stream_clear(ogg_stream_state);
             }
         }
     }
     while (this.vorbis_p && !this.comments_header)
     {
         int num2;
         while ((num2 = Xiph.ogg_stream_packetpeek(this.os, this.op)) != 0)
         {
             if (num2 >= 0)
             {
                 if (Xiph.vorbis_synthesis_headerin(this.vi, this.vc, this.op) < 0)
                 {
                     this.error = "Error parsing Theora stream vorbis; corrupt stream?\n";
                     return(false);
                 }
                 Xiph.ogg_stream_packetout(this.os, null);
                 this.comments_header = true;
             }
         }
         if (Xiph.ogg_sync_pageout(this.oy, this.og) > 0)
         {
             Xiph.ogg_stream_pagein(this.os, this.og);
         }
         else if (this.buffer_data(this.instream, this.oy) == 0)
         {
             this.error = "End of file while searching for codec headers.\n";
             return(false);
         }
     }
     if (this.vorbis_p)
     {
         if (this.buffer_data(this.instream, this.oy) == 0)
         {
             this.error = "End of file before finding all Vorbis headers!\n";
             return(false);
         }
         this.PcmRate                        = this.vi.rate;
         this.PcmChannels                    = this.vi.channels;
         this.PcmSampleOffset                = (long)(-176400 / this.PcmChannels);
         this.PcmSampleCount                 = (long)(88200 / this.PcmChannels);
         this.curPcmOffset                   = 88200;
         this.control_.PcmChannels           = this.PcmChannels;
         this.control_.PcmRate               = this.PcmRate;
         this.control_.SamplesPerMillisecond = (double)this.control_.Scale * 44.1;
         this.dump_comments(this.vi, this.vc);
         if (Xiph.vorbis_synthesis_init(this.vd, this.vi) != 0)
         {
             this.error = "Wrong Vorbis stream!\n";
             return(false);
         }
         Xiph.vorbis_block_init(this.vd, this.vb);
     }
     return(this.vorbis_p);
 }