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