media/libopus/silk/decode_frame.c

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.

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 "stack_alloc.h"
michael@0 34 #include "PLC.h"
michael@0 35
michael@0 36 /****************/
michael@0 37 /* Decode frame */
michael@0 38 /****************/
michael@0 39 opus_int silk_decode_frame(
michael@0 40 silk_decoder_state *psDec, /* I/O Pointer to Silk decoder state */
michael@0 41 ec_dec *psRangeDec, /* I/O Compressor data structure */
michael@0 42 opus_int16 pOut[], /* O Pointer to output speech frame */
michael@0 43 opus_int32 *pN, /* O Pointer to size of output frame */
michael@0 44 opus_int lostFlag, /* I 0: no loss, 1 loss, 2 decode fec */
michael@0 45 opus_int condCoding /* I The type of conditional coding to use */
michael@0 46 )
michael@0 47 {
michael@0 48 VARDECL( silk_decoder_control, psDecCtrl );
michael@0 49 opus_int L, mv_len, ret = 0;
michael@0 50 VARDECL( opus_int, pulses );
michael@0 51 SAVE_STACK;
michael@0 52
michael@0 53 L = psDec->frame_length;
michael@0 54 ALLOC( psDecCtrl, 1, silk_decoder_control );
michael@0 55 ALLOC( pulses, (L + SHELL_CODEC_FRAME_LENGTH - 1) &
michael@0 56 ~(SHELL_CODEC_FRAME_LENGTH - 1), opus_int );
michael@0 57 psDecCtrl->LTP_scale_Q14 = 0;
michael@0 58
michael@0 59 /* Safety checks */
michael@0 60 silk_assert( L > 0 && L <= MAX_FRAME_LENGTH );
michael@0 61
michael@0 62 if( lostFlag == FLAG_DECODE_NORMAL ||
michael@0 63 ( lostFlag == FLAG_DECODE_LBRR && psDec->LBRR_flags[ psDec->nFramesDecoded ] == 1 ) )
michael@0 64 {
michael@0 65 /*********************************************/
michael@0 66 /* Decode quantization indices of side info */
michael@0 67 /*********************************************/
michael@0 68 silk_decode_indices( psDec, psRangeDec, psDec->nFramesDecoded, lostFlag, condCoding );
michael@0 69
michael@0 70 /*********************************************/
michael@0 71 /* Decode quantization indices of excitation */
michael@0 72 /*********************************************/
michael@0 73 silk_decode_pulses( psRangeDec, pulses, psDec->indices.signalType,
michael@0 74 psDec->indices.quantOffsetType, psDec->frame_length );
michael@0 75
michael@0 76 /********************************************/
michael@0 77 /* Decode parameters and pulse signal */
michael@0 78 /********************************************/
michael@0 79 silk_decode_parameters( psDec, psDecCtrl, condCoding );
michael@0 80
michael@0 81 /********************************************************/
michael@0 82 /* Run inverse NSQ */
michael@0 83 /********************************************************/
michael@0 84 silk_decode_core( psDec, psDecCtrl, pOut, pulses );
michael@0 85
michael@0 86 /********************************************************/
michael@0 87 /* Update PLC state */
michael@0 88 /********************************************************/
michael@0 89 silk_PLC( psDec, psDecCtrl, pOut, 0 );
michael@0 90
michael@0 91 psDec->lossCnt = 0;
michael@0 92 psDec->prevSignalType = psDec->indices.signalType;
michael@0 93 silk_assert( psDec->prevSignalType >= 0 && psDec->prevSignalType <= 2 );
michael@0 94
michael@0 95 /* A frame has been decoded without errors */
michael@0 96 psDec->first_frame_after_reset = 0;
michael@0 97 } else {
michael@0 98 /* Handle packet loss by extrapolation */
michael@0 99 silk_PLC( psDec, psDecCtrl, pOut, 1 );
michael@0 100 }
michael@0 101
michael@0 102 /*************************/
michael@0 103 /* Update output buffer. */
michael@0 104 /*************************/
michael@0 105 silk_assert( psDec->ltp_mem_length >= psDec->frame_length );
michael@0 106 mv_len = psDec->ltp_mem_length - psDec->frame_length;
michael@0 107 silk_memmove( psDec->outBuf, &psDec->outBuf[ psDec->frame_length ], mv_len * sizeof(opus_int16) );
michael@0 108 silk_memcpy( &psDec->outBuf[ mv_len ], pOut, psDec->frame_length * sizeof( opus_int16 ) );
michael@0 109
michael@0 110 /****************************************************************/
michael@0 111 /* Ensure smooth connection of extrapolated and good frames */
michael@0 112 /****************************************************************/
michael@0 113 silk_PLC_glue_frames( psDec, pOut, L );
michael@0 114
michael@0 115 /************************************************/
michael@0 116 /* Comfort noise generation / estimation */
michael@0 117 /************************************************/
michael@0 118 silk_CNG( psDec, psDecCtrl, pOut, L );
michael@0 119
michael@0 120 /* Update some decoder state variables */
michael@0 121 psDec->lagPrev = psDecCtrl->pitchL[ psDec->nb_subfr - 1 ];
michael@0 122
michael@0 123 /* Set output frame length */
michael@0 124 *pN = L;
michael@0 125
michael@0 126 RESTORE_STACK;
michael@0 127 return ret;
michael@0 128 }

mercurial