00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046 #include "common.h"
00047 #include "structs.h"
00048
00049 #include <stdlib.h>
00050
00051 #include "syntax.h"
00052 #include "bits.h"
00053 #include "rvlc.h"
00054
00055
00056 #ifdef ERROR_RESILIENCE
00057
00058
00059
00060
00061 static uint8_t rvlc_decode_sf_forward(ic_stream *ics,
00062 bitfile *ld_sf,
00063 bitfile *ld_esc,
00064 uint8_t *is_used);
00065 #if 0
00066 static uint8_t rvlc_decode_sf_reverse(ic_stream *ics,
00067 bitfile *ld_sf,
00068 bitfile *ld_esc,
00069 uint8_t is_used);
00070 #endif
00071 static int8_t rvlc_huffman_sf(bitfile *ld_sf, bitfile *ld_esc,
00072 int8_t direction);
00073 static int8_t rvlc_huffman_esc(bitfile *ld_esc, int8_t direction);
00074
00075
00076 uint8_t rvlc_scale_factor_data(ic_stream *ics, bitfile *ld)
00077 {
00078 uint8_t bits = 9;
00079
00080 ics->sf_concealment = faad_get1bit(ld
00081 DEBUGVAR(1,149,"rvlc_scale_factor_data(): sf_concealment"));
00082 ics->rev_global_gain = (uint8_t)faad_getbits(ld, 8
00083 DEBUGVAR(1,150,"rvlc_scale_factor_data(): rev_global_gain"));
00084
00085 if (ics->window_sequence == EIGHT_SHORT_SEQUENCE)
00086 bits = 11;
00087
00088
00089 ics->length_of_rvlc_sf = (uint16_t)faad_getbits(ld, bits
00090 DEBUGVAR(1,151,"rvlc_scale_factor_data(): length_of_rvlc_sf"));
00091
00092 if (ics->noise_used)
00093 {
00094 ics->dpcm_noise_nrg = (uint16_t)faad_getbits(ld, 9
00095 DEBUGVAR(1,152,"rvlc_scale_factor_data(): dpcm_noise_nrg"));
00096
00097 ics->length_of_rvlc_sf -= 9;
00098 }
00099
00100 ics->sf_escapes_present = faad_get1bit(ld
00101 DEBUGVAR(1,153,"rvlc_scale_factor_data(): sf_escapes_present"));
00102
00103 if (ics->sf_escapes_present)
00104 {
00105 ics->length_of_rvlc_escapes = (uint8_t)faad_getbits(ld, 8
00106 DEBUGVAR(1,154,"rvlc_scale_factor_data(): length_of_rvlc_escapes"));
00107 }
00108
00109 if (ics->noise_used)
00110 {
00111 ics->dpcm_noise_last_position = (uint16_t)faad_getbits(ld, 9
00112 DEBUGVAR(1,155,"rvlc_scale_factor_data(): dpcm_noise_last_position"));
00113 }
00114
00115 return 0;
00116 }
00117
00118 uint8_t rvlc_decode_scale_factors(ic_stream *ics, bitfile *ld)
00119 {
00120 uint8_t result;
00121 uint8_t intensity_used = 0;
00122 uint8_t *rvlc_sf_buffer = NULL;
00123 uint8_t *rvlc_esc_buffer = NULL;
00124 bitfile ld_rvlc_sf, ld_rvlc_esc;
00125
00126
00127 if (ics->length_of_rvlc_sf > 0)
00128 {
00129
00130
00131
00132 rvlc_sf_buffer = faad_getbitbuffer(ld, ics->length_of_rvlc_sf
00133 DEBUGVAR(1,156,"rvlc_decode_scale_factors(): bitbuffer: length_of_rvlc_sf"));
00134
00135 faad_initbits(&ld_rvlc_sf, (void*)rvlc_sf_buffer, bit2byte(ics->length_of_rvlc_sf));
00136
00137
00138 }
00139
00140 if (ics->sf_escapes_present)
00141 {
00142
00143
00144
00145 rvlc_esc_buffer = faad_getbitbuffer(ld, ics->length_of_rvlc_escapes
00146 DEBUGVAR(1,157,"rvlc_decode_scale_factors(): bitbuffer: length_of_rvlc_escapes"));
00147
00148 faad_initbits(&ld_rvlc_esc, (void*)rvlc_esc_buffer, bit2byte(ics->length_of_rvlc_escapes));
00149
00150
00151 }
00152
00153
00154 result = rvlc_decode_sf_forward(ics, &ld_rvlc_sf,
00155 &ld_rvlc_esc, &intensity_used);
00156
00157
00158
00159
00160 if (rvlc_esc_buffer) faad_free(rvlc_esc_buffer);
00161 if (rvlc_sf_buffer) faad_free(rvlc_sf_buffer);
00162
00163 if (ics->length_of_rvlc_sf > 0)
00164 faad_endbits(&ld_rvlc_sf);
00165 if (ics->sf_escapes_present)
00166 faad_endbits(&ld_rvlc_esc);
00167
00168 return result;
00169 }
00170
00171 static uint8_t rvlc_decode_sf_forward(ic_stream *ics, bitfile *ld_sf, bitfile *ld_esc,
00172 uint8_t *intensity_used)
00173 {
00174 int8_t g, sfb;
00175 int8_t t = 0;
00176 int8_t error = 0;
00177 int8_t noise_pcm_flag = 1;
00178
00179 int16_t scale_factor = ics->global_gain;
00180 int16_t is_position = 0;
00181 int16_t noise_energy = ics->global_gain - 90 - 256;
00182
00183 #ifdef PRINT_RVLC
00184 printf("\nglobal_gain: %d\n", ics->global_gain);
00185 #endif
00186
00187 for (g = 0; g < ics->num_window_groups; g++)
00188 {
00189 for (sfb = 0; sfb < ics->max_sfb; sfb++)
00190 {
00191 if (error)
00192 {
00193 ics->scale_factors[g][sfb] = 0;
00194 } else {
00195 switch (ics->sfb_cb[g][sfb])
00196 {
00197 case ZERO_HCB:
00198 ics->scale_factors[g][sfb] = 0;
00199 break;
00200 case INTENSITY_HCB:
00201 case INTENSITY_HCB2:
00202
00203 *intensity_used = 1;
00204
00205
00206 t = rvlc_huffman_sf(ld_sf, ld_esc, +1);
00207
00208 is_position += t;
00209 ics->scale_factors[g][sfb] = is_position;
00210
00211 break;
00212 case NOISE_HCB:
00213
00214
00215 if (noise_pcm_flag)
00216 {
00217 int16_t n = ics->dpcm_noise_nrg;
00218 noise_pcm_flag = 0;
00219 noise_energy += n;
00220 } else {
00221 t = rvlc_huffman_sf(ld_sf, ld_esc, +1);
00222 noise_energy += t;
00223 }
00224
00225 ics->scale_factors[g][sfb] = noise_energy;
00226
00227 break;
00228 default:
00229
00230
00231 t = rvlc_huffman_sf(ld_sf, ld_esc, +1);
00232
00233 scale_factor += t;
00234 if (scale_factor < 0)
00235 return 4;
00236
00237 ics->scale_factors[g][sfb] = scale_factor;
00238
00239 break;
00240 }
00241 #ifdef PRINT_RVLC
00242 printf("%3d:%4d%4d\n", sfb, ics->sfb_cb[g][sfb],
00243 ics->scale_factors[g][sfb]);
00244 #endif
00245 if (t == 99)
00246 {
00247 error = 1;
00248 }
00249 }
00250 }
00251 }
00252 #ifdef PRINT_RVLC
00253 printf("\n\n");
00254 #endif
00255
00256 return 0;
00257 }
00258
00259 #if 0 // not used right now, doesn't work correctly yet
00260 static uint8_t rvlc_decode_sf_reverse(ic_stream *ics, bitfile *ld_sf, bitfile *ld_esc,
00261 uint8_t intensity_used)
00262 {
00263 int8_t g, sfb;
00264 int8_t t = 0;
00265 int8_t error = 0;
00266 int8_t noise_pcm_flag = 1, is_pcm_flag = 1, sf_pcm_flag = 1;
00267
00268 int16_t scale_factor = ics->rev_global_gain;
00269 int16_t is_position = 0;
00270 int16_t noise_energy = ics->rev_global_gain;
00271
00272 #ifdef PRINT_RVLC
00273 printf("\nrev_global_gain: %d\n", ics->rev_global_gain);
00274 #endif
00275
00276 if (intensity_used)
00277 {
00278 is_position = rvlc_huffman_sf(ld_sf, ld_esc, -1);
00279 #ifdef PRINT_RVLC
00280 printf("is_position: %d\n", is_position);
00281 #endif
00282 }
00283
00284 for (g = ics->num_window_groups-1; g >= 0; g--)
00285 {
00286 for (sfb = ics->max_sfb-1; sfb >= 0; sfb--)
00287 {
00288 if (error)
00289 {
00290 ics->scale_factors[g][sfb] = 0;
00291 } else {
00292 switch (ics->sfb_cb[g][sfb])
00293 {
00294 case ZERO_HCB:
00295 ics->scale_factors[g][sfb] = 0;
00296 break;
00297 case INTENSITY_HCB:
00298 case INTENSITY_HCB2:
00299
00300 if (is_pcm_flag)
00301 {
00302 is_pcm_flag = 0;
00303 ics->scale_factors[g][sfb] = is_position;
00304 } else {
00305 t = rvlc_huffman_sf(ld_sf, ld_esc, -1);
00306 is_position -= t;
00307
00308 ics->scale_factors[g][sfb] = (uint8_t)is_position;
00309 }
00310 break;
00311 case NOISE_HCB:
00312
00313
00314 if (noise_pcm_flag)
00315 {
00316 noise_pcm_flag = 0;
00317 noise_energy = ics->dpcm_noise_last_position;
00318 } else {
00319 t = rvlc_huffman_sf(ld_sf, ld_esc, -1);
00320 noise_energy -= t;
00321 }
00322
00323 ics->scale_factors[g][sfb] = (uint8_t)noise_energy;
00324 break;
00325 default:
00326
00327 if (sf_pcm_flag || (sfb == 0))
00328 {
00329 sf_pcm_flag = 0;
00330 if (sfb == 0)
00331 scale_factor = ics->global_gain;
00332 } else {
00333
00334 t = rvlc_huffman_sf(ld_sf, ld_esc, -1);
00335 scale_factor -= t;
00336 }
00337
00338 if (scale_factor < 0)
00339 return 4;
00340
00341 ics->scale_factors[g][sfb] = (uint8_t)scale_factor;
00342 break;
00343 }
00344 #ifdef PRINT_RVLC
00345 printf("%3d:%4d%4d\n", sfb, ics->sfb_cb[g][sfb],
00346 ics->scale_factors[g][sfb]);
00347 #endif
00348 if (t == 99)
00349 {
00350 error = 1;
00351 }
00352 }
00353 }
00354 }
00355
00356 #ifdef PRINT_RVLC
00357 printf("\n\n");
00358 #endif
00359
00360 return 0;
00361 }
00362 #endif
00363
00364
00365 static rvlc_huff_table book_rvlc[] = {
00366
00367 { 0, 1, 0 },
00368 { -1, 3, 5 },
00369 { 1, 3, 7 },
00370 { -2, 4, 9 },
00371 { -3, 5, 17 },
00372 { 2, 5, 27 },
00373 { -4, 6, 33 },
00374 { 99, 6, 50 },
00375 { 3, 6, 51 },
00376 { 99, 6, 52 },
00377 { -7, 7, 65 },
00378 { 99, 7, 96 },
00379 { 99, 7, 98 },
00380 { 7, 7, 99 },
00381 { 4, 7, 107 },
00382 { -5, 8, 129 },
00383 { 99, 8, 194 },
00384 { 5, 8, 195 },
00385 { 99, 8, 212 },
00386 { 99, 9, 256 },
00387 { -6, 9, 257 },
00388 { 99, 9, 426 },
00389 { 6, 9, 427 },
00390 { 99, 10, 0 }
00391 };
00392
00393 static rvlc_huff_table book_escape[] = {
00394
00395 { 1, 2, 0 },
00396 { 0, 2, 2 },
00397 { 3, 3, 2 },
00398 { 2, 3, 6 },
00399 { 4, 4, 14 },
00400 { 7, 5, 13 },
00401 { 6, 5, 15 },
00402 { 5, 5, 31 },
00403 { 11, 6, 24 },
00404 { 10, 6, 25 },
00405 { 9, 6, 29 },
00406 { 8, 6, 61 },
00407 { 13, 7, 56 },
00408 { 12, 7, 120 },
00409 { 15, 8, 114 },
00410 { 14, 8, 242 },
00411 { 17, 9, 230 },
00412 { 16, 9, 486 },
00413 { 19, 10, 463 },
00414 { 18, 10, 974 },
00415 { 22, 11, 925 },
00416 { 20, 11, 1950 },
00417 { 21, 11, 1951 },
00418 { 23, 12, 1848 },
00419 { 25, 13, 3698 },
00420 { 24, 14, 7399 },
00421 { 26, 15, 14797 },
00422 { 49, 19, 236736 },
00423 { 50, 19, 236737 },
00424 { 51, 19, 236738 },
00425 { 52, 19, 236739 },
00426 { 53, 19, 236740 },
00427 { 27, 20, 473482 },
00428 { 28, 20, 473483 },
00429 { 29, 20, 473484 },
00430 { 30, 20, 473485 },
00431 { 31, 20, 473486 },
00432 { 32, 20, 473487 },
00433 { 33, 20, 473488 },
00434 { 34, 20, 473489 },
00435 { 35, 20, 473490 },
00436 { 36, 20, 473491 },
00437 { 37, 20, 473492 },
00438 { 38, 20, 473493 },
00439 { 39, 20, 473494 },
00440 { 40, 20, 473495 },
00441 { 41, 20, 473496 },
00442 { 42, 20, 473497 },
00443 { 43, 20, 473498 },
00444 { 44, 20, 473499 },
00445 { 45, 20, 473500 },
00446 { 46, 20, 473501 },
00447 { 47, 20, 473502 },
00448 { 48, 20, 473503 },
00449 { 99, 21, 0 }
00450 };
00451
00452 static int8_t rvlc_huffman_sf(bitfile *ld_sf, bitfile *ld_esc,
00453 int8_t direction)
00454 {
00455 uint8_t i, j;
00456 int8_t index;
00457 uint32_t cw;
00458 rvlc_huff_table *h = book_rvlc;
00459
00460 i = h->len;
00461 if (direction > 0)
00462 cw = faad_getbits(ld_sf, i DEBUGVAR(1,0,""));
00463 else
00464 cw = faad_getbits_rev(ld_sf, i DEBUGVAR(1,0,""));
00465
00466 while ((cw != h->cw)
00467 && (i < 10))
00468 {
00469 h++;
00470 j = h->len-i;
00471 i += j;
00472 cw <<= j;
00473 if (direction > 0)
00474 cw |= faad_getbits(ld_sf, j DEBUGVAR(1,0,""));
00475 else
00476 cw |= faad_getbits_rev(ld_sf, j DEBUGVAR(1,0,""));
00477 }
00478
00479 index = h->index;
00480
00481 if (index == +ESC_VAL)
00482 {
00483 int8_t esc = rvlc_huffman_esc(ld_esc, direction);
00484 if (esc == 99)
00485 return 99;
00486 index += esc;
00487 #ifdef PRINT_RVLC
00488 printf("esc: %d - ", esc);
00489 #endif
00490 }
00491 if (index == -ESC_VAL)
00492 {
00493 int8_t esc = rvlc_huffman_esc(ld_esc, direction);
00494 if (esc == 99)
00495 return 99;
00496 index -= esc;
00497 #ifdef PRINT_RVLC
00498 printf("esc: %d - ", esc);
00499 #endif
00500 }
00501
00502 return index;
00503 }
00504
00505 static int8_t rvlc_huffman_esc(bitfile *ld,
00506 int8_t direction)
00507 {
00508 uint8_t i, j;
00509 uint32_t cw;
00510 rvlc_huff_table *h = book_escape;
00511
00512 i = h->len;
00513 if (direction > 0)
00514 cw = faad_getbits(ld, i DEBUGVAR(1,0,""));
00515 else
00516 cw = faad_getbits_rev(ld, i DEBUGVAR(1,0,""));
00517
00518 while ((cw != h->cw)
00519 && (i < 21))
00520 {
00521 h++;
00522 j = h->len-i;
00523 i += j;
00524 cw <<= j;
00525 if (direction > 0)
00526 cw |= faad_getbits(ld, j DEBUGVAR(1,0,""));
00527 else
00528 cw |= faad_getbits_rev(ld, j DEBUGVAR(1,0,""));
00529 }
00530
00531 return h->index;
00532 }
00533
00534 #endif
00535