Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /*
  2.  * MQ-coder decoder
  3.  * Copyright (c) 2007 Kamil Nowosad
  4.  *
  5.  * This file is part of FFmpeg.
  6.  *
  7.  * FFmpeg is free software; you can redistribute it and/or
  8.  * modify it under the terms of the GNU Lesser General Public
  9.  * License as published by the Free Software Foundation; either
  10.  * version 2.1 of the License, or (at your option) any later version.
  11.  *
  12.  * FFmpeg is distributed in the hope that it will be useful,
  13.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  15.  * Lesser General Public License for more details.
  16.  *
  17.  * You should have received a copy of the GNU Lesser General Public
  18.  * License along with FFmpeg; if not, write to the Free Software
  19.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  20.  */
  21.  
  22. /**
  23.  * MQ-coder decoder
  24.  * @file
  25.  * @author Kamil Nowosad
  26.  */
  27.  
  28. #include "mqc.h"
  29.  
  30. static void bytein(MqcState *mqc)
  31. {
  32.     if (*mqc->bp == 0xff) {
  33.         if (*(mqc->bp + 1) > 0x8f)
  34.             mqc->c++;
  35.         else {
  36.             mqc->bp++;
  37.             mqc->c += 2 + 0xfe00 - (*mqc->bp << 9);
  38.         }
  39.     } else {
  40.         mqc->bp++;
  41.         mqc->c += 1 + 0xff00 - (*mqc->bp << 8);
  42.     }
  43. }
  44.  
  45. static int exchange(MqcState *mqc, uint8_t *cxstate, int lps)
  46. {
  47.     int d;
  48.     if ((mqc->a < ff_mqc_qe[*cxstate]) ^ (!lps)) {
  49.         if (lps)
  50.             mqc->a = ff_mqc_qe[*cxstate];
  51.         d = *cxstate & 1;
  52.         *cxstate = ff_mqc_nmps[*cxstate];
  53.     } else {
  54.         if (lps)
  55.             mqc->a = ff_mqc_qe[*cxstate];
  56.         d = 1 - (*cxstate & 1);
  57.         *cxstate = ff_mqc_nlps[*cxstate];
  58.     }
  59.     // do RENORMD: see ISO/IEC 15444-1:2002 §C.3.3
  60.     do {
  61.         if (!(mqc->c & 0xff)) {
  62.             mqc->c -= 0x100;
  63.             bytein(mqc);
  64.         }
  65.         mqc->a += mqc->a;
  66.         mqc->c += mqc->c;
  67.     } while (!(mqc->a & 0x8000));
  68.     return d;
  69. }
  70.  
  71. void ff_mqc_initdec(MqcState *mqc, uint8_t *bp)
  72. {
  73.     ff_mqc_init_contexts(mqc);
  74.     mqc->bp = bp;
  75.     mqc->c  = (*mqc->bp ^ 0xff) << 16;
  76.     bytein(mqc);
  77.     mqc->c = mqc->c << 7;
  78.     mqc->a = 0x8000;
  79. }
  80.  
  81. int ff_mqc_decode(MqcState *mqc, uint8_t *cxstate)
  82. {
  83.     mqc->a -= ff_mqc_qe[*cxstate];
  84.     if ((mqc->c >> 16) < mqc->a) {
  85.         if (mqc->a & 0x8000)
  86.             return *cxstate & 1;
  87.         else
  88.             return exchange(mqc, cxstate, 0);
  89.     } else {
  90.         mqc->c -= mqc->a << 16;
  91.         return exchange(mqc, cxstate, 1);
  92.     }
  93. }
  94.