changeset 8707:99ce98bd57a3 libavcodec

simplifying DIF encoding process
author romansh
date Sat, 31 Jan 2009 01:39:05 +0000
parents ddcd5db645e3
children 2ecdf1ad277f
files dv.c
diffstat 1 files changed, 24 insertions(+), 22 deletions(-) [+]
line wrap: on
line diff
--- a/dv.c	Sat Jan 31 01:37:31 2009 +0000
+++ b/dv.c	Sat Jan 31 01:39:05 2009 +0000
@@ -1001,7 +1001,6 @@
     int mb_x, mb_y, c_offset, linesize;
     uint8_t*  y_ptr;
     uint8_t*  data;
-    uint8_t*  ptr;
     uint8_t*  dif;
     uint8_t   scratch[64];
     EncBlockInfo  enc_blks[5*DV_MAX_BPM];
@@ -1010,17 +1009,16 @@
     EncBlockInfo* enc_blk;
     int       vs_bit_size = 0;
     int       qnos[5];
+    int*      qnosp = &qnos[0];
 
     dif = &s->buf[work_chunk->buf_offset*80];
     enc_blk = &enc_blks[0];
-    pb = &pbs[0];
     for (mb_index = 0; mb_index < 5; mb_index++) {
         dv_calculate_mb_xy(s, work_chunk, mb_index, &mb_x, &mb_y);
         y_ptr    = s->picture.data[0] + ((mb_y * s->picture.linesize[0] + mb_x) << 3);
         c_offset = (((mb_y >>  (s->sys->pix_fmt == PIX_FMT_YUV420P)) * s->picture.linesize[1] +
                      (mb_x >> ((s->sys->pix_fmt == PIX_FMT_YUV411P) ? 2 : 1))) << 3);
         qnos[mb_index] = 15; /* No quantization */
-        ptr = dif + mb_index*80 + 4;
         for (j = 0; j < 6; j++) {
             if (s->sys->pix_fmt == PIX_FMT_YUV422P) { /* 4:2:2 */
                 if (j == 0 || j == 2) {
@@ -1067,34 +1065,38 @@
 
             vs_bit_size += dv_init_enc_block(enc_blk, data, linesize, s, j>>2);
 
-            init_put_bits(pb, ptr, s->sys->block_sizes[j]/8);
-            put_bits(pb, 9, (uint16_t)(((enc_blk->mb[0] >> 3) - 1024 + 2) >> 2));
-            put_bits(pb, 1, enc_blk->dct_mode);
-            put_bits(pb, 2, enc_blk->cno);
-
             ++enc_blk;
-            ++pb;
-            ptr += s->sys->block_sizes[j]/8;
         }
     }
 
     if (vs_total_ac_bits < vs_bit_size)
-        dv_guess_qnos(&enc_blks[0], &qnos[0]);
+        dv_guess_qnos(&enc_blks[0], qnosp);
+
+    /* DIF encoding process */
+    for (j=0; j<5*s->sys->bpm;) {
+        int start_mb = j;
 
-    for (i = 0; i < 5; i++) {
-       dif[i*80 + 3] = qnos[i];
-    }
+        dif[3] = *qnosp++;
+        dif += 4;
+
+        /* First pass over individual cells only */
+        for (i=0; i<s->sys->bpm; i++, j++) {
+            int sz = s->sys->block_sizes[i]>>3;
 
-    /* First pass over individual cells only */
-    for (j = 0; j < 5 * s->sys->bpm; j++)
-       dv_encode_ac(&enc_blks[j], &pbs[j], &pbs[j+1]);
+            init_put_bits(&pbs[j], dif, sz);
+            put_bits(&pbs[j], 9, (uint16_t)(((enc_blks[j].mb[0] >> 3) - 1024 + 2) >> 2));
+            put_bits(&pbs[j], 1, enc_blks[j].dct_mode);
+            put_bits(&pbs[j], 2, enc_blks[j].cno);
 
-    /* Second pass over each MB space */
-    for (j=0; j<5*s->sys->bpm; j+=s->sys->bpm) {
-        pb = &pbs[j];
+            dv_encode_ac(&enc_blks[j], &pbs[j], &pbs[j+1]);
+            dif += sz;
+        }
+
+        /* Second pass over each MB space */
+        pb = &pbs[start_mb];
         for (i=0; i<s->sys->bpm; i++) {
-            if (enc_blks[i+j].partial_bit_count)
-                pb = dv_encode_ac(&enc_blks[i+j], pb, &pbs[j+s->sys->bpm]);
+            if (enc_blks[start_mb+i].partial_bit_count)
+                pb = dv_encode_ac(&enc_blks[start_mb+i], pb, &pbs[start_mb+s->sys->bpm]);
         }
     }