avcodec/dolby_e: use av_clip_uintp2()
[ffmpeg.git] / libavcodec / mqcdec.c
index 56e22f8..34aa519 100644 (file)
 
 static void bytein(MqcState *mqc)
 {
-    if (*mqc->bp == 0xff){
-        if (*(mqc->bp+1) > 0x8f)
+    if (*mqc->bp == 0xff) {
+        if (*(mqc->bp + 1) > 0x8f)
             mqc->c++;
-        else{
+        else {
             mqc->bp++;
             mqc->c += 2 + 0xfe00 - (*mqc->bp << 9);
         }
-    } else{
+    } else {
         mqc->bp++;
         mqc->c += 1 + 0xff00 - (*mqc->bp << 8);
     }
@@ -45,20 +45,20 @@ static void bytein(MqcState *mqc)
 static int exchange(MqcState *mqc, uint8_t *cxstate, int lps)
 {
     int d;
-    if ((mqc->a < ff_mqc_qe[*cxstate]) ^ (!lps)){
+    if ((mqc->a < ff_mqc_qe[*cxstate]) ^ (!lps)) {
         if (lps)
             mqc->a = ff_mqc_qe[*cxstate];
         d = *cxstate & 1;
         *cxstate = ff_mqc_nmps[*cxstate];
-    } else{
+    } else {
         if (lps)
             mqc->a = ff_mqc_qe[*cxstate];
         d = 1 - (*cxstate & 1);
         *cxstate = ff_mqc_nlps[*cxstate];
     }
-    // renormd:
-    do{
-        if (!(mqc->c & 0xff)){
+    // do RENORMD: see ISO/IEC 15444-1:2002 §C.3.3
+    do {
+        if (!(mqc->c & 0xff)) {
             mqc->c -= 0x100;
             bytein(mqc);
         }
@@ -68,20 +68,34 @@ static int exchange(MqcState *mqc, uint8_t *cxstate, int lps)
     return d;
 }
 
-void ff_mqc_initdec(MqcState *mqc, uint8_t *bp)
+void ff_mqc_initdec(MqcState *mqc, uint8_t *bp, int raw, int reset)
 {
-    ff_mqc_init_contexts(mqc);
+    mqc->raw = raw;
+    if (reset)
+        ff_mqc_init_contexts(mqc);
     mqc->bp = bp;
-    mqc->c = (*mqc->bp ^ 0xff) << 16;
+    mqc->c  = (*mqc->bp ^ 0xff) << 16;
     bytein(mqc);
     mqc->c = mqc->c << 7;
     mqc->a = 0x8000;
 }
 
+static int mqc_decode_bypass(MqcState *mqc) {
+    int bit = !(mqc->c & 0x40000000);
+    if (!(mqc->c & 0xff)) {
+        mqc->c -= 0x100;
+        bytein(mqc);
+    }
+    mqc->c += mqc->c;
+    return bit;
+}
+
 int ff_mqc_decode(MqcState *mqc, uint8_t *cxstate)
 {
+    if (mqc->raw)
+        return mqc_decode_bypass(mqc);
     mqc->a -= ff_mqc_qe[*cxstate];
-    if ((mqc->c >> 16) < mqc->a){
+    if ((mqc->c >> 16) < mqc->a) {
         if (mqc->a & 0x8000)
             return *cxstate & 1;
         else