⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vorbis.c

📁 从FFMPEG转换而来的H264解码程序,VC下编译..
💻 C
📖 第 1 页 / 共 5 页
字号:
                    tmp_vlc_bits[j]=tmp_vlc_bits[i];#ifdef V_DEBUG                    av_log(vc->avccontext, AV_LOG_INFO, "real lookup offset %d, vector: ", j);                    for(k=0;k<dim;++k) {                        av_log(vc->avccontext, AV_LOG_INFO, " %f ", codebook_setup->codevectors[j*dim+k]);                    }                    av_log(vc->avccontext, AV_LOG_INFO, "\n");#endif                    ++j;                }            }            if (j!=used_entries) {                av_log(vc->avccontext, AV_LOG_ERROR, "Bug in codevector vector building code. \n");                goto error;            }            entries=used_entries;        }        else if (codebook_setup->lookup_type>=2) {            av_log(vc->avccontext, AV_LOG_ERROR, "Codebook lookup type not supported. \n");            goto error;        }// Initialize VLC table        if (vorbis_len2vlc(vc, tmp_vlc_bits, tmp_vlc_codes, entries)) {            av_log(vc->avccontext, AV_LOG_ERROR, " Invalid code lengths while generating vlcs. \n");            goto error;        }        codebook_setup->maxdepth=0;        for(t=0;t<entries;++t)            if (tmp_vlc_bits[t]>=codebook_setup->maxdepth) codebook_setup->maxdepth=tmp_vlc_bits[t];        if(codebook_setup->maxdepth > 3*V_NB_BITS) codebook_setup->nb_bits=V_NB_BITS2;        else                                       codebook_setup->nb_bits=V_NB_BITS;        codebook_setup->maxdepth=(codebook_setup->maxdepth+codebook_setup->nb_bits-1)/codebook_setup->nb_bits;        if (init_vlc(&codebook_setup->vlc, codebook_setup->nb_bits, entries, tmp_vlc_bits, sizeof(*tmp_vlc_bits), sizeof(*tmp_vlc_bits), tmp_vlc_codes, sizeof(*tmp_vlc_codes), sizeof(*tmp_vlc_codes), INIT_VLC_LE)) {            av_log(vc->avccontext, AV_LOG_ERROR, " Error generating vlc tables. \n");            goto error;        }    }    av_free(tmp_vlc_bits);    av_free(tmp_vlc_codes);    return 0;// Error:error:    av_free(tmp_vlc_bits);    av_free(tmp_vlc_codes);    return 1;}// Process time domain transforms part (unused in Vorbis I)static int vorbis_parse_setup_hdr_tdtransforms(vorbis_context *vc) {    GetBitContext *gb=&vc->gb;    uint_fast8_t i;    uint_fast8_t vorbis_time_count=get_bits(gb, 6)+1;    for(i=0;i<vorbis_time_count;++i) {        uint_fast16_t vorbis_tdtransform=get_bits(gb, 16);        AV_DEBUG(" Vorbis time domain transform %d: %d \n", vorbis_time_count, vorbis_tdtransform);        if (vorbis_tdtransform) {            av_log(vc->avccontext, AV_LOG_ERROR, "Vorbis time domain transform data nonzero. \n");            return 1;        }    }    return 0;}// Process floors partstatic uint_fast8_t vorbis_floor0_decode(vorbis_context *vc,                                         vorbis_floor_data *vfu, float *vec);static void create_map( vorbis_context * vc, uint_fast8_t floor_number );static uint_fast8_t vorbis_floor1_decode(vorbis_context *vc,                                         vorbis_floor_data *vfu, float *vec);static int vorbis_parse_setup_hdr_floors(vorbis_context *vc) {    GetBitContext *gb=&vc->gb;    uint_fast16_t i,j,k;    vc->floor_count=get_bits(gb, 6)+1;    vc->floors=(vorbis_floor *)av_mallocz(vc->floor_count * sizeof(vorbis_floor));    for (i=0;i<vc->floor_count;++i) {        vorbis_floor *floor_setup=&vc->floors[i];        floor_setup->floor_type=get_bits(gb, 16);        AV_DEBUG(" %d. floor type %d \n", i, floor_setup->floor_type);        if (floor_setup->floor_type==1) {            uint_fast8_t maximum_class=0;            uint_fast8_t rangebits;            uint_fast16_t floor1_values=2;            floor_setup->decode=vorbis_floor1_decode;            floor_setup->data.t1.partitions=get_bits(gb, 5);            AV_DEBUG(" %d.floor: %d partitions \n", i, floor_setup->data.t1.partitions);            for(j=0;j<floor_setup->data.t1.partitions;++j) {                floor_setup->data.t1.partition_class[j]=get_bits(gb, 4);                if (floor_setup->data.t1.partition_class[j]>maximum_class) maximum_class=floor_setup->data.t1.partition_class[j];                AV_DEBUG(" %d. floor %d partition class %d \n", i, j, floor_setup->data.t1.partition_class[j]);            }            AV_DEBUG(" maximum class %d \n", maximum_class);            floor_setup->data.t1.maximum_class=maximum_class;            for(j=0;j<=maximum_class;++j) {                floor_setup->data.t1.class_dimensions[j]=get_bits(gb, 3)+1;                floor_setup->data.t1.class_subclasses[j]=get_bits(gb, 2);                AV_DEBUG(" %d floor %d class dim: %d subclasses %d \n", i, j, floor_setup->data.t1.class_dimensions[j], floor_setup->data.t1.class_subclasses[j]);                if (floor_setup->data.t1.class_subclasses[j]) {                    floor_setup->data.t1.class_masterbook[j]=get_bits(gb, 8);                    AV_DEBUG("   masterbook: %d \n", floor_setup->data.t1.class_masterbook[j]);                }                for(k=0;k<(1<<floor_setup->data.t1.class_subclasses[j]);++k) {                    floor_setup->data.t1.subclass_books[j][k]=get_bits(gb, 8)-1;                    AV_DEBUG("    book %d. : %d \n", k, floor_setup->data.t1.subclass_books[j][k]);                }            }            floor_setup->data.t1.multiplier=get_bits(gb, 2)+1;            floor_setup->data.t1.x_list_dim=2;            for(j=0;j<floor_setup->data.t1.partitions;++j) {                floor_setup->data.t1.x_list_dim+=floor_setup->data.t1.class_dimensions[floor_setup->data.t1.partition_class[j]];            }            floor_setup->data.t1.x_list=(uint_fast16_t *)av_mallocz(floor_setup->data.t1.x_list_dim * sizeof(uint_fast16_t));            floor_setup->data.t1.x_list_order=(uint_fast16_t *)av_mallocz(floor_setup->data.t1.x_list_dim * sizeof(uint_fast16_t));            floor_setup->data.t1.low_neighbour=(uint_fast16_t *)av_mallocz(floor_setup->data.t1.x_list_dim * sizeof(uint_fast16_t));            floor_setup->data.t1.high_neighbour=(uint_fast16_t *)av_mallocz(floor_setup->data.t1.x_list_dim * sizeof(uint_fast16_t));            rangebits=get_bits(gb, 4);            floor_setup->data.t1.x_list[0] = 0;            floor_setup->data.t1.x_list[1] = (1<<rangebits);            for(j=0;j<floor_setup->data.t1.partitions;++j) {                for(k=0;k<floor_setup->data.t1.class_dimensions[floor_setup->data.t1.partition_class[j]];++k,++floor1_values) {                    floor_setup->data.t1.x_list[floor1_values]=get_bits(gb, rangebits);                    AV_DEBUG(" %d. floor1 Y coord. %d \n", floor1_values, floor_setup->data.t1.x_list[floor1_values]);                }            }// Precalculate order of x coordinates - needed for decode            for(k=0;k<floor_setup->data.t1.x_list_dim;++k) {                floor_setup->data.t1.x_list_order[k]=k;            }            for(k=0;k<floor_setup->data.t1.x_list_dim-1;++k) {   // FIXME optimize sorting ?                for(j=k+1;j<floor_setup->data.t1.x_list_dim;++j) {                    if(floor_setup->data.t1.x_list[floor_setup->data.t1.x_list_order[k]]>floor_setup->data.t1.x_list[floor_setup->data.t1.x_list_order[j]]) {                        uint_fast16_t tmp=floor_setup->data.t1.x_list_order[k];                        floor_setup->data.t1.x_list_order[k]=floor_setup->data.t1.x_list_order[j];                        floor_setup->data.t1.x_list_order[j]=tmp;                    }                }            }// Precalculate low and high neighbours            for(k=2;k<floor_setup->data.t1.x_list_dim;++k) {                floor_setup->data.t1.low_neighbour[k]=0;                floor_setup->data.t1.high_neighbour[k]=1;  // correct according to SPEC requirements                for (j=0;j<k;++j) {                    if ((floor_setup->data.t1.x_list[j]<floor_setup->data.t1.x_list[k]) &&                      (floor_setup->data.t1.x_list[j]>floor_setup->data.t1.x_list[floor_setup->data.t1.low_neighbour[k]])) {                        floor_setup->data.t1.low_neighbour[k]=j;                    }                    if ((floor_setup->data.t1.x_list[j]>floor_setup->data.t1.x_list[k]) &&                      (floor_setup->data.t1.x_list[j]<floor_setup->data.t1.x_list[floor_setup->data.t1.high_neighbour[k]])) {                        floor_setup->data.t1.high_neighbour[k]=j;                    }                }            }        }        else if(floor_setup->floor_type==0) {            uint_fast8_t max_codebook_dim=0;            floor_setup->decode=vorbis_floor0_decode;            floor_setup->data.t0.order=get_bits(gb, 8);            floor_setup->data.t0.rate=get_bits(gb, 16);            floor_setup->data.t0.bark_map_size=get_bits(gb, 16);            floor_setup->data.t0.amplitude_bits=get_bits(gb, 6);            /* zero would result in a div by zero later *             * 2^0 - 1 == 0                             */            if (floor_setup->data.t0.amplitude_bits == 0) {              av_log(vc->avccontext, AV_LOG_ERROR,                     "Floor 0 amplitude bits is 0.\n");              return 1;            }            floor_setup->data.t0.amplitude_offset=get_bits(gb, 8);            floor_setup->data.t0.num_books=get_bits(gb, 4)+1;            /* allocate mem for booklist */            floor_setup->data.t0.book_list=                av_malloc(floor_setup->data.t0.num_books);            if(!floor_setup->data.t0.book_list) { return 1; }            /* read book indexes */            {                int idx;                uint_fast8_t book_idx;                for (idx=0;idx<floor_setup->data.t0.num_books;++idx) {                    book_idx=get_bits(gb, 8);                    floor_setup->data.t0.book_list[idx]=book_idx;                    if (vc->codebooks[book_idx].dimensions > max_codebook_dim)                        max_codebook_dim=vc->codebooks[book_idx].dimensions;                    if (floor_setup->data.t0.book_list[idx]>vc->codebook_count)                        return 1;                }            }            create_map( vc, i );            /* allocate mem for lsp coefficients */            {                /* codebook dim is for padding if codebook dim doesn't *                 * divide order+1 then we need to read more data       */                floor_setup->data.t0.lsp=                    av_malloc((floor_setup->data.t0.order+1 + max_codebook_dim)                              * sizeof(float));                if(!floor_setup->data.t0.lsp) { return 1; }            }#ifdef V_DEBUG /* debug output parsed headers */            AV_DEBUG("floor0 order: %u\n", floor_setup->data.t0.order);            AV_DEBUG("floor0 rate: %u\n", floor_setup->data.t0.rate);            AV_DEBUG("floor0 bark map size: %u\n",              floor_setup->data.t0.bark_map_size);            AV_DEBUG("floor0 amplitude bits: %u\n",              floor_setup->data.t0.amplitude_bits);            AV_DEBUG("floor0 amplitude offset: %u\n",              floor_setup->data.t0.amplitude_offset);            AV_DEBUG("floor0 number of books: %u\n",              floor_setup->data.t0.num_books);            AV_DEBUG("floor0 book list pointer: %p\n",              floor_setup->data.t0.book_list);            {              int idx;              for (idx=0;idx<floor_setup->data.t0.num_books;++idx) {                AV_DEBUG( "  Book %d: %u\n",                  idx+1,                  floor_setup->data.t0.book_list[idx] );              }            }#endif        }        else {            av_log(vc->avccontext, AV_LOG_ERROR, "Invalid floor type!\n");            return 1;        }    }    return 0;}// Process residues partstatic int vorbis_parse_setup_hdr_residues(vorbis_context *vc){    GetBitContext *gb=&vc->gb;    uint_fast8_t i, j, k;    vc->residue_count=get_bits(gb, 6)+1;    vc->residues=(vorbis_residue *)av_mallocz(vc->residue_count * sizeof(vorbis_residue));    AV_DEBUG(" There are %d residues. \n", vc->residue_count);    for(i=0;i<vc->residue_count;++i) {        vorbis_residue *res_setup=&vc->residues[i];        uint_fast8_t cascade[64];        uint_fast8_t high_bits;        uint_fast8_t low_bits;        res_setup->type=get_bits(gb, 16);        AV_DEBUG(" %d. residue type %d \n", i, res_setup->type);        res_setup->begin=get_bits(gb, 24);        res_setup->end=get_bits(gb, 24);        res_setup->partition_size=get_bits(gb, 24)+1;        res_setup->classifications=get_bits(gb, 6)+1;        res_setup->classbook=get_bits(gb, 8);        AV_DEBUG("    begin %d end %d part.size %d classif.s %d classbook %d \n", res_setup->begin, res_setup->end, res_setup->partition_size,          res_setup->classifications, res_setup->classbook);        for(j=0;j<res_setup->classifications;++j) {            high_bits=0;            low_bits=get_bits(gb, 3);            if (get_bits1(gb)) {                high_bits=get_bits(gb, 5);            }            cascade[j]=(high_bits<<3)+low_bits;            AV_DEBUG("     %d class casscade depth: %d \n", j, ilog(cascade[j]));        }        res_setup->maxpass=0;        for(j=0;j<res_setup->classifications;++j) {            for(k=0;k<8;++k) {                if (cascade[j]&(1<<k)) {                        res_setup->books[j][k]=get_bits(gb, 8);                    AV_DEBUG("     %d class casscade depth %d book: %d \n", j, k, res_setup->books[j][k]);                    if (k>res_setup->maxpass) {                        res_setup->maxpass=k;                    }                } else {                    res_setup->books[j][k]=-1;                }            }        }    }    return 0;}// Process mappings partstatic int vorbis_parse_setup_hdr_mappings(vorbis_context *vc) {    GetBitContext *gb=&vc->gb;    uint_fast8_t i, j;    vc->mapping_count=get_bits(gb, 6)+1;    vc->mappings=(vorbis_mapping *)av_mallocz(vc->mapping_count * sizeof(vorbis_mapping));    AV_DEBUG(" There are %d mappings. \n", vc->mapping_count);    for(i=0;i<vc->mapping_count;++i) {        vorbis_mapping *mapping_setup=&vc->mappings[i];        if (get_bits(gb, 16)) {            av_log(vc->avccontext, AV_LOG_ERROR, "Other mappings than type 0 are not compliant with the Vorbis I specification. \n");            return 1;        }        if (get_bits1(gb)) {            mapping_setup->submaps=get_bits(gb, 4)+1;        } else {            mapping_setup->submaps=1;        }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -