1e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org/* Copyright (c) 2011 Xiph.Org Foundation 2e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org Written by Jean-Marc Valin */ 3e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org/* 4e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org Redistribution and use in source and binary forms, with or without 5e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org modification, are permitted provided that the following conditions 6e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org are met: 7e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org 8e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org - Redistributions of source code must retain the above copyright 9e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org notice, this list of conditions and the following disclaimer. 10e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org 11e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org - Redistributions in binary form must reproduce the above copyright 12e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org notice, this list of conditions and the following disclaimer in the 13e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org documentation and/or other materials provided with the distribution. 14e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org 15e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 16e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 17e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 18e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR 19e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 20e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 21e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 22e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 23e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 24e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 25e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org*/ 27e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org 28e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#ifndef ANALYSIS_H 29e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#define ANALYSIS_H 30e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org 31e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#include "celt.h" 32e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#include "opus_private.h" 33e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org 34e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#define NB_FRAMES 8 35e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#define NB_TBANDS 18 36e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#define NB_TOT_BANDS 21 37e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#define ANALYSIS_BUF_SIZE 720 /* 15 ms at 48 kHz */ 38e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org 39e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#define DETECT_SIZE 200 40e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org 41e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.orgtypedef struct { 42e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org float angle[240]; 43e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org float d_angle[240]; 44e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org float d2_angle[240]; 45e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org opus_val32 inmem[ANALYSIS_BUF_SIZE]; 46e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org int mem_fill; /* number of usable samples in the buffer */ 47e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org float prev_band_tonality[NB_TBANDS]; 48e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org float prev_tonality; 49e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org float E[NB_FRAMES][NB_TBANDS]; 50e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org float lowE[NB_TBANDS]; 51e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org float highE[NB_TBANDS]; 52e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org float meanE[NB_TOT_BANDS]; 53e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org float mem[32]; 54e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org float cmean[8]; 55e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org float std[9]; 56e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org float music_prob; 57e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org float Etracker; 58e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org float lowECount; 59e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org int E_count; 60e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org int last_music; 61e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org int last_transition; 62e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org int count; 633c3902f0ac13428394f14f78f0fab05ef3468d69tlegrand@google.com float subframe_mem[3]; 64e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org int analysis_offset; 65e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org /** Probability of having speech for time i to DETECT_SIZE-1 (and music before). 66e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org pspeech[0] is the probability that all frames in the window are speech. */ 67e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org float pspeech[DETECT_SIZE]; 68e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org /** Probability of having music for time i to DETECT_SIZE-1 (and speech before). 69e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org pmusic[0] is the probability that all frames in the window are music. */ 70e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org float pmusic[DETECT_SIZE]; 71e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org float speech_confidence; 72e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org float music_confidence; 73e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org int speech_confidence_count; 74e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org int music_confidence_count; 75e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org int write_pos; 76e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org int read_pos; 77e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org int read_subframe; 78e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org AnalysisInfo info[DETECT_SIZE]; 79e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org} TonalityAnalysisState; 80e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org 81e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.orgvoid tonality_analysis(TonalityAnalysisState *tonal, AnalysisInfo *info, 82e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org const CELTMode *celt_mode, const void *x, int len, int offset, int c1, int c2, int C, int lsb_depth, downmix_func downmix); 83e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org 84e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.orgvoid tonality_get_info(TonalityAnalysisState *tonal, AnalysisInfo *info_out, int len); 85e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org 86e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.orgvoid run_analysis(TonalityAnalysisState *analysis, const CELTMode *celt_mode, const void *analysis_pcm, 87e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org int analysis_frame_size, int frame_size, int c1, int c2, int C, opus_int32 Fs, 88e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org int lsb_depth, downmix_func downmix, AnalysisInfo *analysis_info); 89e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org 90e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#endif 91