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;