[Ffmpeg-cvslog] r6449 - trunk/libavcodec/vorbis_enc.c

ods15 subversion
Mon Oct 2 07:56:30 CEST 2006


Author: ods15
Date: Mon Oct  2 07:56:30 2006
New Revision: 6449

Modified:
   trunk/libavcodec/vorbis_enc.c

Log:
Original Commit: r41 | ods15 | 2006-09-23 10:52:34 +0300 (Sat, 23 Sep 2006) | 4 lines

residue packet encode

ACTUALLY ENCODES NOW!! still some bugs to fix :)

Modified: trunk/libavcodec/vorbis_enc.c
==============================================================================
--- trunk/libavcodec/vorbis_enc.c	(original)
+++ trunk/libavcodec/vorbis_enc.c	Mon Oct  2 07:56:30 2006
@@ -661,6 +661,60 @@
     return 1;
 }
 
+static float put_vector(codebook_t * book, PutBitContext * pb, float num) {
+    int i;
+    int entry = -1;
+    float distance = 0;
+    assert(book->dimentions);
+    assert(book->ndimentions == 1);
+    for (i = 0; i < book->nentries; i++) {
+        float d = (book->dimentions[i] - num)*(book->dimentions[i] - num);
+        if (entry == -1 || distance > d) {
+            entry = i;
+            distance = d;
+        }
+    }
+    put_bits(pb, book->entries[entry].len, book->entries[entry].codeword);
+    return book->dimentions[entry];
+}
+
+static void residue_encode(venc_context_t * venc, residue_t * rc, PutBitContext * pb, float * coeffs, int samples, int channels) {
+    int pass, i, j, p, k;
+    int psize = rc->partition_size;
+    int partitions = (rc->end - rc->begin) / psize;
+    int classes[channels][partitions];
+    int classwords = venc->codebooks[rc->classbook].ndimentions;
+
+    for (pass = 0; pass < 8; pass++) {
+        p = 0;
+        while (p < partitions) {
+            if (pass == 0) for (j = 0; j < channels; j++) {
+                codebook_t * book = &venc->codebooks[rc->classbook];
+                int entry = 0;
+                put_bits(pb, book->entries[entry].len, book->entries[entry].codeword);
+                for (i = classwords; i--; ) {
+                    classes[j][p + i] = entry % rc->classifications;
+                    entry /= rc->classifications;
+                }
+            }
+            for (i = 0; i < classwords && p < partitions; i++, p++) {
+                for (j = 0; j < channels; j++) {
+                    int nbook = rc->books[classes[j][p]][pass];
+                    codebook_t * book = &venc->codebooks[nbook];
+                    float * buf = coeffs + samples*j + rc->begin + p*psize;
+
+                    assert(rc->type == 0);
+                    assert(book->ndimentions == 1);
+
+                    for (k = 0; k < psize; k++) {
+                        buf[k] -= put_vector(book, pb, buf[k]);
+                    }
+                }
+            }
+        }
+    }
+}
+
 static int vorbis_encode_frame(AVCodecContext * avccontext, unsigned char * packets, int buf_size, void *data)
 {
     venc_context_t * venc = avccontext->priv_data;
@@ -702,9 +756,22 @@
                 put_bits(&pb, book->entries[entry].len, book->entries[entry].codeword);
             }
         }
+
+        for (j = 0; j < samples; j++) {
+            venc->floor[i * samples + j] = floor1_inverse_db_table[220];
+        }
     }
 
-    return data ? 50 : 0;
+    for (i = 0; i < venc->channels; i++) {
+        int j;
+        for (j = 0; j < samples; j++) {
+            venc->coeffs[i * samples + j] /= venc->floor[i * samples + j];
+        }
+    }
+
+    residue_encode(venc, &venc->residues[mapping->residue[mapping->mux[0]]], &pb, venc->coeffs, samples, venc->channels);
+
+    return (put_bits_count(&pb) + 7) / 8;
 }
 
 




More information about the ffmpeg-cvslog mailing list