Merge remote-tracking branch 'qatar/master'

* qatar/master:
  FATE: add tests for dfa
  mpegaudiodec: fix seeking.
  mpegaudiodec: fix compilation when testing the unchecked bitstream reader
  threads: add sysconf based number of CPUs detection
  threads: always include necessary headers for number of CPUs detection
  threads: default to automatic thread count detection
  Changelog: restore version <next> header
  cook: K&R formatting cosmetics

Conflicts:
	Changelog
	libavcodec/version.h

Merged-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
Michael Niedermayer
2011-12-31 23:24:53 +01:00
21 changed files with 617 additions and 392 deletions

View File

@@ -6,7 +6,6 @@ version next:
- v410 Quicktime Uncompressed 4:4:4 10-bit encoder and decoder
- SBaGen (SBG) binaural beats script demuxer
- OpenMG Audio muxer
- SMJPEG demuxer
- dv: add timecode to metadata
- thumbnail video filter
- XML output in ffprobe
@@ -14,6 +13,9 @@ version next:
- tinterlace video filter
- astreamsync audio filter
- amerge audio filter
- Indeo 4 decoder
- SMJPEG demuxer
- Automatic thread count based on detection number of (available) CPU cores
version 0.9:
@@ -150,8 +152,6 @@ easier to use. The changes are:
- Dxtory capture format decoder
- cellauto source
- Simple segmenting muxer
- Indeo 4 decoder
- SMJPEG demuxer
version 0.8:

2
configure vendored
View File

@@ -1229,6 +1229,7 @@ HAVE_LIST="
symver
symver_asm_label
symver_gnu_asm
sysconf
sysctl
sys_mman_h
sys_param_h
@@ -3008,6 +3009,7 @@ check_func setrlimit
check_func strerror_r
check_func strptime
check_func sched_getaffinity
check_func sysconf
check_func sysctl
check_func_headers conio.h kbhit
check_func_headers windows.h PeekNamedPipe

View File

