Mercurial > libavcodec.hg
comparison 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 |
comparison
equal
deleted
inserted
replaced
3809:500d86b68542 | 3810:a8bebf3e9cb7 |
---|---|
25 #include "avcodec.h" | 25 #include "avcodec.h" |
26 | 26 |
27 #undef NDEBUG | 27 #undef NDEBUG |
28 #include <assert.h> | 28 #include <assert.h> |
29 | 29 |
30 #define ALT_BITSTREAM_READER_LE | |
31 #include "bitstream.h" | |
32 | |
30 #define VORBIS_FRAME_SIZE 64 | 33 #define VORBIS_FRAME_SIZE 64 |
31 | 34 |
32 #define BUFFER_SIZE (1024*64) | 35 #define BUFFER_SIZE (1024*64) |
33 | 36 |
34 typedef struct { | 37 typedef struct { |
35 uint8_t buffer[BUFFER_SIZE]; | 38 int len; |
36 int buffer_index; | 39 uint32_t codeword; |
40 } entry_t; | |
41 | |
42 typedef struct { | |
43 int nentries; | |
44 entry_t * entries; | |
45 int ndimentions; | |
46 float min; | |
47 float delta; | |
48 int seq_p; | |
49 int lookup; | |
50 //float * dimentions; | |
51 int * quantlist; | |
52 } codebook_t; | |
53 | |
54 typedef struct { | |
55 int ncodebooks; | |
56 codebook_t * codebooks; | |
37 } venc_context_t; | 57 } venc_context_t; |
58 | |
59 static inline int ilog(int a) { | |
60 int i; | |
61 for (i = 0; (a >> i) > 0; i++); | |
62 return i; | |
63 } | |
64 | |
65 static void put_codebook_header(PutBitContext * pb, codebook_t * cb) { | |
66 int i; | |
67 int ordered = 0; | |
68 | |
69 put_bits(pb, 24, 0x564342); //magic | |
70 put_bits(pb, 16, cb->ndimentions); | |
71 put_bits(pb, 24, cb->nentries); | |
72 | |
73 for (i = 1; i < cb->nentries; i++) if (cb->entries[i].len < cb->entries[i-1].len) break; | |
74 if (i == cb->entires) ordered = 1; | |
75 | |
76 put_bits(pb, 1, ordered); | |
77 if (ordered) { | |
78 int len = cb->entries[0].len; | |
79 put_bits(pb, 5, len); | |
80 i = 0; | |
81 while (i < cb->nentries) { | |
82 for (j = 0; j+i < cb->nentries; j++) if (cb->entries[j+i].len != len) break; | |
83 put_bits(pb, 5, j); | |
84 i += j; | |
85 len++; | |
86 } | |
87 } else { | |
88 int sparse = 0; | |
89 for (i = 0; i < cb->nentries; i++) if (!cb->entries[i].len) break; | |
90 if (i != cb->entires) sparse = 1; | |
91 put_bits(pb, 1, sparse); | |
92 | |
93 for (i = 0; i < cb->nentries; i++) { | |
94 if (sparse) put_bits(pb, 1, !!cb->entries[i].len); | |
95 if (cb->entries[i].len) put_bits(pb, 5, cb->entries[i].len); | |
96 } | |
97 } | |
98 | |
99 put_bits(pb, 4, cb->lookup); | |
100 if (cb->lookup) { | |
101 int tmp, bits = ilog(cb->quantlist[0]); | |
102 | |
103 if (cb->lookup == 1) { | |
104 for (tmp = 0; ; tmp++) { | |
105 int n = 1; | |
106 for (i = 0; i < cb->ndimentions; i++) n *= tmp; | |
107 if (n > cb->nentries) break; | |
108 } | |
109 tmp--; | |
110 } else tmp = cb->ndimentions * cb->nentries; | |
111 | |
112 for (i = 1; i < tmp; i++) bits = FFMIN(bits, ilog(cb->quantlist[i])); | |
113 | |
114 put_float(bc, cb->min); | |
115 put_float(bc, cb->delta); | |
116 | |
117 put_bits(bc, 4, bits - 1); | |
118 put_bits(bc, 1, seq_p); | |
119 | |
120 for (i = 0; i < tmp; i++) put_bits(bc, bits, cb->quantlist[i]) | |
121 } | |
122 } | |
123 | |
124 static void put_main_header(PutBitContext * pb, venc_context_t * venc) { | |
125 int i; | |
126 put_bits(pb, 8, 5); //magic | |
127 for (i = 0; "vorbis"[i]; i++) put_bits(pb, 8, "vorbis"[i]); | |
128 | |
129 put_bits(pb, 8, venc->ncodebooks - 1); | |
130 for (i = 0; i < venc->ncodebooks; i++) put_codebook_header(pb, venc->codebooks[0]); | |
131 } | |
38 | 132 |
39 static int vorbis_encode_init(AVCodecContext * avccontext) | 133 static int vorbis_encode_init(AVCodecContext * avccontext) |
40 { | 134 { |
41 venc_context_t * venc = avccontext->priv_data; | 135 venc_context_t * venc = avccontext->priv_data; |
42 uint8_t *p; | 136 uint8_t *p; |
46 avccontext->sample_rate; | 140 avccontext->sample_rate; |
47 //if (avccontext->flags & CODEC_FLAG_QSCALE) avccontext->global_quality / (float)FF_QP2LAMBDA); else avccontext->bit_rate; | 141 //if (avccontext->flags & CODEC_FLAG_QSCALE) avccontext->global_quality / (float)FF_QP2LAMBDA); else avccontext->bit_rate; |
48 //if(avccontext->cutoff > 0) cfreq = avccontext->cutoff / 1000.0; | 142 //if(avccontext->cutoff > 0) cfreq = avccontext->cutoff / 1000.0; |
49 | 143 |
50 len = header.bytes + header_comm.bytes + header_code.bytes; | 144 len = header.bytes + header_comm.bytes + header_code.bytes; |
51 avccontext->extradata_size = 64 + len + len/255; | 145 |
52 | 146 p = avccontext->extradata = av_mallocz(64 + len + len/255); |
53 p = avccontext->extradata = av_mallocz(avccontext->extradata_size); | |
54 p[0] = 2; | 147 p[0] = 2; |
55 offset = 1; | 148 offset = 1; |
56 offset += av_xiphlacing(&p[offset], header.bytes); | 149 offset += av_xiphlacing(&p[offset], header.bytes); |
57 offset += av_xiphlacing(&p[offset], header_comm.bytes); | 150 offset += av_xiphlacing(&p[offset], header_comm.bytes); |
58 memcpy(&p[offset], header.packet, header.bytes); | 151 memcpy(&p[offset], header.packet, header.bytes); |
60 memcpy(&p[offset], header_comm.packet, header_comm.bytes); | 153 memcpy(&p[offset], header_comm.packet, header_comm.bytes); |
61 offset += header_comm.bytes; | 154 offset += header_comm.bytes; |
62 memcpy(&p[offset], header_code.packet, header_code.bytes); | 155 memcpy(&p[offset], header_code.packet, header_code.bytes); |
63 offset += header_code.bytes; | 156 offset += header_code.bytes; |
64 avccontext->extradata_size = offset; | 157 avccontext->extradata_size = offset; |
65 avccontext->extradata = av_realloc(avccontext->extradata, avccontext->extradata_size); | |
66 | 158 |
67 avccontext->frame_size = VORBIS_FRAME_SIZE; | 159 avccontext->frame_size = VORBIS_FRAME_SIZE; |
68 | 160 |
69 avccontext->coded_frame = avcodec_alloc_frame(); | 161 avccontext->coded_frame = avcodec_alloc_frame(); |
70 avccontext->coded_frame->key_frame = 1; | 162 avccontext->coded_frame->key_frame = 1; |