1b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* 2b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * Copyright (C) 2008-2009 SVOX AG, Baslerstr. 30, 8048 Zuerich, Switzerland 3b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * 4b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * Licensed under the Apache License, Version 2.0 (the "License"); 5b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * you may not use this file except in compliance with the License. 6b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * You may obtain a copy of the License at 7b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * 8b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * http://www.apache.org/licenses/LICENSE-2.0 9b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * 10b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * Unless required by applicable law or agreed to in writing, software 11b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * distributed under the License is distributed on an "AS IS" BASIS, 12b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * See the License for the specific language governing permissions and 14b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * limitations under the License. 15b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */ 16b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/** 17b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @file picokpdf.c 18b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * 19b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * knowledge handling for pdf 20b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * 21b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * Copyright (C) 2008-2009 SVOX AG, Baslerstr. 30, 8048 Zuerich, Switzerland 22b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * All rights reserved. 23b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * 24b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * History: 25b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * - 2009-04-20 -- initial version 26b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * 27b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */ 28b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 29b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#include "picoos.h" 30b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#include "picodbg.h" 31b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#include "picoknow.h" 32b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#include "picokpdf.h" 33b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 34b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#ifdef __cplusplus 35b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenextern "C" { 36b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#endif 37b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#if 0 38b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 39b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#endif 40b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 41b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 42b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* ************************************************************/ 43b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* pdf */ 44b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* ************************************************************/ 45b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 46b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* 47b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @addtogroup picokpdf 48b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * 49b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen overview: format of knowledge base pdf file 50b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 51b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen This is the format for the dur pdf file: 52b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen - Numframes: 1 uint16 53b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen - Vecsize: 1 uint8 54b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen - sampperframe: 1 uint8 55b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen - Phonquantlen: 1 uint8 56b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen - Phonquant: Phonquantlen uint8 57b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen - Statequantlen: 1 uint8 58b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen - Statequantlen: Statequantlen uint8 59b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen - And then numframes x vecsize uint8 60b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 61b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen This is the format for mul (mgc and lfz) pdf files: 62b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen - numframes: 1 uint16 63b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen - vecsize: 1 uint8 64b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen - numstates: 1 uint8 65b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen - numframesperstate: numstates uint16 66b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen - ceporder: 1 uint8 67b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen - numvuv 1 uint8 68b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen - numdeltas: 1 uint8 69b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen - scmeanpow: 1 uint8 70b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen - maxbigpow: 1 uint8 71b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen - scmeanpowum KPDF_NUMSTREAMS * ceporder uint8 72b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen - scivarpow KPDF_NUMSTREAMS * ceporder uint8 73b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 74b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen And then numframes x vecsize uint8 75b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 76b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen*/ 77b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 78b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 79b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* ************************************************************/ 80b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* pdf data defines */ 81b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* may not be changed with current implementation */ 82b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* ************************************************************/ 83b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 84b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 85b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define KPDF_NUMSTREAMS 3 /* coeff, delta, deltadelta */ 86b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 87b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 88b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* ************************************************************/ 89b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* pdf loading */ 90b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* ************************************************************/ 91b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 92b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t kpdfDURInitialize(register picoknow_KnowledgeBase this, 93b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_Common common) { 94b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picokpdf_pdfdur_t *pdfdur; 95b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint16 pos; 96b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 97b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (NULL == this || NULL == this->subObj) { 98b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return picoos_emRaiseException(common->em, PICO_EXC_KB_MISSING, 99b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen NULL, NULL); 100b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 101b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pdfdur = (picokpdf_pdfdur_t *)this->subObj; 102b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 103b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pos = 0; 104b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 105b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pdfdur->numframes = ((picoos_uint16)(this->base[pos+1])) << 8 | 106b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen this->base[pos]; 107b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pos += 2; 108b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pdfdur->vecsize = this->base[pos++]; 109b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pdfdur->sampperframe = this->base[pos++]; 110b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pdfdur->phonquantlen = this->base[pos++]; 111b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pdfdur->phonquant = &(this->base[pos]); 112b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pos += pdfdur->phonquantlen; 113b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pdfdur->statequantlen = this->base[pos++]; 114b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pdfdur->statequant = &(this->base[pos]); 115b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pos += pdfdur->statequantlen; 116b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pdfdur->content = &(this->base[pos]); 117b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_DEBUG(("numframes %d, vecsize %d, phonquantlen %d, " 118b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen "statequantlen %d", pdfdur->numframes, pdfdur->vecsize, 119b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pdfdur->phonquantlen, pdfdur->statequantlen)); 120b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((picoos_uint32)(pos + (pdfdur->numframes * pdfdur->vecsize)) != this->size) { 121b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_DEBUG(("header-spec size %d, kb-size %d", 122b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pos + (pdfdur->numframes * pdfdur->vecsize), 123b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen this->size)); 124b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return picoos_emRaiseException(common->em, PICO_EXC_FILE_CORRUPT, 125b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen NULL, NULL); 126b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 127b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_DEBUG(("dur pdf initialized")); 128b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_OK; 129b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 130b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 131b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic picoos_uint8 convScaleFactorToBig(picoos_uint8 pow, picoos_uint8 bigpow) 132b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 133b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pow > 0x0F) { 134b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pow = bigpow + (0xFF - pow + 1); /* take 2's complement of negative pow */ 135b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else if (bigpow >= pow) { 136b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pow = bigpow - pow; 137b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 138b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* error: bigpow is smaller than input pow */ 139b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return 0; 140b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 141b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return pow; 142b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 143b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 144b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t kpdfMULInitialize(register picoknow_KnowledgeBase this, 145b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_Common common) { 146b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picokpdf_pdfmul_t *pdfmul; 147b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint16 pos; 148b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 scmeanpow, maxbigpow, nummean; 149b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 i; 150b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 151b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (NULL == this || NULL == this->subObj) { 152b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return picoos_emRaiseException(common->em, PICO_EXC_KB_MISSING, 153b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen NULL, NULL); 154b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 155b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pdfmul = (picokpdf_pdfmul_t *)this->subObj; 156b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 157b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pos = 0; 158b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 159b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pdfmul->numframes = ((picoos_uint16)(this->base[pos+1])) << 8 | 160b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen this->base[pos]; 161b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pos += 2; 162b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pdfmul->vecsize = this->base[pos++]; 163b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pdfmul->numstates = this->base[pos++]; 164b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen { 165b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pdfmul->stateoffset[0] = (picoos_uint16) 0; 166b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen for (i=1; i<pdfmul->numstates; i++) { 167b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pdfmul->stateoffset[i] = pdfmul->stateoffset[i-1] + (this->base[pos] | ((picoos_uint16) this->base[pos+1] << 8)); 168b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pos += 2; 169b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 170b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pos += 2; /* we don't need the last number if we only need the offset (i.e. how to get to the vector start) */ 171b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 172b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 173b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pdfmul->ceporder = this->base[pos++]; 174b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pdfmul->numvuv = this->base[pos++]; 175b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pdfmul->numdeltas = this->base[pos++]; 176b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen scmeanpow = this->base[pos++]; 177b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen maxbigpow = this->base[pos++]; 178b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (maxbigpow < PICOKPDF_BIG_POW) { 179b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_ERROR(("bigpow %i is larger than maxbigpow %i defined in pdf lingware", PICOKPDF_BIG_POW, maxbigpow)); 180b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return picoos_emRaiseException(common->em, PICO_EXC_MAX_NUM_EXCEED,NULL,NULL); 181b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 182b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pdfmul->bigpow = PICOKPDF_BIG_POW; /* what we have to use is the smaller number! */ 183b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 184b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pdfmul->amplif = this->base[pos++]; 185b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 186b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* bigpow corrected by scmeanpow, multiply means by 2^meanpow to obtain fixed point representation */ 187b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pdfmul->meanpow = convScaleFactorToBig(scmeanpow, pdfmul->bigpow); 188b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (0 == pdfmul->meanpow) { 189b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_ERROR(("error in convScaleFactorToBig")); 190b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return picoos_emRaiseException(common->em, PICO_EXC_MAX_NUM_EXCEED,NULL,NULL); 191b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 192b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen nummean = 3*pdfmul->ceporder; 193b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 194b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pdfmul->meanpowUm = picoos_allocate(common->mm,nummean*sizeof(picoos_uint8)); 195b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pdfmul->ivarpow = picoos_allocate(common->mm,nummean*sizeof(picoos_uint8)); 196b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((NULL == pdfmul->meanpowUm) || (NULL == pdfmul->ivarpow)) { 197b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_deallocate(common->mm,(void *) &(pdfmul->meanpowUm)); 198b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_deallocate(common->mm,(void *) &(pdfmul->ivarpow)); 199b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return picoos_emRaiseException(common->em,PICO_EXC_OUT_OF_MEM,NULL,NULL); 200b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 201b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 202b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* read meanpowUm and convert on the fly */ 203b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* meaning of meanpowUm becomes: multiply means from pdf stream by 2^meanpowUm 204b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * to achieve fixed point scaling by big 205b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */ 206b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen for (i=0; i<nummean; i++) { 207b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pdfmul->meanpowUm[i] = convScaleFactorToBig(this->base[pos++], pdfmul->bigpow); 208b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 209b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 210b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*read ivarpow and convert on the fly */ 211b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen for (i=0; i<nummean; i++) { 212b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pdfmul->ivarpow[i] = convScaleFactorToBig(this->base[pos++], pdfmul->bigpow); 213b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 214b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 215b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* check numdeltas */ 216b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((pdfmul->numdeltas == 0xFF) && (pdfmul->vecsize != (pdfmul->numvuv + pdfmul->ceporder * 3 * (2+1)))) { 217b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_ERROR(("header has inconsistent values for vecsize, ceporder, numvuv, and numdeltas")); 218b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return picoos_emRaiseException(common->em,PICO_EXC_FILE_CORRUPT,NULL,NULL); 219b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 220b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 221b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* vecsize: 1 uint8 for vuv 222b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen + ceporder short for static means 223b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen + numdeltas uint8 and short for sparse delta means 224b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen + ceporder*3 uint8 for static and delta inverse variances 225b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen*/ 226b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((pdfmul->numdeltas != 0xFF) && (pdfmul->vecsize != pdfmul->numvuv+pdfmul->ceporder*2+pdfmul->numdeltas*3+pdfmul->ceporder*3)) { 227b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_ERROR(("header has inconsistent values for vecsize, ceporder, numvuv, and numdeltas\n" 228b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen "vecsize = %i while numvuv+ceporder*2 + numdeltas*3 + ceporder*3 = %i", 229b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pdfmul->vecsize, pdfmul->numvuv + pdfmul->ceporder*2 + pdfmul->numdeltas * 3 + pdfmul->ceporder * 3)); 230b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return picoos_emRaiseException(common->em,PICO_EXC_FILE_CORRUPT,NULL,NULL); 231b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 232b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pdfmul->content = &(this->base[pos]); 233b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_DEBUG(("numframes %d, vecsize %d, numstates %d, ceporder %d, " 234b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen "numvuv %d, numdeltas %d, meanpow %d, bigpow %d", 235b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pdfmul->numframes, pdfmul->vecsize, pdfmul->numstates, 236b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pdfmul->ceporder, pdfmul->numvuv, pdfmul->numdeltas, 237b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pdfmul->meanpow, pdfmul->bigpow)); 238b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((picoos_uint32)(pos + (pdfmul->numframes * pdfmul->vecsize)) != this->size) { 239b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_DEBUG(("header-spec size %d, kb-size %d", 240b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pos + (pdfmul->numframes * pdfmul->vecsize), 241b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen this->size)); 242b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return picoos_emRaiseException(common->em, PICO_EXC_FILE_CORRUPT, 243b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen NULL, NULL); 244b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 245b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_DEBUG(("mul pdf initialized")); 246b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_OK; 247b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 248b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 249b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t kpdfPHSInitialize(register picoknow_KnowledgeBase this, 250b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_Common common) { 251b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picokpdf_pdfphs_t *pdfphs; 252b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint16 pos; 253b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 254b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (NULL == this || NULL == this->subObj) { 255b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return picoos_emRaiseException(common->em, PICO_EXC_KB_MISSING, 256b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen NULL, NULL); 257b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 258b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pdfphs = (picokpdf_pdfphs_t *)this->subObj; 259b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 260b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pos = 0; 261b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 262b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pdfphs->numvectors = ((picoos_uint16)(this->base[pos+1])) << 8 | 263b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen this->base[pos]; 264b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pos += 2; 265b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pdfphs->indexBase = &(this->base[pos]); 266b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pdfphs->contentBase = pdfphs->indexBase + pdfphs->numvectors * sizeof(picoos_uint32); 267b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_DEBUG(("phs pdf initialized")); 268b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_OK; 269b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 270b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 271b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 272b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 273b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t kpdfMULSubObjDeallocate(register picoknow_KnowledgeBase this, 274b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_MemoryManager mm) { 275b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 276b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 277b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picokpdf_pdfmul_t *pdfmul; 278b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 279b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((NULL != this) && (NULL != this->subObj)) { 280b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pdfmul = (picokpdf_pdfmul_t *)this->subObj; 281b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_deallocate(mm,(void *) &(pdfmul->meanpowUm)); 282b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_deallocate(mm,(void *) &(pdfmul->ivarpow)); 283b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_deallocate(mm, (void *) &(this->subObj)); 284b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 285b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_OK; 286b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 287b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 288b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t kpdfDURSubObjDeallocate(register picoknow_KnowledgeBase this, 289b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_MemoryManager mm) { 290b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (NULL != this) { 291b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_deallocate(mm, (void *) &this->subObj); 292b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 293b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_OK; 294b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 295b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 296b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t kpdfPHSSubObjDeallocate(register picoknow_KnowledgeBase this, 297b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_MemoryManager mm) { 298b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (NULL != this) { 299b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_deallocate(mm, (void *) &this->subObj); 300b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 301b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_OK; 302b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 303b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 304b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* we don't offer a specialized constructor for a *KnowledgeBase but 305b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * instead a "specializer" of an allready existing generic 306b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * picoknow_KnowledgeBase */ 307b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 308b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpico_status_t picokpdf_specializePdfKnowledgeBase(picoknow_KnowledgeBase this, 309b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_Common common, 310b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen const picokpdf_kpdftype_t kpdftype) { 311b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pico_status_t status; 312b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 313b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (NULL == this) { 314b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return picoos_emRaiseException(common->em, PICO_EXC_KB_MISSING, 315b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen NULL, NULL); 316b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 317b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen switch (kpdftype) { 318b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOKPDF_KPDFTYPE_DUR: 319b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen this->subDeallocate = kpdfDURSubObjDeallocate; 320b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen this->subObj = picoos_allocate(common->mm,sizeof(picokpdf_pdfdur_t)); 321b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (NULL == this->subObj) { 322b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return picoos_emRaiseException(common->em, PICO_EXC_OUT_OF_MEM, 323b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen NULL, NULL); 324b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 325b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen status = kpdfDURInitialize(this, common); 326b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 327b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOKPDF_KPDFTYPE_MUL: 328b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen this->subDeallocate = kpdfMULSubObjDeallocate; 329b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen this->subObj = picoos_allocate(common->mm,sizeof(picokpdf_pdfmul_t)); 330b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (NULL == this->subObj) { 331b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return picoos_emRaiseException(common->em, PICO_EXC_OUT_OF_MEM, 332b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen NULL, NULL); 333b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 334b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen status = kpdfMULInitialize(this, common); 335b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 336b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOKPDF_KPDFTYPE_PHS: 337b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen this->subDeallocate = kpdfPHSSubObjDeallocate; 338b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen this->subObj = picoos_allocate(common->mm,sizeof(picokpdf_pdfphs_t)); 339b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (NULL == this->subObj) { 340b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return picoos_emRaiseException(common->em, PICO_EXC_OUT_OF_MEM, 341b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen NULL, NULL); 342b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 343b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen status = kpdfPHSInitialize(this, common); 344b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 345b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 346b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen default: 347b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return picoos_emRaiseException(common->em, PICO_ERR_OTHER, 348b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen NULL, NULL); 349b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 350b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 351b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (status != PICO_OK) { 352b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_deallocate(common->mm, (void *) &this->subObj); 353b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return picoos_emRaiseException(common->em, status, NULL, NULL); 354b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 355b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_OK; 356b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 357b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 358b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 359b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* ************************************************************/ 360b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* pdf getPdf* */ 361b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* ************************************************************/ 362b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 363b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpicokpdf_PdfDUR picokpdf_getPdfDUR(picoknow_KnowledgeBase this) { 364b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return ((NULL == this) ? NULL : ((picokpdf_PdfDUR) this->subObj)); 365b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 366b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 367b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpicokpdf_PdfMUL picokpdf_getPdfMUL(picoknow_KnowledgeBase this) { 368b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return ((NULL == this) ? NULL : ((picokpdf_PdfMUL) this->subObj)); 369b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 370b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 371b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpicokpdf_PdfPHS picokpdf_getPdfPHS(picoknow_KnowledgeBase this) { 372b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return ((NULL == this) ? NULL : ((picokpdf_PdfPHS) this->subObj)); 373b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 374b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 375b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 376b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#ifdef __cplusplus 377b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 378b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#endif 379b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 380b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 381b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* end */ 382