media/libopus/silk/control_audio_bandwidth.c

Thu, 15 Jan 2015 15:59:08 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Thu, 15 Jan 2015 15:59:08 +0100
branch
TOR_BUG_9701
changeset 10
ac0c01689b40
permissions
-rw-r--r--

Implement a real Private Browsing Mode condition by changing the API/ABI;
This solves Tor bug #9701, complying with disk avoidance documented in
https://www.torproject.org/projects/torbrowser/design/#disk-avoidance.

michael@0 1 /***********************************************************************
michael@0 2 Copyright (c) 2006-2011, Skype Limited. All rights reserved.
michael@0 3 Redistribution and use in source and binary forms, with or without
michael@0 4 modification, are permitted provided that the following conditions
michael@0 5 are met:
michael@0 6 - Redistributions of source code must retain the above copyright notice,
michael@0 7 this list of conditions and the following disclaimer.
michael@0 8 - Redistributions in binary form must reproduce the above copyright
michael@0 9 notice, this list of conditions and the following disclaimer in the
michael@0 10 documentation and/or other materials provided with the distribution.
michael@0 11 - Neither the name of Internet Society, IETF or IETF Trust, nor the
michael@0 12 names of specific contributors, may be used to endorse or promote
michael@0 13 products derived from this software without specific prior written
michael@0 14 permission.
michael@0 15 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
michael@0 16 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
michael@0 17 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
michael@0 18 ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
michael@0 19 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
michael@0 20 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
michael@0 21 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
michael@0 22 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
michael@0 23 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
michael@0 24 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
michael@0 25 POSSIBILITY OF SUCH DAMAGE.
michael@0 26 ***********************************************************************/
michael@0 27
michael@0 28 #ifdef HAVE_CONFIG_H
michael@0 29 #include "config.h"
michael@0 30 #endif
michael@0 31
michael@0 32 #include "main.h"
michael@0 33 #include "tuning_parameters.h"
michael@0 34
michael@0 35 /* Control internal sampling rate */
michael@0 36 opus_int silk_control_audio_bandwidth(
michael@0 37 silk_encoder_state *psEncC, /* I/O Pointer to Silk encoder state */
michael@0 38 silk_EncControlStruct *encControl /* I Control structure */
michael@0 39 )
michael@0 40 {
michael@0 41 opus_int fs_kHz;
michael@0 42 opus_int32 fs_Hz;
michael@0 43
michael@0 44 fs_kHz = psEncC->fs_kHz;
michael@0 45 fs_Hz = silk_SMULBB( fs_kHz, 1000 );
michael@0 46 if( fs_Hz == 0 ) {
michael@0 47 /* Encoder has just been initialized */
michael@0 48 fs_Hz = silk_min( psEncC->desiredInternal_fs_Hz, psEncC->API_fs_Hz );
michael@0 49 fs_kHz = silk_DIV32_16( fs_Hz, 1000 );
michael@0 50 } else if( fs_Hz > psEncC->API_fs_Hz || fs_Hz > psEncC->maxInternal_fs_Hz || fs_Hz < psEncC->minInternal_fs_Hz ) {
michael@0 51 /* Make sure internal rate is not higher than external rate or maximum allowed, or lower than minimum allowed */
michael@0 52 fs_Hz = psEncC->API_fs_Hz;
michael@0 53 fs_Hz = silk_min( fs_Hz, psEncC->maxInternal_fs_Hz );
michael@0 54 fs_Hz = silk_max( fs_Hz, psEncC->minInternal_fs_Hz );
michael@0 55 fs_kHz = silk_DIV32_16( fs_Hz, 1000 );
michael@0 56 } else {
michael@0 57 /* State machine for the internal sampling rate switching */
michael@0 58 if( psEncC->sLP.transition_frame_no >= TRANSITION_FRAMES ) {
michael@0 59 /* Stop transition phase */
michael@0 60 psEncC->sLP.mode = 0;
michael@0 61 }
michael@0 62 if( psEncC->allow_bandwidth_switch || encControl->opusCanSwitch ) {
michael@0 63 /* Check if we should switch down */
michael@0 64 if( silk_SMULBB( psEncC->fs_kHz, 1000 ) > psEncC->desiredInternal_fs_Hz )
michael@0 65 {
michael@0 66 /* Switch down */
michael@0 67 if( psEncC->sLP.mode == 0 ) {
michael@0 68 /* New transition */
michael@0 69 psEncC->sLP.transition_frame_no = TRANSITION_FRAMES;
michael@0 70
michael@0 71 /* Reset transition filter state */
michael@0 72 silk_memset( psEncC->sLP.In_LP_State, 0, sizeof( psEncC->sLP.In_LP_State ) );
michael@0 73 }
michael@0 74 if( encControl->opusCanSwitch ) {
michael@0 75 /* Stop transition phase */
michael@0 76 psEncC->sLP.mode = 0;
michael@0 77
michael@0 78 /* Switch to a lower sample frequency */
michael@0 79 fs_kHz = psEncC->fs_kHz == 16 ? 12 : 8;
michael@0 80 } else {
michael@0 81 if( psEncC->sLP.transition_frame_no <= 0 ) {
michael@0 82 encControl->switchReady = 1;
michael@0 83 /* Make room for redundancy */
michael@0 84 encControl->maxBits -= encControl->maxBits * 5 / ( encControl->payloadSize_ms + 5 );
michael@0 85 } else {
michael@0 86 /* Direction: down (at double speed) */
michael@0 87 psEncC->sLP.mode = -2;
michael@0 88 }
michael@0 89 }
michael@0 90 }
michael@0 91 else
michael@0 92 /* Check if we should switch up */
michael@0 93 if( silk_SMULBB( psEncC->fs_kHz, 1000 ) < psEncC->desiredInternal_fs_Hz )
michael@0 94 {
michael@0 95 /* Switch up */
michael@0 96 if( encControl->opusCanSwitch ) {
michael@0 97 /* Switch to a higher sample frequency */
michael@0 98 fs_kHz = psEncC->fs_kHz == 8 ? 12 : 16;
michael@0 99
michael@0 100 /* New transition */
michael@0 101 psEncC->sLP.transition_frame_no = 0;
michael@0 102
michael@0 103 /* Reset transition filter state */
michael@0 104 silk_memset( psEncC->sLP.In_LP_State, 0, sizeof( psEncC->sLP.In_LP_State ) );
michael@0 105
michael@0 106 /* Direction: up */
michael@0 107 psEncC->sLP.mode = 1;
michael@0 108 } else {
michael@0 109 if( psEncC->sLP.mode == 0 ) {
michael@0 110 encControl->switchReady = 1;
michael@0 111 /* Make room for redundancy */
michael@0 112 encControl->maxBits -= encControl->maxBits * 5 / ( encControl->payloadSize_ms + 5 );
michael@0 113 } else {
michael@0 114 /* Direction: up */
michael@0 115 psEncC->sLP.mode = 1;
michael@0 116 }
michael@0 117 }
michael@0 118 } else {
michael@0 119 if (psEncC->sLP.mode<0)
michael@0 120 psEncC->sLP.mode = 1;
michael@0 121 }
michael@0 122 }
michael@0 123 }
michael@0 124
michael@0 125 return fs_kHz;
michael@0 126 }

mercurial