annotate vorbis_enc.c @ 3810:a8bebf3e9cb7 libavcodec

Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines codebook header syntax small simplification for encode_init()
author ods15
date Mon, 02 Oct 2006 05:55:16 +0000
parents 500d86b68542
children 9f6acced986e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3808
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
1 /*
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
2 * copyright (c) 2006 Oded Shimon <ods15@ods15.dyndns.org>
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
3 *
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
4 * This library is free software; you can redistribute it and/or
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
5 * modify it under the terms of the GNU Lesser General Public
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
6 * License as published by the Free Software Foundation; either
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
7 * version 2 of the License, or (at your option) any later version.
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
8 *
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
9 * This library is distributed in the hope that it will be useful,
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
12 * Lesser General Public License for more details.
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
13 *
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
14 * You should have received a copy of the GNU Lesser General Public
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
15 * License along with this library; if not, write to the Free Software
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
17 */
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
18
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
19 /**
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
20 * @file vorbis_enc.c
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
21 * Native Vorbis encoder.
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
22 * @author Oded Shimon <ods15@ods15.dyndns.org>
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
23 */
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
24
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
25 #include "avcodec.h"
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
26
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
27 #undef NDEBUG
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
28 #include <assert.h>
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
29
3810
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
30 #define ALT_BITSTREAM_READER_LE
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
31 #include "bitstream.h"
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
32
3808
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
33 #define VORBIS_FRAME_SIZE 64
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
34
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
35 #define BUFFER_SIZE (1024*64)
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
36
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
37 typedef struct {
3810
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
38 int len;
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
39 uint32_t codeword;
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
40 } entry_t;
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
41
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
42 typedef struct {
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
43 int nentries;
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
44 entry_t * entries;
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
45 int ndimentions;
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
46 float min;
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
47 float delta;
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
48 int seq_p;
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
49 int lookup;
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
50 //float * dimentions;
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
51 int * quantlist;
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
52 } codebook_t;
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
53
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
54 typedef struct {
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
55 int ncodebooks;
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
56 codebook_t * codebooks;
3808
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
57 } venc_context_t;
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
58
3810
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
59 static inline int ilog(int a) {
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
60 int i;
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
61 for (i = 0; (a >> i) > 0; i++);
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
62 return i;
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
63 }
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
64
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
65 static void put_codebook_header(PutBitContext * pb, codebook_t * cb) {
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
66 int i;
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
67 int ordered = 0;
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
68
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
69 put_bits(pb, 24, 0x564342); //magic
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
70 put_bits(pb, 16, cb->ndimentions);
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
71 put_bits(pb, 24, cb->nentries);
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
72
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
73 for (i = 1; i < cb->nentries; i++) if (cb->entries[i].len < cb->entries[i-1].len) break;
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
74 if (i == cb->entires) ordered = 1;
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
75
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
76 put_bits(pb, 1, ordered);
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
77 if (ordered) {
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
78 int len = cb->entries[0].len;
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
79 put_bits(pb, 5, len);
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
80 i = 0;
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
81 while (i < cb->nentries) {
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
82 for (j = 0; j+i < cb->nentries; j++) if (cb->entries[j+i].len != len) break;
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
83 put_bits(pb, 5, j);
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
84 i += j;
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
85 len++;
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
86 }
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
87 } else {
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
88 int sparse = 0;
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
89 for (i = 0; i < cb->nentries; i++) if (!cb->entries[i].len) break;
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
90 if (i != cb->entires) sparse = 1;
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
91 put_bits(pb, 1, sparse);
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
92
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
93 for (i = 0; i < cb->nentries; i++) {
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
94 if (sparse) put_bits(pb, 1, !!cb->entries[i].len);
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
95 if (cb->entries[i].len) put_bits(pb, 5, cb->entries[i].len);
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
96 }
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
97 }
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
98
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
99 put_bits(pb, 4, cb->lookup);
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
100 if (cb->lookup) {
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
101 int tmp, bits = ilog(cb->quantlist[0]);
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
102
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
103 if (cb->lookup == 1) {
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
104 for (tmp = 0; ; tmp++) {
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
105 int n = 1;
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
106 for (i = 0; i < cb->ndimentions; i++) n *= tmp;
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
107 if (n > cb->nentries) break;
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
108 }
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
109 tmp--;
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
110 } else tmp = cb->ndimentions * cb->nentries;
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
111
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
112 for (i = 1; i < tmp; i++) bits = FFMIN(bits, ilog(cb->quantlist[i]));
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
113
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
114 put_float(bc, cb->min);
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
115 put_float(bc, cb->delta);
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
116
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
117 put_bits(bc, 4, bits - 1);
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
118 put_bits(bc, 1, seq_p);
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
119
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
120 for (i = 0; i < tmp; i++) put_bits(bc, bits, cb->quantlist[i])
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
121 }
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
122 }
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
123
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
124 static void put_main_header(PutBitContext * pb, venc_context_t * venc) {
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
125 int i;
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
126 put_bits(pb, 8, 5); //magic
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
127 for (i = 0; "vorbis"[i]; i++) put_bits(pb, 8, "vorbis"[i]);
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
128
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
129 put_bits(pb, 8, venc->ncodebooks - 1);
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
130 for (i = 0; i < venc->ncodebooks; i++) put_codebook_header(pb, venc->codebooks[0]);
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
131 }
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
132
3809
500d86b68542 Original Commit: r3 | ods15 | 2006-09-16 11:49:07 +0300 (Sat, 16 Sep 2006) | 2 lines
ods15
parents: 3808
diff changeset
133 static int vorbis_encode_init(AVCodecContext * avccontext)
500d86b68542 Original Commit: r3 | ods15 | 2006-09-16 11:49:07 +0300 (Sat, 16 Sep 2006) | 2 lines
ods15
parents: 3808
diff changeset
134 {
3808
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
135 venc_context_t * venc = avccontext->priv_data;
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
136 uint8_t *p;
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
137 unsigned int offset, len;
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
138
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
139 avccontext->channels;
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
140 avccontext->sample_rate;
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
141 //if (avccontext->flags & CODEC_FLAG_QSCALE) avccontext->global_quality / (float)FF_QP2LAMBDA); else avccontext->bit_rate;
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
142 //if(avccontext->cutoff > 0) cfreq = avccontext->cutoff / 1000.0;
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
143
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
144 len = header.bytes + header_comm.bytes + header_code.bytes;
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
145
3810
a8bebf3e9cb7 Original Commit: r4 | ods15 | 2006-09-16 15:36:03 +0300 (Sat, 16 Sep 2006) | 3 lines
ods15
parents: 3809
diff changeset
146 p = avccontext->extradata = av_mallocz(64 + len + len/255);
3808
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
147 p[0] = 2;
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
148 offset = 1;
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
149 offset += av_xiphlacing(&p[offset], header.bytes);
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
150 offset += av_xiphlacing(&p[offset], header_comm.bytes);
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
151 memcpy(&p[offset], header.packet, header.bytes);
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
152 offset += header.bytes;
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
153 memcpy(&p[offset], header_comm.packet, header_comm.bytes);
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
154 offset += header_comm.bytes;
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
155 memcpy(&p[offset], header_code.packet, header_code.bytes);
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
156 offset += header_code.bytes;
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
157 avccontext->extradata_size = offset;
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
158
3809
500d86b68542 Original Commit: r3 | ods15 | 2006-09-16 11:49:07 +0300 (Sat, 16 Sep 2006) | 2 lines
ods15
parents: 3808
diff changeset
159 avccontext->frame_size = VORBIS_FRAME_SIZE;
3808
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
160
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
161 avccontext->coded_frame = avcodec_alloc_frame();
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
162 avccontext->coded_frame->key_frame = 1;
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
163
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
164 return 0;
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
165 }
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
166
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
167
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
168 static int vorbis_encode_frame(AVCodecContext * avccontext, unsigned char * packets, int buf_size, void *data)
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
169 {
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
170 venc_context_t * venc = avccontext->priv_data;
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
171 signed short * audio = data;
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
172 int l, samples = data ? VORBIS_FRAME_SIZE : 0;
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
173
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
174
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
175
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
176 if (!l) return 0;
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
177
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
178 avccontext->coded_frame->pts = av_rescale_q(op2->granulepos, (AVRational){1, avccontext->sample_rate}, avccontext->time_base);
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
179 memcpy(packets, compressed_frame, l);
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
180 return l;
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
181 }
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
182
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
183
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
184 static int vorbis_encode_close(AVCodecContext * avccontext)
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
185 {
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
186 venc_context_t * venc = avccontext->priv_data;
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
187
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
188 av_freep(&avccontext->coded_frame);
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
189 av_freep(&avccontext->extradata);
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
190
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
191 return 0 ;
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
192 }
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
193
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
194 AVCodec oggvorbis_encoder = {
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
195 "vorbis",
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
196 CODEC_TYPE_AUDIO,
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
197 CODEC_ID_VORBIS,
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
198 sizeof(venc_context_t),
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
199 vorbis_encode_init,
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
200 vorbis_encode_frame,
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
201 vorbis_encode_close,
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
202 .capabilities= CODEC_CAP_DELAY,
5551768b5a4f skeleton for vorbis_enc.c
ods15
parents:
diff changeset
203 };