18e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels/******************************************************************** 28e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * * 38e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * 48e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * 58e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * 68e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * 78e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * * 88e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2007 * 98e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * by the Xiph.Org Foundation http://www.xiph.org/ * 108e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * * 118e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ******************************************************************** 128e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 138e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels function: single-block PCM analysis mode dispatch 148e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels last mod: $Id: analysis.c 16226 2009-07-08 06:43:49Z xiphmont $ 158e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 168e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ********************************************************************/ 178e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 188e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#include <stdio.h> 198e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#include <string.h> 208e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#include <math.h> 218e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#include <ogg/ogg.h> 228e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#include "vorbis/codec.h" 238e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#include "codec_internal.h" 248e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#include "registry.h" 258e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#include "scales.h" 268e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#include "os.h" 278e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#include "misc.h" 288e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 298e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels/* decides between modes, dispatches to the appropriate mapping. */ 308e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsint vorbis_analysis(vorbis_block *vb, ogg_packet *op){ 318e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels int ret,i; 328e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels vorbis_block_internal *vbi=vb->internal; 338e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 348e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels vb->glue_bits=0; 358e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels vb->time_bits=0; 368e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels vb->floor_bits=0; 378e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels vb->res_bits=0; 388e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 398e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels /* first things first. Make sure encode is ready */ 408e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(i=0;i<PACKETBLOBS;i++) 418e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels oggpack_reset(vbi->packetblob[i]); 428e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 438e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels /* we only have one mapping type (0), and we let the mapping code 448e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels itself figure out what soft mode to use. This allows easier 458e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels bitrate management */ 468e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 478e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if((ret=_mapping_P[0]->forward(vb))) 488e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels return(ret); 498e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 508e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if(op){ 518e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if(vorbis_bitrate_managed(vb)) 528e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels /* The app is using a bitmanaged mode... but not using the 538e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels bitrate management interface. */ 548e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels return(OV_EINVAL); 558e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 568e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels op->packet=oggpack_get_buffer(&vb->opb); 578e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels op->bytes=oggpack_bytes(&vb->opb); 588e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels op->b_o_s=0; 598e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels op->e_o_s=vb->eofflag; 608e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels op->granulepos=vb->granulepos; 618e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels op->packetno=vb->sequence; /* for sake of completeness */ 628e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 638e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels return(0); 648e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels} 658e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 668e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#ifdef ANALYSIS 678e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsint analysis_noisy=1; 688e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 698e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels/* there was no great place to put this.... */ 708e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsvoid _analysis_output_always(char *base,int i,float *v,int n,int bark,int dB,ogg_int64_t off){ 718e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels int j; 728e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels FILE *of; 738e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels char buffer[80]; 748e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 758e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels sprintf(buffer,"%s_%d.m",base,i); 768e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels of=fopen(buffer,"w"); 778e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 788e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if(!of)perror("failed to open data dump file"); 798e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 808e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(j=0;j<n;j++){ 818e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if(bark){ 828e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels float b=toBARK((4000.f*j/n)+.25); 838e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels fprintf(of,"%f ",b); 848e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels }else 858e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if(off!=0) 868e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels fprintf(of,"%f ",(double)(j+off)/8000.); 878e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels else 888e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels fprintf(of,"%f ",(double)j); 898e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 908e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if(dB){ 918e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels float val; 928e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if(v[j]==0.) 938e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels val=-140.; 948e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels else 958e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels val=todB(v+j); 968e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels fprintf(of,"%f\n",val); 978e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels }else{ 988e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels fprintf(of,"%f\n",v[j]); 998e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 1008e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 1018e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels fclose(of); 1028e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels} 1038e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1048e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsvoid _analysis_output(char *base,int i,float *v,int n,int bark,int dB, 1058e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ogg_int64_t off){ 1068e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if(analysis_noisy)_analysis_output_always(base,i,v,n,bark,dB,off); 1078e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels} 1088e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1098e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#endif 1108e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1118e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1128e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1138e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1148e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1158e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1168e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1178e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1188e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1198e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1208e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 121