Exemple #1
0
        /* all of the real encoding details are here.  The modes, books,
         * everything */
        public static int _vorbis_unpack_books(vorbis_info vi, oggpack_buffer opb)
        {
            codec_setup_info ci = vi.codec_setup;
            int i;

            /* codebooks */
            ci.books = (int)oggpack_read(opb, 8) + 1;
            if (ci.books <= 0)
            {
                goto err_out;
            }
            for (i = 0; i < ci.books; i++)
            {
                ci.book_param[i] = vorbis_staticbook_unpack(opb);
                if (ci.book_param[i] == null)
                {
                    goto err_out;
                }
            }

            /* time backend settings; hooks are unused */
            {
                int times = (int)oggpack_read(opb, 6) + 1;
                if (times <= 0)
                {
                    goto err_out;
                }
                for (i = 0; i < times; i++)
                {
                    int test = (int)oggpack_read(opb, 16);
                    if (test < 0 || test >= VI_TIMEB)
                    {
                        goto err_out;
                    }
                }
            }

            /* floor backend settings */
            ci.floors = (int)oggpack_read(opb, 6) + 1;
            if (ci.floors <= 0)
            {
                goto err_out;
            }
            for (i = 0; i < ci.floors; i++)
            {
                ci.floor_type[i] = (int)oggpack_read(opb, 16);
                if (ci.floor_type[i] < 0 || ci.floor_type[i] >= VI_FLOORB)
                {
                    goto err_out;
                }
                ci.floor_param[i] = _floor_P[ci.floor_type[i]].unpack(vi, opb);
                if (ci.floor_param[i] == null)
                {
                    goto err_out;
                }
            }

            /* residue backend settings */
            ci.residues = (int)oggpack_read(opb, 6) + 1;
            if (ci.residues <= 0)
            {
                goto err_out;
            }
            for (i = 0; i < ci.residues; i++)
            {
                ci.residue_type[i] = (int)oggpack_read(opb, 16);
                if (ci.residue_type[i] < 0 || ci.residue_type[i] >= VI_RESB)
                {
                    goto err_out;
                }
                ci.residue_param[i] = _residue_P[ci.residue_type[i]].unpack(vi, opb);
                if (ci.residue_param[i] == null)
                {
                    goto err_out;
                }
            }

            /* map backend settings */
            ci.maps = (int)oggpack_read(opb, 6) + 1;
            if (ci.maps <= 0)
            {
                goto err_out;
            }
            for (i = 0; i < ci.maps; i++)
            {
                ci.map_type[i] = (int)oggpack_read(opb, 16);
                if (ci.map_type[i] < 0 || ci.map_type[i] >= VI_MAPB)
                {
                    goto err_out;
                }
                ci.map_param[i] = _mapping_P[ci.map_type[i]].unpack(vi, opb);
                if (ci.map_param[i] == null)
                {
                    goto err_out;
                }
            }

            /* mode settings */
            ci.modes = (int)oggpack_read(opb, 6) + 1;
            if (ci.modes <= 0)
            {
                goto err_out;
            }
            for (i = 0; i < ci.modes; i++)
            {
                ci.mode_param[i]               = new vorbis_info_mode(); //_ogg_calloc(1, sizeof(*ci.mode_param[i]));
                ci.mode_param[i].blockflag     = (int)oggpack_read(opb, 1);
                ci.mode_param[i].windowtype    = (int)oggpack_read(opb, 16);
                ci.mode_param[i].transformtype = (int)oggpack_read(opb, 16);
                ci.mode_param[i].mapping       = (int)oggpack_read(opb, 8);

                if (ci.mode_param[i].windowtype >= VI_WINDOWB)
                {
                    goto err_out;
                }
                if (ci.mode_param[i].transformtype >= VI_WINDOWB)
                {
                    goto err_out;
                }
                if (ci.mode_param[i].mapping >= ci.maps)
                {
                    goto err_out;
                }
                if (ci.mode_param[i].mapping < 0)
                {
                    goto err_out;
                }
            }

            if (oggpack_read(opb, 1) != 1)
            {
                goto err_out;                            /* top level EOP check */
            }
            return(0);

err_out:
            vorbis_info_clear(vi);
            return(OV_EBADHEADER);
        }
