vorbis.c
Go to the documentation of this file.
1 /**
2  * @file
3  * Common code for Vorbis I encoder and decoder
4  * @author Denes Balatoni ( dbalatoni programozo hu )
5  *
6  * This file is part of FFmpeg.
7  *
8  * FFmpeg is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public
10  * License as published by the Free Software Foundation; either
11  * version 2.1 of the License, or (at your option) any later version.
12  *
13  * FFmpeg is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16  * Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with FFmpeg; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21  */
22 
23 /**
24  * @file
25  * Common code for Vorbis I encoder and decoder
26  * @author Denes Balatoni ( dbalatoni programozo hu )
27  */
28 
29 #define BITSTREAM_READER_LE
30 #include "avcodec.h"
31 #include "get_bits.h"
32 
33 #include "vorbis.h"
34 
35 
36 /* Helper functions */
37 
38 // x^(1/n)
39 unsigned int ff_vorbis_nth_root(unsigned int x, unsigned int n)
40 {
41  unsigned int ret = 0, i, j;
42 
43  do {
44  ++ret;
45  for (i = 0, j = ret; i < n - 1; i++)
46  j *= ret;
47  } while (j <= x);
48 
49  return ret - 1;
50 }
51 
52 // Generate vlc codes from vorbis huffman code lengths
53 
54 // the two bits[p] > 32 checks should be redundant, all calling code should
55 // already ensure that, but since it allows overwriting the stack it seems
56 // reasonable to check redundantly.
57 int ff_vorbis_len2vlc(uint8_t *bits, uint32_t *codes, unsigned num)
58 {
59  uint32_t exit_at_level[33] = { 404 };
60 
61  unsigned i, j, p, code;
62 
63 #ifdef DEBUG
64  GetBitContext gb;
65 #endif
66 
67  for (p = 0; (bits[p] == 0) && (p < num); ++p)
68  ;
69  if (p == num)
70  return 0;
71 
72  codes[p] = 0;
73  if (bits[p] > 32)
74  return 1;
75  for (i = 0; i < bits[p]; ++i)
76  exit_at_level[i+1] = 1 << i;
77 
78 #ifdef DEBUG
79  av_log(NULL, AV_LOG_INFO, " %u. of %u code len %d code %d - ", p, num, bits[p], codes[p]);
80  init_get_bits(&gb, (uint8_t *)&codes[p], bits[p]);
81  for (i = 0; i < bits[p]; ++i)
82  av_log(NULL, AV_LOG_INFO, "%s", get_bits1(&gb) ? "1" : "0");
83  av_log(NULL, AV_LOG_INFO, "\n");
84 #endif
85 
86  ++p;
87 
88  for (; p < num; ++p) {
89  if (bits[p] > 32)
90  return 1;
91  if (bits[p] == 0)
92  continue;
93  // find corresponding exit(node which the tree can grow further from)
94  for (i = bits[p]; i > 0; --i)
95  if (exit_at_level[i])
96  break;
97  if (!i) // overspecified tree
98  return 1;
99  code = exit_at_level[i];
100  exit_at_level[i] = 0;
101  // construct code (append 0s to end) and introduce new exits
102  for (j = i + 1 ;j <= bits[p]; ++j)
103  exit_at_level[j] = code + (1 << (j - 1));
104  codes[p] = code;
105 
106 #ifdef DEBUG
107  av_log(NULL, AV_LOG_INFO, " %d. code len %d code %d - ", p, bits[p], codes[p]);
108  init_get_bits(&gb, (uint8_t *)&codes[p], bits[p]);
109  for (i = 0; i < bits[p]; ++i)
110  av_log(NULL, AV_LOG_INFO, "%s", get_bits1(&gb) ? "1" : "0");
111  av_log(NULL, AV_LOG_INFO, "\n");
112 #endif
113 
114  }
115 
116  //no exits should be left (underspecified tree - ie. unused valid vlcs - not allowed by SPEC)
117  for (p = 1; p < 33; p++)
118  if (exit_at_level[p])
119  return 1;
120 
121  return 0;
122 }
123 
126 {
127  int i;
128  list[0].sort = 0;
129  list[1].sort = 1;
130  for (i = 2; i < values; i++) {
131  int j;
132  list[i].low = 0;
133  list[i].high = 1;
134  list[i].sort = i;
135  for (j = 2; j < i; j++) {
136  int tmp = list[j].x;
137  if (tmp < list[i].x) {
138  if (tmp > list[list[i].low].x)
139  list[i].low = j;
140  } else {
141  if (tmp < list[list[i].high].x)
142  list[i].high = j;
143  }
144  }
145  }
146  for (i = 0; i < values - 1; i++) {
147  int j;
148  for (j = i + 1; j < values; j++) {
149  if (list[i].x == list[j].x) {
150  av_log(avctx, AV_LOG_ERROR,
151  "Duplicate value found in floor 1 X coordinates\n");
152  return AVERROR_INVALIDDATA;
153  }
154  if (list[list[i].sort].x > list[list[j].sort].x) {
155  int tmp = list[i].sort;
156  list[i].sort = list[j].sort;
157  list[j].sort = tmp;
158  }
159  }
160  }
161  return 0;
162 }
163 
164 static inline void render_line_unrolled(intptr_t x, int y, int x1,
165  intptr_t sy, int ady, int adx,
166  float *buf)
167 {
168  int err = -adx;
169  x -= x1 - 1;
170  buf += x1 - 1;
171  while (++x < 0) {
172  err += ady;
173  if (err >= 0) {
174  err += ady - adx;
175  y += sy;
176  buf[x++] = ff_vorbis_floor1_inverse_db_table[av_clip_uint8(y)];
177  }
178  buf[x] = ff_vorbis_floor1_inverse_db_table[av_clip_uint8(y)];
179  }
180  if (x <= 0) {
181  if (err + ady >= 0)
182  y += sy;
183  buf[x] = ff_vorbis_floor1_inverse_db_table[av_clip_uint8(y)];
184  }
185 }
186 
187 static void render_line(int x0, int y0, int x1, int y1, float *buf)
188 {
189  int dy = y1 - y0;
190  int adx = x1 - x0;
191  int ady = FFABS(dy);
192  int sy = dy < 0 ? -1 : 1;
193  buf[x0] = ff_vorbis_floor1_inverse_db_table[av_clip_uint8(y0)];
194  if (ady*2 <= adx) { // optimized common case
195  render_line_unrolled(x0, y0, x1, sy, ady, adx, buf);
196  } else {
197  int base = dy / adx;
198  int x = x0;
199  int y = y0;
200  int err = -adx;
201  ady -= FFABS(base) * adx;
202  while (++x < x1) {
203  y += base;
204  err += ady;
205  if (err >= 0) {
206  err -= adx;
207  y += sy;
208  }
209  buf[x] = ff_vorbis_floor1_inverse_db_table[av_clip_uint8(y)];
210  }
211  }
212 }
213 
215  uint16_t *y_list, int *flag,
216  int multiplier, float *out, int samples)
217 {
218  int lx, ly, i;
219  lx = 0;
220  ly = y_list[0] * multiplier;
221  for (i = 1; i < values; i++) {
222  int pos = list[i].sort;
223  if (flag[pos]) {
224  int x1 = list[pos].x;
225  int y1 = y_list[pos] * multiplier;
226  if (lx < samples)
227  render_line(lx, ly, FFMIN(x1,samples), y1, out);
228  lx = x1;
229  ly = y1;
230  }
231  if (lx >= samples)
232  break;
233  }
234  if (lx < samples)
235  render_line(lx, ly, samples, ly, out);
236 }
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:59
unsigned int ff_vorbis_nth_root(unsigned int x, unsigned int n)
Definition: vorbis.c:39
y1
Definition: lab5.m:33
const float ff_vorbis_floor1_inverse_db_table[256]
Definition: vorbis_data.c:2123
x1
Definition: genspecsines3.m:7
uint16_t sort
Definition: vorbis.h:34
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFilterBuffer structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining list
uint8_t bits
Definition: crc.c:216
uint8_t
static void render_line(int x0, int y0, int x1, int y1, float *buf)
Definition: vorbis.c:187
bitstream reader API header.
Discrete Time axis x
uint16_t x
Definition: vorbis.h:33
void av_log(void *avcl, int level, const char *fmt,...)
Definition: log.c:246
external API header
#define FFMIN(a, b)
Definition: common.h:58
ret
Definition: avfilter.c:821
int ff_vorbis_len2vlc(uint8_t *bits, uint32_t *codes, unsigned num)
Definition: vorbis.c:57
#define FFABS(a)
Definition: common.h:53
NULL
Definition: eval.c:55
or the Software in violation of any applicable export control laws in any jurisdiction Except as provided by mandatorily applicable UPF has no obligation to provide you with source code to the Software In the event Software contains any source code
main external API structure.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:148
uint16_t low
Definition: vorbis.h:35
void * buf
Definition: avisynth_c.h:594
static unsigned int get_bits1(GetBitContext *s)
Definition: get_bits.h:273
synthesis window for stochastic i
uint16_t high
Definition: vorbis.h:36
static int init_get_bits(GetBitContext *s, const uint8_t *buffer, int bit_size)
Initialize GetBitContext.
Definition: get_bits.h:379
function y
Definition: D.m:1
static void render_line_unrolled(intptr_t x, int y, int x1, intptr_t sy, int ady, int adx, float *buf)
Definition: vorbis.c:164
void ff_vorbis_floor1_render_list(vorbis_floor1_entry *list, int values, uint16_t *y_list, int *flag, int multiplier, float *out, int samples)
Definition: vorbis.c:214
#define AV_LOG_INFO
Definition: log.h:156
Filter the word “frame” indicates either a video frame or a group of audio samples
uint8_t pi<< 24) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_U8, uint8_t,(*(const uint8_t *) pi-0x80)*(1.0f/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_U8, uint8_t,(*(const uint8_t *) pi-0x80)*(1.0/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S16, int16_t,(*(const int16_t *) pi >> 8)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S16, int16_t,*(const int16_t *) pi *(1.0f/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S16, int16_t,*(const int16_t *) pi *(1.0/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S32, int32_t,(*(const int32_t *) pi >> 24)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S32, int32_t,*(const int32_t *) pi *(1.0f/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S32, int32_t,*(const int32_t *) pi *(1.0/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_FLT, float, av_clip_uint8(lrintf(*(const float *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_FLT, float, av_clip_int16(lrintf(*(const float *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_FLT, float, av_clipl_int32(llrintf(*(const float *) pi *(1U<< 31)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_DBL, double, av_clip_uint8(lrint(*(const double *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_DBL, double, av_clip_int16(lrint(*(const double *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_DBL, double, av_clipl_int32(llrint(*(const double *) pi *(1U<< 31))))#define SET_CONV_FUNC_GROUP(ofmt, ifmt) static void set_generic_function(AudioConvert *ac){}void ff_audio_convert_free(AudioConvert **ac){if(!*ac) return;ff_dither_free(&(*ac) ->dc);av_freep(ac);}AudioConvert *ff_audio_convert_alloc(AVAudioResampleContext *avr, enum AVSampleFormat out_fmt, enum AVSampleFormat in_fmt, int channels, int sample_rate, int apply_map){AudioConvert *ac;int in_planar, out_planar;ac=av_mallocz(sizeof(*ac));if(!ac) return NULL;ac->avr=avr;ac->out_fmt=out_fmt;ac->in_fmt=in_fmt;ac->channels=channels;ac->apply_map=apply_map;if(avr->dither_method!=AV_RESAMPLE_DITHER_NONE &&av_get_packed_sample_fmt(out_fmt)==AV_SAMPLE_FMT_S16 &&av_get_bytes_per_sample(in_fmt) > 2){ac->dc=ff_dither_alloc(avr, out_fmt, in_fmt, channels, sample_rate, apply_map);if(!ac->dc){av_free(ac);return NULL;}return ac;}in_planar=av_sample_fmt_is_planar(in_fmt);out_planar=av_sample_fmt_is_planar(out_fmt);if(in_planar==out_planar){ac->func_type=CONV_FUNC_TYPE_FLAT;ac->planes=in_planar?ac->channels:1;}else if(in_planar) ac->func_type=CONV_FUNC_TYPE_INTERLEAVE;else ac->func_type=CONV_FUNC_TYPE_DEINTERLEAVE;set_generic_function(ac);if(ARCH_ARM) ff_audio_convert_init_arm(ac);if(ARCH_X86) ff_audio_convert_init_x86(ac);return ac;}int ff_audio_convert(AudioConvert *ac, AudioData *out, AudioData *in){int use_generic=1;int len=in->nb_samples;int p;if(ac->dc){av_dlog(ac->avr,"%d samples - audio_convert: %s to %s (dithered)\n", len, av_get_sample_fmt_name(ac->in_fmt), av_get_sample_fmt_name(ac->out_fmt));return ff_convert_dither(ac-> out
Definition: vorbis.h:32
these buffered frames must be flushed immediately if a new input produces new the filter must not call request_frame to get more It must just process the frame or queue it The task of requesting more frames is left to the filter s request_frame method or the application If a filter has several the filter must be ready for frames arriving randomly on any input any filter with several inputs will most likely require some kind of queuing mechanism It is perfectly acceptable to have a limited queue and to drop frames when the inputs are too unbalanced request_frame This method is called when a frame is wanted on an output For an it should directly call filter_frame on the corresponding output For a if there are queued frames already one of these frames should be pushed If the filter should request a frame on one of its repeatedly until at least one frame has been pushed Return values
int ff_vorbis_ready_floor1_list(AVCodecContext *avctx, vorbis_floor1_entry *list, int values)
Definition: vorbis.c:124