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