📄 vorbis.c
字号:
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 + -