35 #define BITSTREAM_READER_LE 46 #define V_MAX_VLCS (1 << 16) 47 #define V_MAX_PARTITIONS (1 << 20) 61 struct vorbis_context_s;
87 int16_t subclass_books[16][8];
102 int16_t books[64][8];
125 typedef struct vorbis_context_s {
139 uint32_t blocksize[2];
160 (13.1f * atan(0.00074f * (x)) + 2.24f * atan(1.85e-8f * (x) * (x)) + 1e-4f * (x)) 162 static const char idx_err_str[] =
"Index value %d out of range (0 - %d) for %s at %s:%i\n";
163 #define VALIDATE_INDEX(idx, limit) \ 165 av_log(vc->avctx, AV_LOG_ERROR,\ 167 (int)(idx), (int)(limit - 1), #idx, __FILE__, __LINE__);\ 168 return AVERROR_INVALIDDATA;\ 170 #define GET_VALIDATED_INDEX(idx, bits, limit) \ 172 idx = get_bits(gb, bits);\ 173 VALIDATE_INDEX(idx, limit)\ 178 double mant = val & 0x1fffff;
179 long exp = (val & 0x7fe00000
L) >> 21;
180 if (val & 0x80000000)
182 return ldexp(mant, exp - 20 - 768);
242 uint32_t *tmp_vlc_codes =
NULL;
244 uint16_t *codebook_multiplicands =
NULL;
256 !tmp_vlc_bits || !tmp_vlc_codes || !codebook_multiplicands) {
263 unsigned ordered, t, entries, used_entries = 0;
269 " %u. Codebook setup data corrupt.\n", cb);
277 " %u. Codebook's dimension is invalid (%d).\n",
285 " %u. Codebook has too many entries (%u).\n",
293 ff_dlog(
NULL,
" codebook_dimensions %d, codebook_entries %u\n",
306 for (ce = 0; ce < entries; ++ce) {
309 tmp_vlc_bits[ce] =
get_bits(gb, 5) + 1;
312 tmp_vlc_bits[ce] = 0;
317 used_entries = entries;
318 for (ce = 0; ce < entries; ++ce)
319 tmp_vlc_bits[ce] =
get_bits(gb, 5) + 1;
322 unsigned current_entry = 0;
323 unsigned current_length =
get_bits(gb, 5) + 1;
325 ff_dlog(
NULL,
" ordered, current length: %u\n", current_length);
327 used_entries = entries;
328 for (; current_entry < used_entries && current_length <= 32; ++current_length) {
337 for (i = current_entry; i < number+current_entry; ++
i)
338 if (i < used_entries)
339 tmp_vlc_bits[
i] = current_length;
341 current_entry+=number;
343 if (current_entry>used_entries) {
363 unsigned codebook_value_bits =
get_bits(gb, 4) + 1;
364 unsigned codebook_sequence_p =
get_bits1(gb);
366 ff_dlog(
NULL,
" We expect %d numbers for building the codevectors. \n",
367 codebook_lookup_values);
369 codebook_delta_value, codebook_minimum_value);
371 for (i = 0; i < codebook_lookup_values; ++
i) {
372 codebook_multiplicands[
i] =
get_bits(gb, codebook_value_bits);
374 ff_dlog(
NULL,
" multiplicands*delta+minmum : %e \n",
375 (
float)codebook_multiplicands[i] * codebook_delta_value + codebook_minimum_value);
376 ff_dlog(
NULL,
" multiplicand %u\n", codebook_multiplicands[i]);
391 for (j = 0, i = 0; i < entries; ++
i) {
394 if (tmp_vlc_bits[i]) {
396 unsigned lookup_offset =
i;
400 for (k = 0; k <
dim; ++k) {
401 unsigned multiplicand_offset = lookup_offset % codebook_lookup_values;
402 codebook_setup->
codevectors[j * dim + k] = codebook_multiplicands[multiplicand_offset] * codebook_delta_value + codebook_minimum_value + last;
403 if (codebook_sequence_p)
405 lookup_offset/=codebook_lookup_values;
407 tmp_vlc_bits[j] = tmp_vlc_bits[
i];
409 ff_dlog(vc->
avctx,
"real lookup offset %u, vector: ", j);
410 for (k = 0; k <
dim; ++k)
418 if (j != used_entries) {
423 entries = used_entries;
437 for (t = 0; t < entries; ++t)
438 if (tmp_vlc_bits[t] >= codebook_setup->
maxdepth)
439 codebook_setup->
maxdepth = tmp_vlc_bits[t];
449 entries, tmp_vlc_bits,
sizeof(*tmp_vlc_bits),
450 sizeof(*tmp_vlc_bits), tmp_vlc_codes,
451 sizeof(*tmp_vlc_codes),
sizeof(*tmp_vlc_codes),
460 av_free(codebook_multiplicands);
467 av_free(codebook_multiplicands);
476 unsigned i, vorbis_time_count =
get_bits(gb, 6) + 1;
478 for (i = 0; i < vorbis_time_count; ++
i) {
479 unsigned vorbis_tdtransform =
get_bits(gb, 16);
481 ff_dlog(
NULL,
" Vorbis time domain transform %u: %u\n",
482 vorbis_time_count, vorbis_tdtransform);
484 if (vorbis_tdtransform) {
518 int maximum_class = -1;
519 unsigned rangebits, rangemax, floor1_values = 2;
533 ff_dlog(
NULL,
" %d. floor %d partition class %d \n",
538 ff_dlog(
NULL,
" maximum class %d \n", maximum_class);
540 for (j = 0; j <= maximum_class; ++j) {
544 ff_dlog(
NULL,
" %d floor %d class dim: %d subclasses %d \n", i, j,
578 "A rangebits value of 0 is not compliant with the Vorbis I specification.\n");
581 rangemax = (1 << rangebits);
584 "Floor value is too large for blocksize: %u (%"PRIu32
")\n",
595 ff_dlog(
NULL,
" %u. floor1 Y coord. %d\n", floor1_values,
607 unsigned max_codebook_dim = 0;
624 "Floor 0 bark map size is 0.\n");
704 unsigned high_bits, low_bits;
714 if (res_setup->
begin>res_setup->
end ||
717 "partition out of bounds: type, begin, end, size, blocksize: %"PRIu16
", %"PRIu32
", %"PRIu32
", %u, %"PRIu32
"\n",
734 ff_dlog(
NULL,
" begin %"PRIu32
" end %"PRIu32
" part.size %u classif.s %"PRIu8
" classbook %"PRIu8
"\n",
743 cascade[j] = (high_bits << 3) + low_bits;
750 for (k = 0; k < 8; ++k) {
751 if (cascade[j]&(1 << k)) {
754 ff_dlog(
NULL,
" %u class cascade depth %u book: %d\n",
755 j, k, res_setup->
books[j][k]);
760 res_setup->
books[j][k] = -1;
786 av_log(vc->
avctx,
AV_LOG_ERROR,
"Other mappings than type 0 are not compliant with the Vorbis I specification. \n");
799 "Square polar channel mapping with less than two channels is not compliant with the Vorbis I specification.\n");
805 sizeof(*mapping_setup->
angle));
825 if (mapping_setup->
submaps>1) {
827 sizeof(*mapping_setup->
mux));
828 if (!mapping_setup->
mux)
835 for (j = 0; j < mapping_setup->
submaps; ++j) {
840 ff_dlog(
NULL,
" %u mapping %u submap : floor %d, residue %d\n", i, j,
858 for (blockflag = 0; blockflag < 2; ++blockflag) {
860 floors[floor_number].
data.
t0.
map[blockflag] =
862 if (!floors[floor_number].
data.t0.map[blockflag])
865 map = floors[floor_number].
data.
t0.
map[blockflag];
866 vf = &floors[floor_number].
data.
t0;
868 for (idx = 0; idx < n; ++idx) {
869 map[idx] =
floor(
BARK((vf->rate * idx) / (2.0f * n)) *
870 (vf->bark_map_size /
BARK(vf->rate / 2.0f)));
871 if (vf->bark_map_size-1 < map[idx])
872 map[idx] = vf->bark_map_size - 1;
875 vf->map_size[blockflag] = n;
878 for (idx = 0; idx <= n; ++idx) {
879 ff_dlog(
NULL,
"floor0 map: map at pos %d is %"PRId32
"\n", idx, map[idx]);
905 ff_dlog(
NULL,
" %u mode: blockflag %d, windowtype %d, transformtype %d, mapping %d\n",
988 if (bl0 > 13 || bl0 < 6 || bl1 > 13 || bl1 < 6 || bl1 < bl0) {
1015 ff_dlog(
NULL,
" vorbis version %"PRIu32
" \n audio_channels %"PRIu8
" \n audio_samplerate %"PRIu32
" \n bitrate_max %"PRIu32
" \n bitrate_nom %"PRIu32
" \n bitrate_min %"PRIu32
" \n blk_0 %"PRIu32
" blk_1 %"PRIu32
" \n ",
1035 const uint8_t *header_start[3];
1057 if (hdr_type != 1) {
1069 if (hdr_type != 5) {
1099 float *lsp = vf->lsp;
1104 if (!vf->amplitude_bits)
1108 if (amplitude > 0) {
1110 unsigned idx, lsp_len = 0;
1114 if (book_idx >= vf->num_books) {
1118 ff_dlog(
NULL,
"floor0 dec: booknumber: %u\n", book_idx);
1119 codebook = vc->
codebooks[vf->book_list[book_idx]];
1124 while (lsp_len<vf->order) {
1135 ff_dlog(
NULL,
"floor0 dec: vector offset: %d\n", vec_off);
1137 for (idx = 0; idx < codebook.
dimensions; ++idx)
1138 lsp[lsp_len+idx] = codebook.
codevectors[vec_off+idx] + last;
1139 last = lsp[lsp_len+idx-1];
1146 for (idx = 0; idx < lsp_len; ++idx)
1147 ff_dlog(
NULL,
"floor0 dec: coeff at %d is %f\n", idx, lsp[idx]);
1153 int order = vf->order;
1154 float wstep =
M_PI / vf->bark_map_size;
1156 for (i = 0; i < order; i++)
1157 lsp[i] = 2.0
f * cos(lsp[i]);
1159 ff_dlog(
NULL,
"floor0 synth: map_size = %"PRIu32
"; m = %d; wstep = %f\n",
1160 vf->map_size[blockflag], order, wstep);
1163 while (i < vf->map_size[blockflag]) {
1164 int j, iter_cond = vf->map[blockflag][
i];
1167 float two_cos_w = 2.0f * cos(wstep * iter_cond);
1170 for (j = 0; j + 1 < order; j += 2) {
1171 q *= lsp[j] - two_cos_w;
1172 p *= lsp[j + 1] - two_cos_w;
1175 p *= p * (2.0f - two_cos_w);
1176 q *= q * (2.0f + two_cos_w);
1178 q *= two_cos_w-lsp[j];
1181 p *= p * (4.f - two_cos_w * two_cos_w);
1189 q =
exp((((amplitude*vf->amplitude_offset) /
1190 (((1ULL << vf->amplitude_bits) - 1) * sqrt(p + q)))
1191 - vf->amplitude_offset) * .11512925f);
1196 }
while (vf->map[blockflag][i] == iter_cond);
1214 uint16_t range_v[4] = { 256, 128, 86, 64 };
1215 unsigned range = range_v[vf->multiplier - 1];
1216 uint16_t floor1_Y[258];
1217 uint16_t floor1_Y_final[258];
1218 int floor1_flag[258];
1219 unsigned partition_class, cdim, cbits, csub, cval,
offset,
i, j;
1220 int book, adx, ady, dy, off, predicted, err;
1231 ff_dlog(
NULL,
"floor 0 Y %d floor 1 Y %d \n", floor1_Y[0], floor1_Y[1]);
1234 for (i = 0; i < vf->partitions; ++
i) {
1235 partition_class = vf->partition_class[
i];
1236 cdim = vf->class_dimensions[partition_class];
1237 cbits = vf->class_subclasses[partition_class];
1238 csub = (1 << cbits) - 1;
1247 for (j = 0; j < cdim; ++j) {
1248 book = vf->subclass_books[partition_class][cval & csub];
1250 ff_dlog(
NULL,
"book %d Cbits %u cval %u bits:%d\n",
1253 cval = cval >> cbits;
1259 floor1_Y[offset+j] = v;
1261 floor1_Y[offset+j] = 0;
1265 vf->list[offset+j].x, floor1_Y[offset+j]);
1274 floor1_Y_final[0] = floor1_Y[0];
1275 floor1_Y_final[1] = floor1_Y[1];
1277 for (i = 2; i < vf->x_list_dim; ++
i) {
1278 unsigned val, highroom, lowroom, room, high_neigh_offs, low_neigh_offs;
1280 low_neigh_offs = vf->list[
i].low;
1281 high_neigh_offs = vf->list[
i].high;
1282 dy = floor1_Y_final[high_neigh_offs] - floor1_Y_final[low_neigh_offs];
1283 adx = vf->list[high_neigh_offs].x - vf->list[low_neigh_offs].x;
1285 err = ady * (vf->list[
i].x - vf->list[low_neigh_offs].x);
1288 predicted = floor1_Y_final[low_neigh_offs] - off;
1290 predicted = floor1_Y_final[low_neigh_offs] + off;
1294 highroom = range-predicted;
1295 lowroom = predicted;
1296 if (highroom < lowroom) {
1297 room = highroom * 2;
1302 floor1_flag[low_neigh_offs] = 1;
1303 floor1_flag[high_neigh_offs] = 1;
1306 if (highroom > lowroom) {
1323 ff_dlog(
NULL,
" Decoded floor(%d) = %u / val %u\n",
1324 vf->list[i].x, floor1_Y_final[i], val);
1340 int partition_count,
1349 for (p = 0, j = 0; j < ch_used; ++j) {
1350 if (!do_not_decode[j]) {
1360 "Invalid vlc code decoding %d channel.", j);
1365 for (i = partition_count + c_p_c - 1; i >= partition_count; i--) {
1366 if (i < ptns_to_read)
1370 for (i = partition_count + c_p_c - 1; i >= partition_count; i--) {
1371 temp2 = (((uint64_t)temp) * inverse_class) >> 32;
1373 if (i < ptns_to_read)
1397 unsigned pass, ch_used,
i, j, k, l;
1398 unsigned max_output = (ch - 1) * vlen;
1400 int libvorbis_bug = 0;
1403 for (j = 1; j < ch; ++j)
1404 do_not_decode[0] &= do_not_decode[j];
1405 if (do_not_decode[0])
1408 max_output += vr->
end / ch;
1411 max_output += vr->
end;
1414 if (max_output > ch_left * vlen) {
1415 if (max_output <= ch_left * vlen + vr->partition_size*ch_used/ch) {
1424 ff_dlog(
NULL,
" residue type 0/1/2 decode begin, ch: %d cpc %d \n", ch, c_p_c);
1427 int voffset, partition_count, j_times_ptns_to_read;
1429 voffset = vr->
begin;
1430 for (partition_count = 0; partition_count < ptns_to_read;) {
1432 int ret =
setup_classifs(vc, vr, do_not_decode, ch_used, partition_count, ptns_to_read);
1436 for (i = 0; (i < c_p_c) && (partition_count < ptns_to_read); ++
i) {
1437 for (j_times_ptns_to_read = 0, j = 0; j < ch_used; ++j) {
1440 if (!do_not_decode[j]) {
1441 unsigned vqclass = classifs[j_times_ptns_to_read + partition_count];
1452 voffs = voffset+j*vlen;
1453 for (k = 0; k <
step; ++k) {
1458 for (l = 0; l <
dim; ++l)
1459 vec[voffs + k + l * step] += codebook.
codevectors[coffs + l];
1461 }
else if (vr_type == 1) {
1462 voffs = voffset + j * vlen;
1463 for (k = 0; k <
step; ++k) {
1468 for (l = 0; l <
dim; ++l, ++voffs) {
1471 ff_dlog(
NULL,
" pass %d offs: %d curr: %f change: %f cv offs.: %d \n",
1472 pass, voffs, vec[voffs], codebook.
codevectors[coffs+l], coffs);
1475 }
else if (vr_type == 2 && ch == 2 && (voffset & 1) == 0 && (dim & 1) == 0) {
1476 voffs = voffset >> 1;
1479 for (k = 0; k <
step; ++k) {
1485 vec[voffs + k + vlen] += codebook.
codevectors[coffs + 1];
1487 }
else if (dim == 4) {
1488 for (k = 0; k <
step; ++k, voffs += 2) {
1494 vec[voffs + 1 ] += codebook.
codevectors[coffs + 2];
1495 vec[voffs + vlen ] += codebook.
codevectors[coffs + 1];
1496 vec[voffs + vlen + 1] += codebook.
codevectors[coffs + 3];
1499 for (k = 0; k <
step; ++k) {
1504 for (l = 0; l <
dim; l += 2, voffs++) {
1506 vec[voffs + vlen] += codebook.
codevectors[coffs + l + 1];
1508 ff_dlog(
NULL,
" pass %d offs: %d curr: %f change: %f cv offs.: %d+%d \n",
1509 pass, voffset / ch + (voffs % ch) * vlen,
1510 vec[voffset / ch + (voffs % ch) * vlen],
1515 }
else if (vr_type == 2) {
1516 unsigned voffs_div = ch == 1 ? voffset :
FASTDIV(voffset, ch);
1517 unsigned voffs_mod = voffset - voffs_div * ch;
1519 for (k = 0; k <
step; ++k) {
1524 for (l = 0; l <
dim; ++l) {
1525 vec[voffs_div + voffs_mod * vlen] +=
1528 ff_dlog(
NULL,
" pass %d offs: %d curr: %f change: %f cv offs.: %d+%d \n",
1529 pass, voffs_div + voffs_mod * vlen,
1530 vec[voffs_div + voffs_mod * vlen],
1533 if (++voffs_mod == ch) {
1542 j_times_ptns_to_read += ptns_to_read;
1548 if (libvorbis_bug && !pass) {
1549 for (j = 0; j < ch_used; ++j) {
1550 if (!do_not_decode[j]) {
1563 float *vec,
unsigned vlen,
1568 else if (vr->
type == 1)
1570 else if (vr->
type == 0)
1581 for (i = 0; i < blocksize; i++) {
1584 ang[
i] = mag[
i] - ang[
i];
1586 float temp = ang[
i];
1594 float temp = ang[
i];
1609 unsigned mode_number, blockflag, blocksize;
1616 unsigned res_num = 0;
1634 ff_dlog(
NULL,
" Mode number: %u , mapping: %d , blocktype %d\n", mode_number,
1639 vlen = blocksize / 2;
1642 if (previous_window < 0)
1643 previous_window = code>>1;
1644 }
else if (previous_window < 0)
1645 previous_window = 0;
1647 memset(ch_res_ptr, 0,
sizeof(
float) * vc->
audio_channels * vlen);
1649 memset(floor_ptr[i], 0, vlen *
sizeof(floor_ptr[0][0]));
1662 ret = floor->
decode(vc, &floor->
data, floor_ptr[i]);
1668 no_residue[
i] =
ret;
1674 if (!(no_residue[mapping->
magnitude[i]] & no_residue[mapping->
angle[i]])) {
1676 no_residue[mapping->
angle[
i]] = 0;
1682 for (i = 0; i < mapping->
submaps; ++
i) {
1688 if ((mapping->
submaps == 1) || (i == mapping->
mux[j])) {
1689 res_chan[j] = res_num;
1690 if (no_residue[j]) {
1691 do_not_decode[ch] = 1;
1693 do_not_decode[ch] = 0;
1710 ch_res_ptr += ch * vlen;
1729 mdct = &vc->
mdct[blockflag];
1733 vc->
fdsp->
vector_fmul(floor_ptr[j], floor_ptr[j], ch_res_ptr, blocksize / 2);
1734 mdct->
imdct_half(mdct, ch_res_ptr, floor_ptr[j]);
1739 retlen = (blocksize + vc->
blocksize[previous_window]) / 4;
1744 float *saved = vc->
saved + j * bs1 / 4;
1745 float *
ret = floor_ptr[j];
1746 float *buf = residue;
1747 const float *
win = vc->
win[blockflag & previous_window];
1749 if (blockflag == previous_window) {
1751 }
else if (blockflag > previous_window) {
1753 memcpy(ret+bs0/2, buf+bs0/4, ((bs1-bs0)/4) *
sizeof(
float));
1755 memcpy(ret, saved, ((bs1 - bs0) / 4) *
sizeof(
float));
1758 memcpy(saved, buf + blocksize / 4, blocksize / 4 *
sizeof(
float));
1768 int *got_frame_ptr,
AVPacket *avpkt)
1771 int buf_size = avpkt->
size;
1775 float *channel_ptrs[255];
1780 if (*buf == 1 && buf_size > 7) {
1801 if (*buf == 3 && buf_size > 7) {
1851 ff_dlog(
NULL,
"parsed %d bytes %d bits, returned %d samples (*ch*bits) \n",
1877 sizeof(*vc->
saved));
#define FF_CODEC_CAP_INIT_CLEANUP
The codec allows calling the close function for deallocation even if the init function returned a fai...
vorbis_codebook * codebooks
struct vorbis_floor1_s vorbis_floor1
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
unsigned int ff_vorbis_nth_root(unsigned int x, unsigned int n)
static const unsigned codebook[256][2]
static int vorbis_parse_setup_hdr_floors(vorbis_context *vc)
This structure describes decoded (raw) audio or video data.
ptrdiff_t const GLvoid * data
static void flush(AVCodecContext *avctx)
void ff_vorbis_inverse_coupling(float *mag, float *ang, intptr_t blocksize)
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
int(* vorbis_floor_decode_func)(struct vorbis_context_s *, vorbis_floor_data *, float *)
static float win(SuperEqualizerContext *s, float n, int N)
static av_cold int vorbis_decode_close(AVCodecContext *avctx)
static av_cold int init(AVCodecContext *avctx)
#define AV_CODEC_CAP_CHANNEL_CONF
Codec should fill in channel configuration and samplerate instead of container.
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
static const char idx_err_str[]
uint8_t class_subclasses[16]
static void error(const char *err)
static av_always_inline int vorbis_residue_decode_internal(vorbis_context *vc, vorbis_residue *vr, unsigned ch, uint8_t *do_not_decode, float *vec, unsigned vlen, unsigned ch_left, int vr_type)
static void decode(AVCodecContext *dec_ctx, AVPacket *pkt, AVFrame *frame, FILE *outfile)
uint32_t audio_samplerate
static __device__ float floor(float a)
#define av_assert0(cond)
assert() equivalent, that is always enabled.
static double cb(void *priv, double x, double y)
const uint32_t ff_inverse[257]
enum AVSampleFormat sample_fmt
audio sample format
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf offset
static int vorbis_floor0_decode(vorbis_context *vc, vorbis_floor_data *vfu, float *vec)
void(* vector_fmul)(float *dst, const float *src0, const float *src1, int len)
Calculate the entry wise product of two vectors of floats and store the result in a vector of floats...
#define VALIDATE_INDEX(idx, limit)
vorbis_residue * residues
uint8_t * extradata
some codecs need / can use extradata like Huffman tables.
void(* vorbis_inverse_coupling)(float *mag, float *ang, intptr_t blocksize)
static int get_bits_count(const GetBitContext *s)
bitstream reader API header.
int16_t subclass_books[16][8]
static uint64_t get_bits64(GetBitContext *s, int n)
Read 0-64 bits.
void(* vector_fmul_window)(float *dst, const float *src0, const float *src1, const float *win, int len)
Overlap/add with window function.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
av_cold AVFloatDSPContext * avpriv_float_dsp_alloc(int bit_exact)
Allocate a float DSP context.
#define init_vlc(vlc, nb_bits, nb_codes,bits, bits_wrap, bits_size,codes, codes_wrap, codes_size,flags)
static int create_map(vorbis_context *vc, unsigned floor_number)
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
av_cold void ff_vorbisdsp_init(VorbisDSPContext *dsp)
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
static int vorbis_floor1_decode(vorbis_context *vc, vorbis_floor_data *vfu, float *vec)
int flags
AV_CODEC_FLAG_*.
simple assert() macros that are a bit more flexible than ISO C assert().
const char * name
Name of the codec implementation.
AVCodec ff_vorbis_decoder
uint64_t channel_layout
Audio channel layout.
union vorbis_floor_u vorbis_floor_data
static int vorbis_parse_id_hdr(vorbis_context *vc)
#define GET_VALIDATED_INDEX(idx, bits, limit)
#define AV_CODEC_FLAG_BITEXACT
Use only bitexact stuff (except (I)DCT).
union vorbis_floor::vorbis_floor_u data
static void vorbis_free(vorbis_context *vc)
int ff_vorbis_len2vlc(uint8_t *bits, uint32_t *codes, unsigned num)
struct vorbis_floor0_s vorbis_floor0
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 For filters that do not use the this method is called when a frame is wanted on an output For a 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 or at least make progress towards producing a frame
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
int avpriv_split_xiph_headers(const uint8_t *extradata, int extradata_size, int first_header_size, const uint8_t *header_start[3], int header_len[3])
Split a single extradata buffer into the three headers that most Xiph codecs use. ...
static av_always_inline int get_vlc2(GetBitContext *s, VLC_TYPE(*table)[2], int bits, int max_depth)
Parse a vlc code.
uint8_t submap_residue[16]
static int vorbis_parse_setup_hdr_residues(vorbis_context *vc)
static int vorbis_parse_setup_hdr_mappings(vorbis_context *vc)
static av_always_inline int setup_classifs(vorbis_context *vc, vorbis_residue *vr, uint8_t *do_not_decode, unsigned ch_used, int partition_count, int ptns_to_read)
Libavcodec external API header.
AVSampleFormat
Audio sample formats.
static int vorbis_decode_frame(AVCodecContext *avctx, void *data, int *got_frame_ptr, AVPacket *avpkt)
int sample_rate
samples per second
static int init_get_bits8(GetBitContext *s, const uint8_t *buffer, int byte_size)
Initialize GetBitContext.
main external API structure.
const uint64_t ff_vorbis_channel_layouts[9]
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame.
static unsigned int get_bits1(GetBitContext *s)
vorbis_mapping * mappings
static const uint16_t channel_layouts[7]
static void skip_bits(GetBitContext *s, int n)
static int init_get_bits(GetBitContext *s, const uint8_t *buffer, int bit_size)
Initialize GetBitContext.
static int vorbis_parse_setup_hdr(vorbis_context *vc)
const VDPAUPixFmtMap * map
static unsigned int get_bits_long(GetBitContext *s, int n)
Read 0-32 bits.
void(* imdct_half)(struct FFTContext *s, FFTSample *output, const FFTSample *input)
const float *const ff_vorbis_vwin[8]
vorbis_floor1_entry * list
uint8_t class_dimensions[16]
void av_frame_unref(AVFrame *frame)
Unreference all the buffers referenced by frame and reset the frame fields.
and forward the test the status of outputs and forward it to the corresponding return FFERROR_NOT_READY If the filters stores internally one or a few frame for some it can consider them to be part of the FIFO and delay acknowledging a status change accordingly Example code
static float vorbisfloat2float(unsigned val)
static av_cold int vorbis_decode_init(AVCodecContext *avctx)
uint8_t class_masterbook[16]
common internal api header.
struct vorbis_floor::vorbis_floor_u::vorbis_floor1_s t1
uint8_t partition_class[32]
static int vorbis_residue_decode(vorbis_context *vc, vorbis_residue *vr, unsigned ch, uint8_t *do_not_decode, float *vec, unsigned vlen, unsigned ch_left)
vorbis_floor_decode_func decode
static int vorbis_parse_setup_hdr_tdtransforms(vorbis_context *vc)
static int vorbis_parse_setup_hdr_modes(vorbis_context *vc)
int channels
number of audio channels
VLC_TYPE(* table)[2]
code, bits
void ff_vorbis_floor1_render_list(vorbis_floor1_entry *list, int values, uint16_t *y_list, int *flag, int multiplier, float *out, int samples)
static enum AVSampleFormat sample_fmts[]
struct vorbis_floor::vorbis_floor_u::vorbis_floor0_s t0
#define av_malloc_array(a, b)
const uint8_t ff_vorbis_channel_layout_offsets[8][8]
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame 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 all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later.That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another.Frame references ownership and permissions
uint8_t ** extended_data
pointers to the data planes/channels.
static av_cold void vorbis_decode_flush(AVCodecContext *avctx)
static double val(void *priv, double ch)
This structure stores compressed data.
static int vorbis_parse_setup_hdr_codebooks(vorbis_context *vc)
void ff_free_vlc(VLC *vlc)
static int vorbis_parse_audio_packet(vorbis_context *vc, float **floor_ptr)
int nb_samples
number of audio samples (per channel) described by this frame
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() for allocating buffers and supports custom allocators.
FFmpeg currently uses a custom build this text attempts to document some of its obscure features and options Makefile the full command issued by make and its output will be shown on the screen DBG Preprocess x86 external assembler files to a dbg asm file in the object which then gets compiled Helps in developing those assembler files DESTDIR Destination directory for the install useful to prepare packages or install FFmpeg in cross environments GEN Set to ‘1’ to generate the missing or mismatched references Makefile builds all the libraries and the executables fate Run the fate test note that you must have installed it fate list List all fate regression test targets install Install headers
trying all byte sequences megabyte in length and selecting the best looking sequence will yield cases to try But a word about which is also called distortion Distortion can be quantified by almost any quality measurement one chooses the sum of squared differences is used but more complex methods that consider psychovisual effects can be used as well It makes no difference in this discussion First step
void * av_mallocz_array(size_t nmemb, size_t size)
int ff_vorbis_ready_floor1_list(AVCodecContext *avctx, vorbis_floor1_entry *list, int values)