Exemple #2
0
        public static void vorbis_info_clear(vorbis_info vi)
        {
            codec_setup_info ci = vi.codec_setup;
            int i;

            if (ci != null)
            {
                for (i = 0; i < ci.modes; i++)
                {
                    if (ci.mode_param[i] != null) //_ogg_free(ci.mode_param[i]);
                    {
                        ci.mode_param[i] = null;
                    }
                }

                for (i = 0; i < ci.maps; i++)    /* unpack does the range checking */
                {
                    if (ci.map_param[i] != null) /* this may be cleaning up an aborted
                                                  * unpack, in which case the below type
                                                  * cannot be trusted */
                                                 //_mapping_P[ci.map_type[i]].free_info(ci.map_param[i]);
                    {
                        ci.map_param[i] = null;
                    }
                }

                for (i = 0; i < ci.floors; i++)    /* unpack does the range checking */
                {
                    if (ci.floor_param[i] != null) /* this may be cleaning up an aborted
                                                    * unpack, in which case the below type
                                                    * cannot be trusted */
                                                   //_floor_P[ci.floor_type[i]].free_info(ci.floor_param[i]);
                    {
                        ci.floor_param[i] = null;
                    }
                }

                for (i = 0; i < ci.residues; i++)    /* unpack does the range checking */
                {
                    if (ci.residue_param[i] != null) /* this may be cleaning up an aborted
                                                      * unpack, in which case the below type
                                                      * cannot be trusted */
                                                     //_residue_P[ci.residue_type[i]].free_info(ci.residue_param[i]);
                    {
                        ci.residue_param[i] = null;
                    }
                }

                for (i = 0; i < ci.books; i++)
                {
                    if (ci.book_param[i] != null)
                    {
                        /* knows if the book was not alloced */
                        vorbis_staticbook_destroy(ci.book_param[i]);
                    }
                    //if (ci.fullbooks != null)
                    //    vorbis_book_clear(ci.fullbooks + i);
                }
                if (ci.fullbooks != null)
                {
                    //_ogg_free(ci.fullbooks);
                    ci.fullbooks = null;
                }

                for (i = 0; i < ci.psys; i++)
                {
                    //_vi_psy_free(ci.psy_param[i]);
                    ci.psy_param[i] = null;
                }

                //_ogg_free(ci);
                vi.codec_setup = null;
            }

            //memset(vi, 0, sizeof(*vi));
        }
Exemple #3
0
        /* Header packing/unpacking ********************************************/

        public static int _vorbis_unpack_info(vorbis_info vi, oggpack_buffer opb)
        {
            codec_setup_info ci = vi.codec_setup;
            int bs;

            if (ci == null)
            {
                return(OV_EFAULT);
            }

            vi.version = oggpack_read(opb, 32);
            if (vi.version != 0)
            {
                return(OV_EVERSION);
            }

            vi.channels = oggpack_read(opb, 8);
            vi.rate     = oggpack_read(opb, 32);

            vi.bitrate_upper   = (int)oggpack_read(opb, 32);
            vi.bitrate_nominal = (int)oggpack_read(opb, 32);
            vi.bitrate_lower   = (int)oggpack_read(opb, 32);

            bs = (int)oggpack_read(opb, 4);
            if (bs < 0)
            {
                goto err_out;
            }
            ci.blocksizes[0] = 1 << bs;
            bs = (int)oggpack_read(opb, 4);
            if (bs < 0)
            {
                goto err_out;
            }
            ci.blocksizes[1] = 1 << bs;

            if (vi.rate < 1)
            {
                goto err_out;
            }
            if (vi.channels < 1)
            {
                goto err_out;
            }
            if (ci.blocksizes[0] < 64)
            {
                goto err_out;
            }
            if (ci.blocksizes[1] < ci.blocksizes[0])
            {
                goto err_out;
            }
            if (ci.blocksizes[1] > 8192)
            {
                goto err_out;
            }

            if (oggpack_read(opb, 1) != 1)
            {
                goto err_out;                            /* EOP check */
            }
            return(0);

err_out:
            vorbis_info_clear(vi);
            return(OV_EBADHEADER);
        }