diff --git a/libavcodec/rv34.c b/libavcodec/rv34.c
index 6cf839e..4123c8c 100644
--- a/libavcodec/rv34.c
+++ b/libavcodec/rv34.c
@@ -284,6 +284,7 @@ static inline int rv34_decode_block(DCTELEM *dst, GetBitContext *gb, RV34VLC *rv
       decode_subblock1(dst, code, gb, &rvlc->coefficient);
       if (!pattern)
         return 0;
+      // Does happen
       has_ac = 0;
     } else
       decode_subblock(dst, code, 0, gb, &rvlc->coefficient);
@@ -1160,28 +1161,41 @@ static int rv34_decode_macroblock(RV34DecContext *r, int8_t *intra_types)
         if(!r->is16 && !(cbp & 1)) continue;
         blknum = ((i & 2) >> 1) + ((i & 8) >> 2);
         blkoff = ((i & 1) << 2) + ((i & 4) << 3);
-        if(cbp & 1)
+        if(cbp & 1) {
             rv34_decode_block(s->block[blknum] + blkoff, gb, r->cur_vlcs, r->luma_vlc, 0);
-        //{START_TIMER
-        r->rdsp.rv34_dequant4x4(s->block[blknum] + blkoff, q_ac, q_ac);
-        //STOP_TIMER("first")}
-        if(r->is16) //FIXME: optimize
-            s->block[blknum][blkoff] = block16[(i & 3) | ((i & 0xC) << 1)];
-        r->rdsp.rv34_inv_transform_tab[0](s->block[blknum] + blkoff);
+            //START_TIMER
+            r->rdsp.rv34_dequant4x4(s->block[blknum] + blkoff, q_ac, q_ac);
+            //STOP_TIMER("first")
+            if(r->is16) //FIXME: optimize
+                s->block[blknum][blkoff] = block16[(i & 3) | ((i & 0xC) << 1)];
+            r->rdsp.rv34_inv_transform_tab[0](s->block[blknum] + blkoff);
+        } else if(r->is16) {
+            // This does happen
+            r->rdsp.rv34_idct_dequant4x4_dc(s->block[blknum] + blkoff,
+                                            block16[(i & 3) | ((i & 0xC) << 1)]);
+        } else {
+            DCTELEM *ptr = s->block[blknum] + blkoff;
+            r->rdsp.rv34_idct_dequant4x4_dc(ptr, (ptr[0] * q_ac + 8) >> 4);
+        }
     }
     if(r->block_type == RV34_MB_P_MIX16x16)
         r->cur_vlcs = choose_vlc_set(r->si.quant, r->si.vlc_set, 1);
-    q_dc = rv34_qscale_tab[rv34_chroma_quant[0][s->qscale]];
-    q_ac = rv34_qscale_tab[rv34_chroma_quant[1][s->qscale]];
+    q_ac = rv34_qscale_tab[rv34_chroma_quant[0][s->qscale]];
+    q_dc = rv34_qscale_tab[rv34_chroma_quant[1][s->qscale]];
     for(; i < 24; i++, cbp >>= 1){
         if(!(cbp & 1)) continue;
         blknum = ((i & 4) >> 2) + 4;
         blkoff = ((i & 1) << 2) + ((i & 2) << 4);
         has_ac = rv34_decode_block(s->block[blknum] + blkoff, gb, r->cur_vlcs, r->chroma_vlc, 1);
-        //{START_TIMER
-        r->rdsp.rv34_dequant4x4(s->block[blknum] + blkoff, q_ac, q_dc);
-        //STOP_TIMER("second")}
-        r->rdsp.rv34_inv_transform_tab[0](s->block[blknum] + blkoff);
+        if (has_ac) {
+            //START_TIMER
+            r->rdsp.rv34_dequant4x4(s->block[blknum] + blkoff, q_dc, q_ac);
+            //STOP_TIMER("second")
+            r->rdsp.rv34_inv_transform_tab[0](s->block[blknum] + blkoff);
+        } else {
+            DCTELEM *ptr = s->block[blknum] + blkoff;
+            r->rdsp.rv34_idct_dequant4x4_dc(ptr, (ptr[0] * q_dc + 8) >> 4);
+        }
     }
     if (IS_INTRA(s->current_picture_ptr->f.mb_type[mb_pos]))
         rv34_output_macroblock(r, intra_types, cbp2, r->is16);
diff --git a/libavcodec/rv34dsp.c b/libavcodec/rv34dsp.c
index 302cb17..3fcf4ae 100644
--- a/libavcodec/rv34dsp.c
+++ b/libavcodec/rv34dsp.c
@@ -114,11 +114,22 @@ static void rv34_dequant4x4_c(DCTELEM *block, int Qdc, int Q)
             block[j + i*8] = (block[j + i*8] * Q + 8) >> 4;
 }
 
+static void rv34_idct_dequant4x4_dc_c(DCTELEM *block, int dc)
+{
+    int i, j;
+
+    dc = ( 13*13*dc  + 0x200 ) >> 10;
+    for (i = 0; i < 4; i++, block += 8)
+        for (j = 0; j < 4; j++)
+            block[j] = dc;
+}
+
 av_cold void ff_rv34dsp_init(RV34DSPContext *c, DSPContext* dsp) {
     c->rv34_inv_transform_tab[0] = rv34_inv_transform_c;
     c->rv34_inv_transform_tab[1] = rv34_inv_transform_noround_c;
 
     c->rv34_dequant4x4 = rv34_dequant4x4_c;
+    c->rv34_idct_dequant4x4_dc = rv34_idct_dequant4x4_dc_c;
 
     if (HAVE_NEON)
         ff_rv34dsp_init_neon(c, dsp);
diff --git a/libavcodec/rv34dsp.h b/libavcodec/rv34dsp.h
index b4de5f3..26f2450 100644
--- a/libavcodec/rv34dsp.h
+++ b/libavcodec/rv34dsp.h
@@ -57,6 +57,7 @@ typedef struct RV34DSPContext {
     rv40_weight_func rv40_weight_pixels_tab[2];
     rv34_inv_transform_func rv34_inv_transform_tab[2];
     void (*rv34_dequant4x4)(DCTELEM *block, int Qdc, int Q);
+    void (*rv34_idct_dequant4x4_dc)(DCTELEM *block, int dc);
     rv40_weak_loop_filter_func rv40_weak_loop_filter[2];
     rv40_strong_loop_filter_func rv40_strong_loop_filter[2];
     rv40_loop_filter_strength_func rv40_loop_filter_strength[2];