@@ -165,7 +165,8 @@ static float rootpow2tab[127];
/*************** init functions ***************/
/* table generator */
static av_cold void init_pow2table(void){
static av_cold void init_pow2table(void)
{
int i;
for (i = -63; i < 64; i++) {
pow2tab[63 + i] = pow(2, i);
@@ -174,17 +175,18 @@ static av_cold void init_pow2table(void){
}
/* table generator */
static av_cold void init_gain_table(COOKContext *q) {
static av_cold void init_gain_table(COOKContext *q)
{
int i;
q->gain_size_factor = q->samples_per_channel / 8;
for (i=0 ; i<23 ; i++) {
for (i = 0; i < 23; i++)
q->gain_table[i] = pow(pow2tab[i + 52],
(1.0 / (double) q->gain_size_factor));
}
}
static av_cold int init_cook_vlc_tables(COOKContext *q) {
static av_cold int init_cook_vlc_tables(COOKContext *q)
{
int i, result;
result = 0;
@@ -213,7 +215,8 @@ static av_cold int init_cook_vlc_tables(COOKContext *q) {
return result;
}
static av_cold int init_cook_mlt(COOKContext *q) {
static av_cold int init_cook_mlt(COOKContext *q)
{
int j, ret;
int mlt_size = q->samples_per_channel;
@@ -242,7 +245,8 @@ static const float *maybe_reformat_buffer32 (COOKContext *q, const float *ptr, i
return ptr;
}
static av_cold void init_cplscales_table (COOKContext *q) {
static av_cold void init_cplscales_table(COOKContext *q)
{
int i;
for (i = 0; i < 5; i++)
q->cplscales[i] = maybe_reformat_buffer32(q, cplscales[i], (1 << (i + 2)) - 1);
@@ -273,8 +277,8 @@ static av_cold void init_cplscales_table (COOKContext *q) {
* @param out pointer to byte array of outdata
* @param bytes number of bytes
*/
static inline int decode_bytes(const uint8_t* inbuffer, uint8_t* out, int bytes){
static inline int decode_bytes(const uint8_t *inbuffer, uint8_t *out, int bytes)
{
static const uint32_t tab[4] = {
AV_BE2NE32C(0x37c511f2), AV_BE2NE32C(0xf237c511),
AV_BE2NE32C(0x11f237c5), AV_BE2NE32C(0xc511f237),
@@ -302,7 +306,6 @@ static inline int decode_bytes(const uint8_t* inbuffer, uint8_t* out, int bytes)
/**
* Cook uninit
*/
static av_cold int cook_decode_close(AVCodecContext *avctx)
{
int i;
@@ -317,15 +320,12 @@ static av_cold int cook_decode_close(AVCodecContext *avctx)
ff_mdct_end(&q->mdct_ctx);
/* Free the VLC tables. */
for (i=0 ; i<13 ; i++) {
for (i = 0; i < 13; i++)
free_vlc(&q->envelope_quant_index[i]);
}
for (i=0 ; i<7 ; i++) {
for (i = 0; i < 7; i++)
free_vlc(&q->sqvh[i]);
}
for (i=0 ; i<q->num_subpackets ; i++) {
for (i = 0; i < q->num_subpackets; i++)
free_vlc(&q->subpacket[i].ccpl);
}
av_log(avctx, AV_LOG_DEBUG, "Memory deallocated.\n");
@@ -338,12 +338,14 @@ static av_cold int cook_decode_close(AVCodecContext *avctx)
* @param gb pointer to the GetBitContext
* @param gaininfo array[9] of gain indexes
*/
static void decode_gain_info(GetBitContext *gb, int *gaininfo)
{
int i, n;
while (get_bits1(gb)) {}
while (get_bits1(gb)) {
/* NOTHING */
}
n = get_bits_count(gb) - 1; // amount of elements*2 to update
i = 0;
@@ -351,9 +353,11 @@ static void decode_gain_info(GetBitContext *gb, int *gaininfo)
int index = get_bits(gb, 3);
int gain = get_bits1(gb) ? get_bits(gb, 4) - 7 : -1;
while (i <= index) gaininfo[i++] = gain;
while (i <= index)
gaininfo[i++] = gain;
}
while (i <= 8) gaininfo[i++] = 0;
while (i <= 8)
gaininfo[i++] = 0;
}
/**
@@ -362,8 +366,9 @@ static void decode_gain_info(GetBitContext *gb, int *gaininfo)
* @param q pointer to the COOKContext
* @param quant_index_table pointer to the array
*/
static void decode_envelope(COOKContext *q, COOKSubpacket *p, int* quant_index_table) {
static void decode_envelope(COOKContext *q, COOKSubpacket *p,
int *quant_index_table)
{
int i, j, vlc_index;
quant_index_table[0] = get_bits(&q->gb, 6) - 6; // This is used later in categorize
@@ -374,9 +379,11 @@ static void decode_envelope(COOKContext *q, COOKSubpacket *p, int* quant_index_t
vlc_index -= p->js_subband_start;
} else {
vlc_index /= 2;
if(vlc_index < 1) vlc_index = 1;
if (vlc_index < 1)
vlc_index = 1;
}
if (vlc_index>13) vlc_index = 13; //the VLC tables >13 are identical to No. 13
if (vlc_index > 13)
vlc_index = 13; // the VLC tables >13 are identical to No. 13
j = get_vlc2(&q->gb, q->envelope_quant_index[vlc_index - 1].table,
q->envelope_quant_index[vlc_index - 1].bits, 2);
@@ -392,9 +399,9 @@ static void decode_envelope(COOKContext *q, COOKSubpacket *p, int* quant_index_t
* @param category pointer to the category array
* @param category_index pointer to the category_index array
*/
static void categorize(COOKContext *q, COOKSubpacket *p, int *quant_index_table,
int* category, int* category_index){
int *category, int *category_index)
{
int exp_idx, bias, tmpbias1, tmpbias2, bits_left, num_bits, index, v, i, j;
int exp_index2[102];
int exp_index1[102];
@@ -426,10 +433,9 @@ static void categorize(COOKContext *q, COOKSubpacket *p, int* quant_index_table,
index++;
num_bits += expbits_tab[exp_idx];
}
if(num_bits >= bits_left - 32){
if (num_bits >= bits_left - 32)
bias += i;
}
}
/* Calculate total number of bits. */
num_bits = 0;
@@ -454,7 +460,8 @@ static void categorize(COOKContext *q, COOKSubpacket *p, int* quant_index_table,
}
}
}
if(index==-1)break;
if (index == -1)
break;
tmp_categorize_array[tmp_categorize_array1_idx++] = index;
tmpbias1 -= expbits_tab[exp_index1[index]] -
expbits_tab[exp_index1[index] + 1];
@@ -471,7 +478,8 @@ static void categorize(COOKContext *q, COOKSubpacket *p, int* quant_index_table,
}
}
}
if(index == -1)break;
if (index == -1)
break;
tmp_categorize_array[--tmp_categorize_array2_idx] = index;
tmpbias2 -= expbits_tab[exp_index2[index]] -
expbits_tab[exp_index2[index] - 1];
@@ -484,7 +492,6 @@ static void categorize(COOKContext *q, COOKSubpacket *p, int* quant_index_table,
for (i = 0; i < p->numvector_size - 1; i++)
category_index[i] = tmp_categorize_array[tmp_categorize_array2_idx++];
}
@@ -495,14 +502,13 @@ static void categorize(COOKContext *q, COOKSubpacket *p, int* quant_index_table,
* @param category pointer to the category array
* @param category_index pointer to the category_index array
*/
static inline void expand_category(COOKContext *q, int *category,
int* category_index){
int *category_index)
{
int i;
for(i=0 ; i<q->num_vectors ; i++){
for (i = 0; i < q->num_vectors; i++)
++category[category_index[i]];
}
}
/**
* The real requantization of the mltcoefs
@@ -514,21 +520,23 @@ static inline void expand_category(COOKContext *q, int* category,
* @param subband_coef_sign signs of coefficients
* @param mlt_p pointer into the mlt buffer
*/
static void scalar_dequant_float(COOKContext *q, int index, int quant_index,
int *subband_coef_index, int *subband_coef_sign,
float* mlt_p){
float *mlt_p)
{
int i;
float f1;
for (i = 0; i < SUBBAND_SIZE; i++) {
if (subband_coef_index[i]) {
f1 = quant_centroid_tab[index][subband_coef_index[i]];
if (subband_coef_sign[i]) f1 = -f1;
if (subband_coef_sign[i])
f1 = -f1;
} else {
/* noise coding if subband_coef_index[i] == 0 */
f1 = dither_tab[index];
if (av_lfg_get(&q->random_state) < 0x80000000) f1 = -f1;
if (av_lfg_get(&q->random_state) < 0x80000000)
f1 = -f1;
}
mlt_p[i] = f1 * rootpow2tab[quant_index + 63];
}
@@ -541,9 +549,9 @@ static void scalar_dequant_float(COOKContext *q, int index, int quant_index,
* @param subband_coef_index array of indexes to quant_centroid_tab
* @param subband_coef_sign signs of coefficients
*/
static int unpack_SQVH(COOKContext *q, COOKSubpacket *p, int category, int* subband_coef_index,
int* subband_coef_sign) {
static int unpack_SQVH(COOKContext *q, COOKSubpacket *p, int category,
int *subband_coef_index, int *subband_coef_sign)
{
int i, j;
int vlc, vd, tmp, result;
@@ -585,10 +593,9 @@ static int unpack_SQVH(COOKContext *q, COOKSubpacket *p, int category, int* subb
* @param quant_index_table pointer to the array
* @param mlt_buffer pointer to mlt coefficients
*/
static void decode_vectors(COOKContext *q, COOKSubpacket *p, int *category,
int *quant_index_table, float* mlt_buffer){
int *quant_index_table, float *mlt_buffer)
{
/* A zero in this table means that the subband coefficient is
random noise coded. */
int subband_coef_index[SUBBAND_SIZE];
@@ -603,7 +610,8 @@ static void decode_vectors(COOKContext* q, COOKSubpacket* p, int* category,
if (category[band] < 7) {
if (unpack_SQVH(q, p, category[band], subband_coef_index, subband_coef_sign)) {
index = 7;
for(j=0 ; j<p->total_subbands ; j++) category[band+j]=7;
for (j = 0; j < p->total_subbands; j++)
category[band + j] = 7;
}
}
if (index >= 7) {
@@ -615,9 +623,9 @@ static void decode_vectors(COOKContext* q, COOKSubpacket* p, int* category,
&mlt_buffer[band * SUBBAND_SIZE]);
}
if(p->total_subbands*SUBBAND_SIZE >= q->samples_per_channel){
/* FIXME: should this be removed, or moved into loop above? */
if (p->total_subbands * SUBBAND_SIZE >= q->samples_per_channel)
return;
} /* FIXME: should this be removed, or moved into loop above? */
}
@@ -627,9 +635,8 @@ static void decode_vectors(COOKContext* q, COOKSubpacket* p, int* category,
* @param q pointer to the COOKContext
* @param mlt_buffer pointer to mlt coefficients
*/
static void mono_decode(COOKContext *q, COOKSubpacket *p, float* mlt_buffer) {
static void mono_decode(COOKContext *q, COOKSubpacket *p, float *mlt_buffer)
{
int category_index[128];
int quant_index_table[102];
int category[128];
@@ -653,17 +660,16 @@ static void mono_decode(COOKContext *q, COOKSubpacket *p, float* mlt_buffer) {
* @param gain_index index for the block multiplier
* @param gain_index_next index for the next block multiplier
*/
static void interpolate_float(COOKContext *q, float *buffer,
int gain_index, int gain_index_next){
int gain_index, int gain_index_next)
{
int i;
float fc1, fc2;
fc1 = pow2tab[gain_index + 63];
if (gain_index == gain_index_next) { // static gain
for(i=0 ; i<q->gain_size_factor ; i++){
for (i = 0; i < q->gain_size_factor; i++)
buffer[i] *= fc1;
}
} else { // smooth gain
fc2 = q->gain_table[11 + (gain_index_next - gain_index)];
for (i = 0; i < q->gain_size_factor; i++) {
@@ -681,7 +687,6 @@ static void interpolate_float(COOKContext *q, float* buffer,
* @param gains_ptr current and previous gains
* @param previous_buffer pointer to the previous buffer to be used for overlapping
*/
static void imlt_window_float(COOKContext *q, float *inbuffer,
cook_gains *gains_ptr, float *previous_buffer)
{
@@ -694,11 +699,10 @@ static void imlt_window_float (COOKContext *q, float *inbuffer,
*/
/* Apply window and overlap */
for(i = 0; i < q->samples_per_channel; i++){
for (i = 0; i < q->samples_per_channel; i++)
inbuffer[i] = inbuffer[i] * fc * q->mlt_window[i] -
previous_buffer[i] * q->mlt_window[q->samples_per_channel - 1 - i];
}
}
/**
* The modulated lapped transform, this takes transform coefficients
@@ -711,7 +715,6 @@ static void imlt_window_float (COOKContext *q, float *inbuffer,
* @param gains_ptr current and previous gains
* @param previous_buffer pointer to the previous buffer to be used for overlapping
*/
static void imlt_gain(COOKContext *q, float *inbuffer,
cook_gains *gains_ptr, float *previous_buffer)
{
@@ -725,11 +728,10 @@ static void imlt_gain(COOKContext *q, float *inbuffer,
q->imlt_window(q, buffer1, gains_ptr, previous_buffer);
/* Apply gain profile */
for (i = 0; i < 8; i++) {
for (i = 0; i < 8; i++)
if (gains_ptr->now[i] || gains_ptr->now[i + 1])
q->interpolate(q, &buffer1[q->gain_size_factor * i],
gains_ptr->now[i], gains_ptr->now[i + 1]);
}
/* Save away the current to be previous block. */
memcpy(previous_buffer, buffer0,
@@ -755,14 +757,13 @@ static void decouple_info(COOKContext *q, COOKSubpacket *p, int *decouple_tab)
if (start > end)
return;
if (vlc) {
if (vlc)
for (i = 0; i < length; i++)
decouple_tab[start + i] = get_vlc2(&q->gb, p->ccpl.table, p->ccpl.bits, 2);
} else {
else
for (i = 0; i < length; i++)
decouple_tab[start + i] = get_bits(&q->gb, p->js_vlc_bits);
}
}
/*
* function decouples a pair of signals from a single signal via multiplication.
@@ -797,9 +798,9 @@ static void decouple_float (COOKContext *q,
* @param mlt_buffer1 pointer to left channel mlt coefficients
* @param mlt_buffer2 pointer to right channel mlt coefficients
*/
static void joint_decode(COOKContext *q, COOKSubpacket *p, float *mlt_buffer1,
float* mlt_buffer2) {
float *mlt_buffer2)
{
int i, j;
int decouple_tab[SUBBAND_SIZE];
float *decode_buffer = q->decode_buffer_0;
@@ -846,9 +847,8 @@ static void joint_decode(COOKContext *q, COOKSubpacket *p, float* mlt_buffer1,
* @param inbuffer pointer to raw stream data
* @param gains_ptr array of current/prev gain pointers
*/
static inline void
decode_bytes_and_gain(COOKContext *q, COOKSubpacket *p, const uint8_t *inbuffer,
static inline void decode_bytes_and_gain(COOKContext *q, COOKSubpacket *p,
const uint8_t *inbuffer,
cook_gains *gains_ptr)
{
int offset;
@@ -891,9 +891,7 @@ static void saturate_output_float(COOKContext *q, int chan, float *out)
* @param out pointer to the output buffer
* @param chan 0: left or single channel, 1: right channel
*/
static inline void
mlt_compensate_output(COOKContext *q, float *decode_buffer,
static inline void mlt_compensate_output(COOKContext *q, float *decode_buffer,
cook_gains *gains_ptr, float *previous_buffer,
float *out, int chan)
{
@@ -916,9 +914,8 @@ static void decode_subpacket(COOKContext *q, COOKSubpacket *p,
{
int sub_packet_size = p->size;
/* packet dump */
// for (i=0 ; i<sub_packet_size ; i++) {
// for (i = 0; i < sub_packet_size ; i++)
// av_log(q->avctx, AV_LOG_ERROR, "%02x", inbuffer[i]);
// }
// av_log(q->avctx, AV_LOG_ERROR, "\n");
memset(q->decode_buffer_1, 0, sizeof(q->decode_buffer_1));
decode_bytes_and_gain(q, p, inbuffer, &p->gains1);
@@ -937,17 +934,14 @@ static void decode_subpacket(COOKContext *q, COOKSubpacket *p,
mlt_compensate_output(q, q->decode_buffer_1, &p->gains1,
p->mono_previous_buffer1, outbuffer, p->ch_idx);
if (p->num_channels == 2) {
if (p->joint_stereo) {
if (p->num_channels == 2)
if (p->joint_stereo)
mlt_compensate_output(q, q->decode_buffer_2, &p->gains1,
p->mono_previous_buffer2, outbuffer, p->ch_idx + 1);
} else {
else
mlt_compensate_output(q, q->decode_buffer_2, &p->gains2,
p->mono_previous_buffer2, outbuffer, p->ch_idx + 1);
}
}
}
/**
@@ -955,7 +949,6 @@ static void decode_subpacket(COOKContext *q, COOKSubpacket *p,
*
* @param avctx pointer to the AVCodecContext
*/
static int cook_decode_frame(AVCodecContext *avctx, void *data,
int *got_frame_ptr, AVPacket *avpkt)
{
@@ -987,20 +980,27 @@ static int cook_decode_frame(AVCodecContext *avctx, void *data,
q->subpacket[i].size = 2 * buf[avctx->block_align - q->num_subpackets + i];
q->subpacket[0].size -= q->subpacket[i].size + 1;
if (q->subpacket[0].size < 0) {
av_log(avctx,AV_LOG_DEBUG,"frame subpacket size total > avctx->block_align!\n");
av_log(avctx, AV_LOG_DEBUG,
"frame subpacket size total > avctx->block_align!\n");
return AVERROR_INVALIDDATA;
}
}
/* decode supbackets */
for (i = 0; i < q->num_subpackets; i++) {
q->subpacket[i].bits_per_subpacket = (q->subpacket[i].size*8)>>q->subpacket[i].bits_per_subpdiv;
q->subpacket[i].bits_per_subpacket = (q->subpacket[i].size * 8) >>
q->subpacket[i].bits_per_subpdiv;
q->subpacket[i].ch_idx = chidx;
av_log(avctx,AV_LOG_DEBUG,"subpacket[%i] size %i js %i %i block_align %i\n",i,q->subpacket[i].size,q->subpacket[i].joint_stereo,offset,avctx->block_align);
av_log(avctx, AV_LOG_DEBUG,
"subpacket[%i] size %i js %i %i block_align %i\n",
i, q->subpacket[i].size, q->subpacket[i].joint_stereo, offset,
avctx->block_align);
decode_subpacket(q, &q->subpacket[i], buf + offset, samples);
offset += q->subpacket[i].size;
chidx += q->subpacket[i].num_channels;
av_log(avctx,AV_LOG_DEBUG,"subpacket[%i] %i %i\n",i,q->subpacket[i].size * 8,get_bits_count(&q->gb));
av_log(avctx, AV_LOG_DEBUG, "subpacket[%i] %i %i\n",
i, q->subpacket[i].size * 8, get_bits_count(&q->gb));
}
/* Discard the first two frames: no valid audio. */
@@ -1041,13 +1041,13 @@ static void dump_cook_context(COOKContext *q)
}
#endif
static av_cold int cook_count_channels(unsigned int mask){
static av_cold int cook_count_channels(unsigned int mask)
{
int i;
int channels = 0;
for(i = 0;i<32;i++){
for (i = 0; i < 32; i++)
if (mask & (1 << i))
++channels;
}
return channels;
}
@@ -1056,7 +1056,6 @@ static av_cold int cook_count_channels(unsigned int mask){
*
* @param avctx pointer to the AVCodecContext
*/
static av_cold int cook_decode_init(AVCodecContext *avctx)
{
COOKContext *q = avctx->priv_data;
@@ -1110,7 +1109,8 @@ static av_cold int cook_decode_init(AVCodecContext *avctx)
/* Initialize version-dependent variables */
av_log(avctx,AV_LOG_DEBUG,"subpacket[%i].cookversion=%x\n",s,q->subpacket[s].cookversion);
av_log(avctx, AV_LOG_DEBUG, "subpacket[%i].cookversion=%x\n", s,
q->subpacket[s].cookversion);
q->subpacket[s].joint_stereo = 0;
switch (q->subpacket[s].cookversion) {
case MONO:
@@ -1134,7 +1134,8 @@ static av_cold int cook_decode_init(AVCodecContext *avctx)
}
av_log(avctx, AV_LOG_DEBUG, "JOINT_STEREO\n");
if (avctx->extradata_size >= 16) {
q->subpacket[s].total_subbands = q->subpacket[s].subbands + q->subpacket[s].js_subband_start;
q->subpacket[s].total_subbands = q->subpacket[s].subbands +
q->subpacket[s].js_subband_start;
q->subpacket[s].joint_stereo = 1;
q->subpacket[s].num_channels = 2;
}
@@ -1151,7 +1152,8 @@ static av_cold int cook_decode_init(AVCodecContext *avctx)
channel_mask |= q->subpacket[s].channel_mask = bytestream_get_be32(&edata_ptr);
if (cook_count_channels(q->subpacket[s].channel_mask) > 1) {
q->subpacket[s].total_subbands = q->subpacket[s].subbands + q->subpacket[s].js_subband_start;
q->subpacket[s].total_subbands = q->subpacket[s].subbands +
q->subpacket[s].js_subband_start;
q->subpacket[s].joint_stereo = 1;
q->subpacket[s].num_channels = 2;
q->subpacket[s].samples_per_channel = q->subpacket[s].samples_per_frame >> 1;
@@ -1187,7 +1189,8 @@ static av_cold int cook_decode_init(AVCodecContext *avctx)
return AVERROR_PATCHWELCOME;
}
if ((q->subpacket[s].js_vlc_bits > 6) || (q->subpacket[s].js_vlc_bits < 2*q->subpacket[s].joint_stereo)) {
if ((q->subpacket[s].js_vlc_bits > 6) ||
(q->subpacket[s].js_vlc_bits < 2 * q->subpacket[s].joint_stereo)) {
av_log(avctx, AV_LOG_ERROR, "js_vlc_bits = %d, only >= %d and <= 6 allowed!\n",
q->subpacket[s].js_vlc_bits, 2 * q->subpacket[s].joint_stereo);
return AVERROR_INVALIDDATA;
@@ -1245,7 +1248,8 @@ static av_cold int cook_decode_init(AVCodecContext *avctx)
}
/* Try to catch some obviously faulty streams, othervise it might be exploitable */
if ((q->samples_per_channel == 256) || (q->samples_per_channel == 512) || (q->samples_per_channel == 1024)) {
if ((q->samples_per_channel == 256) || (q->samples_per_channel == 512)
|| (q->samples_per_channel == 1024)) {
} else {
av_log_ask_for_sample(avctx,
"unknown amount of samples_per_channel = %d\n",
@@ -1268,9 +1272,7 @@ static av_cold int cook_decode_init(AVCodecContext *avctx)
return 0;
}
AVCodec ff_cook_decoder =
{
AVCodec ff_cook_decoder = {
.name = "cook",
.type = AVMEDIA_TYPE_AUDIO,
.id = CODEC_ID_COOK,

View File

@@ -1436,28 +1436,30 @@ static int mp_decode_layer3(MPADecodeContext *s)
memcpy(s->last_buf + s->last_buf_size, ptr, EXTRABYTES);
s->in_gb = s->gb;
init_get_bits(&s->gb, s->last_buf, s->last_buf_size*8);
#if CONFIG_SAFE_BITSTREAM_READER
#if !UNCHECKED_BITSTREAM_READER
s->gb.size_in_bits_plus8 += EXTRABYTES * 8;
#endif
skip_bits_long(&s->gb, 8*(s->last_buf_size - main_data_begin));
}
for (gr = 0; gr < nb_granules; gr++) {
for (ch = 0; ch < s->nb_channels; ch++) {
s->last_buf_size <<= 3;
for (gr = 0, ch = 0; gr < nb_granules && (s->last_buf_size >> 3) < main_data_begin; gr++, ch = 0) {
for (; ch < s->nb_channels && (s->last_buf_size >> 3) < main_data_begin; ch++) {
g = &s->granules[ch][gr];
if (get_bits_count(&s->gb) < 0) {
av_log(s->avctx, AV_LOG_DEBUG, "mdb:%d, lastbuf:%d skipping granule %d\n",
main_data_begin, s->last_buf_size, gr);
skip_bits_long(&s->gb, g->part2_3_length);
s->last_buf_size += g->part2_3_length;
memset(g->sb_hybrid, 0, sizeof(g->sb_hybrid));
}
}
skip_bits_long(&s->gb, s->last_buf_size - 8 * main_data_begin);
if (get_bits_count(&s->gb) >= s->gb.size_in_bits && s->in_gb.buffer) {
skip_bits_long(&s->in_gb, get_bits_count(&s->gb) - s->gb.size_in_bits);
s->gb = s->in_gb;
s->in_gb.buffer = NULL;
}
continue;
} else {
gr = ch = 0;
}
for (; gr < nb_granules; gr++, ch = 0) {
for (; ch < s->nb_channels; ch++) {
g = &s->granules[ch][gr];
bits_pos = get_bits_count(&s->gb);
if (!s->lsf) {

View File

@@ -371,7 +371,7 @@ static const AVOption options[]={
{"float", NULL, 0, AV_OPT_TYPE_CONST, {.dbl = FF_AA_FLOAT }, INT_MIN, INT_MAX, V|D, "aa"},
#endif
{"qns", "quantizer noise shaping", OFFSET(quantizer_noise_shaping), AV_OPT_TYPE_INT, {.dbl = DEFAULT }, INT_MIN, INT_MAX, V|E},
{"threads", NULL, OFFSET(thread_count), AV_OPT_TYPE_INT, {.dbl = 1 }, 0, INT_MAX, V|E|D, "threads"},
{"threads", NULL, OFFSET(thread_count), AV_OPT_TYPE_INT, {.dbl = 0 }, 0, INT_MAX, V|E|D, "threads"},
{"auto", "detect a good number of threads", 0, AV_OPT_TYPE_CONST, {.dbl = 0 }, INT_MIN, INT_MAX, V|E|D, "threads"},
{"me_threshold", "motion estimaton threshold", OFFSET(me_threshold), AV_OPT_TYPE_INT, {.dbl = DEFAULT }, INT_MIN, INT_MAX, V|E},
{"mb_threshold", "macroblock threshold", OFFSET(mb_threshold), AV_OPT_TYPE_INT, {.dbl = DEFAULT }, INT_MIN, INT_MAX, V|E},

View File

@@ -34,9 +34,11 @@
#if HAVE_SCHED_GETAFFINITY
#define _GNU_SOURCE
#include <sched.h>
#elif HAVE_GETSYSTEMINFO
#endif
#if HAVE_GETSYSTEMINFO
#include <windows.h>
#elif HAVE_SYSCTL
#endif
#if HAVE_SYSCTL
#if HAVE_SYS_PARAM_H
#include <sys/param.h>
#endif
@@ -44,6 +46,9 @@
#include <sys/param.h>
#include <sys/sysctl.h>
#endif
#if HAVE_SYSCONF
#include <unistd.h>
#endif
#include "avcodec.h"
#include "internal.h"
@@ -178,6 +183,10 @@ static int get_logical_cpus(AVCodecContext *avctx)
ret = sysctl(mib, 2, &nb_cpus, &len, NULL, 0);
if (ret == -1)
nb_cpus = 0;
#elif HAVE_SYSCONF && defined(_SC_NPROC_ONLN)
nb_cpus = sysconf(_SC_NPROC_ONLN);
#elif HAVE_SYSCONF && defined(_SC_NPROCESSORS_ONLN)
nb_cpus = sysconf(_SC_NPROCESSORS_ONLN);
#endif
av_log(avctx, AV_LOG_DEBUG, "detected %d logical cores\n", nb_cpus);
return FFMIN(nb_cpus, MAX_AUTO_THREADS);

View File

@@ -22,7 +22,7 @@
#define LIBAVCODEC_VERSION_MAJOR 53
#define LIBAVCODEC_VERSION_MINOR 49
#define LIBAVCODEC_VERSION_MICRO 100
#define LIBAVCODEC_VERSION_MICRO 101
#define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
LIBAVCODEC_VERSION_MINOR, \

View File

@@ -2377,9 +2377,14 @@ int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options)
int i, count, ret, read_size, j;
AVStream *st;
AVPacket pkt1, *pkt;
AVDictionary *one_thread_opt = NULL;
int64_t old_offset = avio_tell(ic->pb);
int orig_nb_streams = ic->nb_streams; // new streams might appear, no options for those
/* this function doesn't flush the decoders, so force thread count
* to 1 to fix behavior when thread count > number of frames in the file */
av_dict_set(&one_thread_opt, "threads", "1", 0);
for(i=0;i<ic->nb_streams;i++) {
AVCodec *codec;
st = ic->streams[i];
@@ -2404,17 +2409,18 @@ int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options)
/* this function doesn't flush the decoders, so force thread count
* to 1 to fix behavior when thread count > number of frames in the file */
if (options)
av_dict_set(&options[i], "threads", 0, 0);
av_dict_set(&options[i], "threads", "1", 0);
/* Ensure that subtitle_header is properly set. */
if (st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE
&& codec && !st->codec->codec)
avcodec_open2(st->codec, codec, options ? &options[i] : NULL);
avcodec_open2(st->codec, codec, options ? &options[i] : &one_thread_opt);
//try to just open decoders, in case this is enough to get parameters
if(!has_codec_parameters(st->codec)){
if (codec && !st->codec->codec)
avcodec_open2(st->codec, codec, options ? &options[i] : NULL);
avcodec_open2(st->codec, codec, options ? &options[i]
: &one_thread_opt);
}
}
@@ -2556,7 +2562,8 @@ int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options)
least one frame of codec data, this makes sure the codec initializes
the channel configuration and does not only trust the values from the container.
*/
try_decode_frame(st, pkt, (options && i < orig_nb_streams )? &options[i] : NULL);
try_decode_frame(st, pkt, (options && i < orig_nb_streams )? &options[i]
: &one_thread_opt);
st->codec_info_nb_frames++;
count++;
@@ -2677,8 +2684,12 @@ int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options)
#endif
find_stream_info_err:
for (i=0; i < ic->nb_streams; i++)
for (i=0; i < ic->nb_streams; i++) {
if (ic->streams[i]->codec)
ic->streams[i]->codec->thread_count = 0;
av_freep(&ic->streams[i]->info);
}
av_dict_free(&one_thread_opt);
return ret;
}

View File

@@ -49,6 +49,7 @@ include $(SRC_PATH)/tests/fate/atrac.mak
include $(SRC_PATH)/tests/fate/audio.mak
include $(SRC_PATH)/tests/fate/dct.mak
include $(SRC_PATH)/tests/fate/demux.mak
include $(SRC_PATH)/tests/fate/dfa.mak
include $(SRC_PATH)/tests/fate/dpcm.mak
include $(SRC_PATH)/tests/fate/ea.mak
include $(SRC_PATH)/tests/fate/fft.mak

35
tests/fate/dfa.mak Normal file
View File

@@ -0,0 +1,35 @@
FATE_DFA += fate-dfa1
fate-dfa1: CMD = framecrc -i $(SAMPLES)/chronomaster-dfa/0000.dfa
FATE_DFA += fate-dfa2
fate-dfa2: CMD = framecrc -i $(SAMPLES)/chronomaster-dfa/0001.dfa
FATE_DFA += fate-dfa3
fate-dfa3: CMD = framecrc -i $(SAMPLES)/chronomaster-dfa/0002.dfa
FATE_DFA += fate-dfa4
fate-dfa4: CMD = framecrc -i $(SAMPLES)/chronomaster-dfa/0003.dfa
FATE_DFA += fate-dfa5
fate-dfa5: CMD = framecrc -i $(SAMPLES)/chronomaster-dfa/0004.dfa
FATE_DFA += fate-dfa6
fate-dfa6: CMD = framecrc -i $(SAMPLES)/chronomaster-dfa/0005.dfa
FATE_DFA += fate-dfa7
fate-dfa7: CMD = framecrc -i $(SAMPLES)/chronomaster-dfa/0006.dfa
FATE_DFA += fate-dfa8
fate-dfa8: CMD = framecrc -i $(SAMPLES)/chronomaster-dfa/0007.dfa
FATE_DFA += fate-dfa9
fate-dfa9: CMD = framecrc -i $(SAMPLES)/chronomaster-dfa/0008.dfa
FATE_DFA += fate-dfa10
fate-dfa10: CMD = framecrc -i $(SAMPLES)/chronomaster-dfa/0009.dfa
FATE_DFA += fate-dfa11
fate-dfa11: CMD = framecrc -i $(SAMPLES)/chronomaster-dfa/0010.dfa
FATE_TESTS += $(FATE_DFA)
fate-dfa: $(FATE_DFA)

25
tests/ref/fate/dfa1 Normal file
View File

@@ -0,0 +1,25 @@
0, 0, 308224, 0x7264439e
0, 11520, 308224, 0xe1734f4b
0, 23040, 308224, 0x9cfe28a4
0, 34560, 308224, 0xebb6ec8b
0, 46080, 308224, 0xaef16ca7
0, 57600, 308224, 0x0390b439
0, 69120, 308224, 0xe69bd008
0, 80640, 308224, 0xa1818468
0, 92160, 308224, 0x9d6e7d82
0, 103680, 308224, 0x54971a9e
0, 115200, 308224, 0xe14e15a8
0, 126720, 308224, 0xa026cf3f
0, 138240, 308224, 0xf8921be4
0, 149760, 308224, 0xf49a42cc
0, 161280, 308224, 0xa4108f17
0, 172800, 308224, 0xfa79cbfe
0, 184320, 308224, 0x3431f47b
0, 195840, 308224, 0x72aa3426
0, 207360, 308224, 0x81159f85
0, 218880, 308224, 0x04bcb289
0, 230400, 308224, 0xb1dabbcd
0, 241920, 308224, 0x7e851c8c
0, 253440, 308224, 0x8bdea0bf
0, 264960, 308224, 0xecacdb11
0, 276480, 308224, 0xec4c6c41

8
tests/ref/fate/dfa10 Normal file
View File

@@ -0,0 +1,8 @@
0, 0, 65024, 0x8f31c3f0
0, 6390, 65024, 0x164a2d82
0, 12780, 65024, 0xbb72b738
0, 19170, 65024, 0x45b93e3a
0, 25560, 65024, 0xcc4019df
0, 31950, 65024, 0x64644557
0, 38340, 65024, 0xb4584b28
0, 44730, 65024, 0x1d87966a

9
tests/ref/fate/dfa11 Normal file
View File

@@ -0,0 +1,9 @@
0, 0, 65024, 0x10db5645
0, 6390, 65024, 0xb5d8a5bd
0, 12780, 65024, 0xc9555f27
0, 19170, 65024, 0x74c43f84
0, 25560, 65024, 0x5b2445b0
0, 31950, 65024, 0x8bd5be38
0, 38340, 65024, 0x75ec97da
0, 44730, 65024, 0x34416636
0, 51120, 65024, 0x9cc2abcf

17
tests/ref/fate/dfa2 Normal file
View File

@@ -0,0 +1,17 @@
0, 0, 308224, 0x8dc9803f
0, 6390, 308224, 0x06308b37
0, 12780, 308224, 0xb8cb7be6
0, 19170, 308224, 0xc538862b
0, 25560, 308224, 0x8d4b7702
0, 31950, 308224, 0x97a479f0
0, 38340, 308224, 0x63d08e67
0, 44730, 308224, 0x470e8a18
0, 51120, 308224, 0x08aa6be4
0, 57510, 308224, 0x3b2f6f9a
0, 63900, 308224, 0xf0f1490c
0, 70290, 308224, 0xcb8b2ec5
0, 76680, 308224, 0xab361e75
0, 83070, 308224, 0x485aed6d
0, 89460, 308224, 0xd3e7ecb7
0, 95850, 308224, 0xa2c0d561
0, 102240, 308224, 0xd8f8ccd4

10
tests/ref/fate/dfa3 Normal file
View File

@@ -0,0 +1,10 @@
0, 0, 65024, 0xbf9d558b
0, 9000, 65024, 0x4c7ea2ac
0, 18000, 65024, 0x4931827c
0, 27000, 65024, 0x5a9e09a7
0, 36000, 65024, 0x2b76eca9
0, 45000, 65024, 0xd5400a96
0, 54000, 65024, 0xcca17f23
0, 63000, 65024, 0xebca0dec
0, 72000, 65024, 0x07a73cfc
0, 81000, 65024, 0xdd5e4620

13
tests/ref/fate/dfa4 Normal file
View File

@@ -0,0 +1,13 @@
0, 0, 308224, 0x5a24821c
0, 12780, 308224, 0xa1ecf793
0, 25560, 308224, 0xcb91afa5
0, 38340, 308224, 0x8b7e85b9
0, 51120, 308224, 0xe4755628
0, 63900, 308224, 0xe4755628
0, 76680, 308224, 0xe4755628
0, 89460, 308224, 0xe4755628
0, 102240, 308224, 0xe4755628
0, 115020, 308224, 0xe4755628
0, 127800, 308224, 0xdd6ca523
0, 140580, 308224, 0x961ba417
0, 153360, 308224, 0x5ed15e7f

15
tests/ref/fate/dfa5 Normal file
View File

@@ -0,0 +1,15 @@
0, 0, 65024, 0x54831a1a
0, 9000, 65024, 0x110f5bad
0, 18000, 65024, 0xdd4f97fa
0, 27000, 65024, 0x1ab375b2
0, 36000, 65024, 0x311b51d3
0, 45000, 65024, 0xb0614f71
0, 54000, 65024, 0x6d968927
0, 63000, 65024, 0x28d85028
0, 72000, 65024, 0x74ea41f5
0, 81000, 65024, 0x3480b067
0, 90000, 65024, 0x3e1115d4
0, 99000, 65024, 0x0c715b57
0, 108000, 65024, 0x3acaaea3
0, 117000, 65024, 0x1b60f1e8
0, 126000, 65024, 0xcee14632

12
tests/ref/fate/dfa6 Normal file
View File

@@ -0,0 +1,12 @@
0, 0, 65024, 0x190f2398
0, 6390, 65024, 0x19d8c3e0
0, 12780, 65024, 0x848020a2
0, 19170, 65024, 0xbb64696f
0, 25560, 65024, 0x85886472
0, 31950, 65024, 0xc9c26668
0, 38340, 65024, 0xf24d1524
0, 44730, 65024, 0x64d98cd0
0, 51120, 65024, 0xa1323b5e
0, 57510, 65024, 0x9f48dcf9
0, 63900, 65024, 0x1a0591da
0, 70290, 65024, 0x8eabf12e

12
tests/ref/fate/dfa7 Normal file
View File

@@ -0,0 +1,12 @@
0, 0, 3648, 0xb6174031
0, 6390, 3648, 0x2e4649b0
0, 12780, 3648, 0xe05247cb
0, 19170, 3648, 0x003941f0
0, 25560, 3648, 0xa2563fed
0, 31950, 3648, 0x23d34cf1
0, 38340, 3648, 0x624f5173
0, 44730, 3648, 0xc07a491e
0, 51120, 3648, 0x74214090
0, 57510, 3648, 0xebfd469c
0, 63900, 3648, 0x60083f49
0, 70290, 3648, 0x6096486f

36
tests/ref/fate/dfa8 Normal file
View File

@@ -0,0 +1,36 @@
0, 0, 45932, 0xf9bc2e69
0, 6390, 45932, 0x5b8736ad
0, 12780, 45932, 0x4521ba17
0, 19170, 45932, 0xf3a374a9
0, 25560, 45932, 0x3fdfdc70
0, 31950, 45932, 0x4eb18dbb
0, 38340, 45932, 0x633c6377
0, 44730, 45932, 0x77dce8ba
0, 51120, 45932, 0x8246fecd
0, 57510, 45932, 0xe8864c0d
0, 63900, 45932, 0x995740d1
0, 70290, 45932, 0xc8a298ee
0, 76680, 45932, 0xa3535672
0, 83070, 45932, 0xb553f58b
0, 89460, 45932, 0x8a5b3b92
0, 95850, 45932, 0x1bcd50b0
0, 102240, 45932, 0xf22b0531
0, 108630, 45932, 0x5f62bc78
0, 115020, 45932, 0xc669075f
0, 121410, 45932, 0xae3b4e80
0, 127800, 45932, 0x3f52062f
0, 134190, 45932, 0xde97a978
0, 140580, 45932, 0x3ba7ca71
0, 146970, 45932, 0xe418aba1
0, 153360, 45932, 0xb8b3f24b
0, 159750, 45932, 0xd054791d
0, 166140, 45932, 0xddf121ce
0, 172530, 45932, 0xf0dcdd42
0, 178920, 45932, 0xd5aa9281
0, 185310, 45932, 0xffe8450b
0, 191700, 45932, 0x84f9424a
0, 198090, 45932, 0xe6c7592e
0, 204480, 45932, 0xc29c492d
0, 210870, 45932, 0x87186732
0, 217260, 45932, 0x02c73e12
0, 223650, 45932, 0x32eb90c8

6
tests/ref/fate/dfa9 Normal file
View File

@@ -0,0 +1,6 @@
0, 0, 77076, 0x33b3bf99
0, 6390, 77076, 0xde70a282
0, 12780, 77076, 0x8d4c10a4
0, 19170, 77076, 0xeb536bcc
0, 25560, 77076, 0x86cce3e8
0, 31950, 77076, 0x292df285