* qatar/master: dv: Initialize encoder tables during encoder init. dv: Replace some magic numbers by the appropriate #define. FATE: pass the decoded output format and audio source file to enc_dec_pcm FATE: specify the input format when decoding in enc_dec_pcm() x86inc: support AVX abstraction for 2-operand instructions configure: detect PGI compiler and set suitable flags avconv: check for an incompatible changing channel layout avio: make AVIOContext.av_class pointer to const nutdec: add malloc check and fix const to non-const conversion warnings Conflicts: ffmpeg.c Merged-by: Michael Niedermayer <michaelni@gmx.at>tags/n0.11
| @@ -2344,6 +2344,24 @@ elif $cc -v 2>&1 | grep -q Open64; then | |||
| speed_cflags='-O2' | |||
| size_cflags='-Os' | |||
| filter_cflags='filter_out -Wdisabled-optimization|-Wtype-limits|-fno-signed-zeros' | |||
| elif $cc -V 2>&1 | grep -q Portland; then | |||
| cc_type=pgi | |||
| cc_version='AV_STRINGIFY(__PGIC__.__PGIC_MINOR__.__PGIC_PATCHLEVEL__)' | |||
| cc_ident="PGI $($cc -V 2>&1 | awk '/^pgcc/ { print $2; exit }')" | |||
| opt_common='-alias=ansi -Mlre -Mpre' | |||
| speed_cflags="-O3 -Mautoinline -Munroll=c:4 $opt_common" | |||
| size_cflags="-O2 -Munroll=c:1 $opt_common" | |||
| noopt_cflags="-O1" | |||
| filter_cflags=pgi_flags | |||
| pgi_flags(){ | |||
| for flag; do | |||
| case $flag in | |||
| -fomit-frame-pointer) echo -Mnoframe ;; | |||
| -g) echo -gopt ;; | |||
| *) echo $flag ;; | |||
| esac | |||
| done | |||
| } | |||
| fi | |||
| test -n "$cc_type" && enable $cc_type || | |||
| @@ -1381,6 +1381,58 @@ static void write_frame(AVFormatContext *s, AVPacket *pkt, OutputStream *ost) | |||
| } | |||
| } | |||
| static void get_default_channel_layouts(OutputStream *ost, InputStream *ist) | |||
| { | |||
| char layout_name[256]; | |||
| AVCodecContext *enc = ost->st->codec; | |||
| AVCodecContext *dec = ist->st->codec; | |||
| if (dec->channel_layout && | |||
| av_get_channel_layout_nb_channels(dec->channel_layout) != dec->channels) { | |||
| av_get_channel_layout_string(layout_name, sizeof(layout_name), | |||
| dec->channels, dec->channel_layout); | |||
| av_log(NULL, AV_LOG_ERROR, "New channel layout (%s) is invalid\n", | |||
| layout_name); | |||
| dec->channel_layout = 0; | |||
| } | |||
| if (!dec->channel_layout) { | |||
| if (enc->channel_layout && dec->channels == enc->channels) { | |||
| dec->channel_layout = enc->channel_layout; | |||
| } else { | |||
| dec->channel_layout = av_get_default_channel_layout(dec->channels); | |||
| if (!dec->channel_layout) { | |||
| av_log(NULL, AV_LOG_FATAL, "Unable to find default channel " | |||
| "layout for Input Stream #%d.%d\n", ist->file_index, | |||
| ist->st->index); | |||
| exit_program(1); | |||
| } | |||
| } | |||
| av_get_channel_layout_string(layout_name, sizeof(layout_name), | |||
| dec->channels, dec->channel_layout); | |||
| av_log(NULL, AV_LOG_WARNING, "Guessed Channel Layout for Input Stream " | |||
| "#%d.%d : %s\n", ist->file_index, ist->st->index, layout_name); | |||
| } | |||
| if (!enc->channel_layout) { | |||
| if (dec->channels == enc->channels) { | |||
| enc->channel_layout = dec->channel_layout; | |||
| return; | |||
| } else { | |||
| enc->channel_layout = av_get_default_channel_layout(enc->channels); | |||
| } | |||
| if (!enc->channel_layout) { | |||
| av_log(NULL, AV_LOG_FATAL, "Unable to find default channel layout " | |||
| "for Output Stream #%d.%d\n", ost->file_index, | |||
| ost->st->index); | |||
| exit_program(1); | |||
| } | |||
| av_get_channel_layout_string(layout_name, sizeof(layout_name), | |||
| enc->channels, enc->channel_layout); | |||
| av_log(NULL, AV_LOG_WARNING, "Guessed Channel Layout for Output Stream " | |||
| "#%d.%d : %s\n", ost->file_index, ost->st->index, layout_name); | |||
| } | |||
| } | |||
| static void generate_silence(uint8_t* buf, enum AVSampleFormat sample_fmt, size_t size) | |||
| { | |||
| int fill_char = 0x00; | |||
| @@ -1515,6 +1567,8 @@ static void do_audio_out(AVFormatContext *s, OutputStream *ost, | |||
| for(i=0; i<planes; i++) | |||
| buf[i]= decoded_frame->data[i]; | |||
| get_default_channel_layouts(ost, ist); | |||
| if (alloc_audio_output_buf(dec, enc, decoded_frame->nb_samples) < 0) { | |||
| av_log(NULL, AV_LOG_FATAL, "Error allocating audio buffer\n"); | |||
| exit_program(1); | |||
| @@ -2742,51 +2796,6 @@ static void print_sdp(void) | |||
| av_freep(&avc); | |||
| } | |||
| static void get_default_channel_layouts(OutputStream *ost, InputStream *ist) | |||
| { | |||
| char layout_name[256]; | |||
| AVCodecContext *enc = ost->st->codec; | |||
| AVCodecContext *dec = ist->st->codec; | |||
| if (!dec->channel_layout) { | |||
| if (enc->channel_layout && dec->channels == enc->channels) { | |||
| dec->channel_layout = enc->channel_layout; | |||
| } else { | |||
| dec->channel_layout = av_get_default_channel_layout(dec->channels); | |||
| if (!dec->channel_layout) { | |||
| av_log(NULL, AV_LOG_FATAL, "Unable to find default channel " | |||
| "layout for Input Stream #%d.%d\n", ist->file_index, | |||
| ist->st->index); | |||
| exit_program(1); | |||
| } | |||
| } | |||
| av_get_channel_layout_string(layout_name, sizeof(layout_name), | |||
| dec->channels, dec->channel_layout); | |||
| av_log(NULL, AV_LOG_WARNING, "Guessed Channel Layout for Input Stream " | |||
| "#%d.%d : %s\n", ist->file_index, ist->st->index, layout_name); | |||
| } | |||
| if (!enc->channel_layout) { | |||
| if (dec->channels == enc->channels) { | |||
| enc->channel_layout = dec->channel_layout; | |||
| return; | |||
| } else { | |||
| enc->channel_layout = av_get_default_channel_layout(enc->channels); | |||
| } | |||
| if (!enc->channel_layout) { | |||
| av_log(NULL, AV_LOG_FATAL, "Unable to find default channel layout " | |||
| "for Output Stream #%d.%d\n", ost->file_index, | |||
| ost->st->index); | |||
| exit_program(1); | |||
| } | |||
| av_get_channel_layout_string(layout_name, sizeof(layout_name), | |||
| enc->channels, enc->channel_layout); | |||
| av_log(NULL, AV_LOG_WARNING, "Guessed Channel Layout for Output Stream " | |||
| "#%d.%d : %s\n", ost->file_index, ost->st->index, layout_name); | |||
| } | |||
| } | |||
| static int init_input_stream(int ist_index, char *error, int error_len) | |||
| { | |||
| int i; | |||
| @@ -294,8 +294,6 @@ av_cold int ff_dvvideo_init(AVCodecContext *avctx) | |||
| ff_dv_rl_vlc[i].run = run; | |||
| } | |||
| ff_free_vlc(&dv_vlc); | |||
| dv_vlc_map_tableinit(); | |||
| } | |||
| /* Generic DSP setup */ | |||
| @@ -338,6 +336,8 @@ static av_cold int dvvideo_init_encoder(AVCodecContext *avctx) | |||
| return AVERROR(EINVAL); | |||
| } | |||
| dv_vlc_map_tableinit(); | |||
| return ff_dvvideo_init(avctx); | |||
| } | |||
| @@ -36,7 +36,7 @@ | |||
| * between (run, level) and vlc is not 1-1. So you have to watch out for that | |||
| * when building misc. tables. E.g. (1, 0) can be either 0x7cf or 0x1f82. | |||
| */ | |||
| static const uint16_t dv_vlc_bits[409] = { | |||
| static const uint16_t dv_vlc_bits[NB_DV_VLC] = { | |||
| 0x0000, 0x0002, 0x0007, 0x0008, 0x0009, 0x0014, 0x0015, 0x0016, | |||
| 0x0017, 0x0030, 0x0031, 0x0032, 0x0033, 0x0068, 0x0069, 0x006a, | |||
| 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x00e0, 0x00e1, 0x00e2, | |||
| @@ -91,7 +91,7 @@ static const uint16_t dv_vlc_bits[409] = { | |||
| 0x0006, | |||
| }; | |||
| static const uint8_t dv_vlc_len[409] = { | |||
| static const uint8_t dv_vlc_len[NB_DV_VLC] = { | |||
| 2, 3, 4, 4, 4, 5, 5, 5, | |||
| 5, 6, 6, 6, 6, 7, 7, 7, | |||
| 7, 7, 7, 7, 7, 8, 8, 8, | |||
| @@ -146,7 +146,7 @@ static const uint8_t dv_vlc_len[409] = { | |||
| 4, | |||
| }; | |||
| static const uint8_t dv_vlc_run[409] = { | |||
| static const uint8_t dv_vlc_run[NB_DV_VLC] = { | |||
| 0, 0, 1, 0, 0, 2, 1, 0, | |||
| 0, 3, 4, 0, 0, 5, 6, 2, | |||
| 1, 1, 0, 0, 0, 7, 8, 9, | |||
| @@ -201,7 +201,7 @@ static const uint8_t dv_vlc_run[409] = { | |||
| 127, | |||
| }; | |||
| static const uint8_t dv_vlc_level[409] = { | |||
| static const uint8_t dv_vlc_level[NB_DV_VLC] = { | |||
| 1, 2, 1, 3, 4, 1, 2, 5, | |||
| 6, 1, 1, 7, 8, 1, 1, 2, | |||
| 3, 4, 9, 10, 11, 1, 1, 1, | |||
| @@ -78,7 +78,7 @@ typedef struct { | |||
| * warning -- this field can be NULL, be sure to not pass this AVIOContext | |||
| * to any av_opt_* functions in that case. | |||
| */ | |||
| AVClass *av_class; | |||
| const AVClass *av_class; | |||
| unsigned char *buffer; /**< Start of the buffer. */ | |||
| int buffer_size; /**< Maximum buffer size */ | |||
| unsigned char *buf_ptr; /**< Current position in the buffer */ | |||
| @@ -305,14 +305,18 @@ static int decode_main_header(NUTContext *nut) | |||
| GET_V(nut->header_count, tmp < 128U) | |||
| nut->header_count++; | |||
| for (i = 1; i < nut->header_count; i++) { | |||
| uint8_t *hdr; | |||
| GET_V(nut->header_len[i], tmp > 0 && tmp < 256); | |||
| rem -= nut->header_len[i]; | |||
| if (rem < 0) { | |||
| av_log(s, AV_LOG_ERROR, "invalid elision header\n"); | |||
| return AVERROR_INVALIDDATA; | |||
| } | |||
| nut->header[i] = av_malloc(nut->header_len[i]); | |||
| avio_read(bc, nut->header[i], nut->header_len[i]); | |||
| hdr = av_malloc(nut->header_len[i]); | |||
| if (!hdr) | |||
| return AVERROR(ENOMEM); | |||
| avio_read(bc, hdr, nut->header_len[i]); | |||
| nut->header[i] = hdr; | |||
| } | |||
| assert(nut->header_len[0] == 0); | |||
| } | |||
| @@ -856,7 +856,7 @@ INIT_XMM | |||
| ;%1 == instruction | |||
| ;%2 == 1 if float, 0 if int | |||
| ;%3 == 1 if 4-operand (xmm, xmm, xmm, imm), 0 if 3-operand (xmm, xmm, xmm) | |||
| ;%3 == 1 if 4-operand (xmm, xmm, xmm, imm), 0 if 2- or 3-operand (xmm, xmm, xmm) | |||
| ;%4 == number of operands given | |||
| ;%5+: operands | |||
| %macro RUN_AVX_INSTR 6-7+ | |||
| @@ -866,7 +866,11 @@ INIT_XMM | |||
| %define %%size mmsize | |||
| %endif | |||
| %if %%size==32 | |||
| v%1 %5, %6, %7 | |||
| %if %0 >= 7 | |||
| v%1 %5, %6, %7 | |||
| %else | |||
| v%1 %5, %6 | |||
| %endif | |||
| %else | |||
| %if %%size==8 | |||
| %define %%regmov movq | |||
| @@ -952,6 +956,8 @@ AVX_INSTR cmppd, 1, 0, 0 | |||
| AVX_INSTR cmpps, 1, 0, 0 | |||
| AVX_INSTR cmpsd, 1, 0, 0 | |||
| AVX_INSTR cmpss, 1, 0, 0 | |||
| AVX_INSTR cvtdq2ps, 1, 0, 0 | |||
| AVX_INSTR cvtps2dq, 1, 0, 0 | |||
| AVX_INSTR divpd, 1, 0, 0 | |||
| AVX_INSTR divps, 1, 0, 0 | |||
| AVX_INSTR divsd, 1, 0, 0 | |||
| @@ -28,6 +28,11 @@ errfile="${outdir}/${test}.err" | |||
| cmpfile="${outdir}/${test}.diff" | |||
| repfile="${outdir}/${test}.rep" | |||
| target_path(){ | |||
| test ${1} = ${1#/} && p=${target_path}/ | |||
| echo ${p}${1} | |||
| } | |||
| # $1=value1, $2=value2, $3=threshold | |||
| # prints 0 if absolute difference between value1 and value2 is <= threshold | |||
| compare(){ | |||
| @@ -86,12 +91,15 @@ pcm(){ | |||
| enc_dec_pcm(){ | |||
| out_fmt=$1 | |||
| pcm_fmt=$2 | |||
| shift 2 | |||
| dec_fmt=$2 | |||
| pcm_fmt=$3 | |||
| src_file=$(target_path $4) | |||
| shift 4 | |||
| encfile="${outdir}/${test}.${out_fmt}" | |||
| cleanfiles=$encfile | |||
| avconv -i $ref "$@" -f $out_fmt -y ${target_path}/${encfile} || return | |||
| avconv -i ${target_path}/${encfile} -c:a pcm_${pcm_fmt} -f wav - | |||
| encfile=$(target_path ${encfile}) | |||
| avconv -i $src_file "$@" -f $out_fmt -y ${encfile} || return | |||
| avconv -i ${encfile} -c:a pcm_${pcm_fmt} -f ${dec_fmt} - | |||
| } | |||
| regtest(){ | |||
| @@ -73,7 +73,7 @@ FATE_AAC += $(FATE_AAC_CT:%=fate-aac-ct-%) | |||
| FATE_AAC_ENCODE += fate-aac-aref-encode | |||
| fate-aac-aref-encode: $(AREF) | |||
| fate-aac-aref-encode: CMD = enc_dec_pcm adts s16le -strict -2 -c:a aac -b:a 512k | |||
| fate-aac-aref-encode: CMD = enc_dec_pcm adts wav s16le $(REF) -strict -2 -c:a aac -b:a 512k | |||
| fate-aac-aref-encode: CMP = stddev | |||
| fate-aac-aref-encode: REF = ./tests/data/acodec.ref.wav | |||
| fate-aac-aref-encode: CMP_SHIFT = -4096 | |||
| @@ -81,7 +81,7 @@ fate-aac-aref-encode: CMP_TARGET = 1862 | |||
| fate-aac-aref-encode: SIZE_TOLERANCE = 2464 | |||
| FATE_AAC_ENCODE += fate-aac-ln-encode | |||
| fate-aac-ln-encode: CMD = enc_dec_pcm adts s16le -strict -2 -c:a aac -b:a 512k | |||
| fate-aac-ln-encode: CMD = enc_dec_pcm adts wav s16le $(REF) -strict -2 -c:a aac -b:a 512k | |||
| fate-aac-ln-encode: CMP = stddev | |||
| fate-aac-ln-encode: REF = $(SAMPLES)/audio-reference/luckynight_2ch_44kHz_s16.wav | |||
| fate-aac-ln-encode: CMP_SHIFT = -4096 | |||
| @@ -29,7 +29,7 @@ fate-eac3-4: CMP = oneoff | |||
| fate-eac3-4: REF = $(SAMPLES)/eac3/serenity_english_5.1_1536_small.pcm | |||
| FATE_AC3 += fate-ac3-encode | |||
| fate-ac3-encode: CMD = enc_dec_pcm ac3 s16le -c:a ac3 -b:a 128k | |||
| fate-ac3-encode: CMD = enc_dec_pcm ac3 wav s16le $(REF) -c:a ac3 -b:a 128k | |||
| fate-ac3-encode: CMP = stddev | |||
| fate-ac3-encode: REF = $(SAMPLES)/audio-reference/luckynight_2ch_44kHz_s16.wav | |||
| fate-ac3-encode: CMP_SHIFT = -1024 | |||
| @@ -37,7 +37,7 @@ fate-ac3-encode: CMP_TARGET = 399.62 | |||
| fate-ac3-encode: SIZE_TOLERANCE = 488 | |||
| FATE_AC3 += fate-eac3-encode | |||
| fate-eac3-encode: CMD = enc_dec_pcm eac3 s16le -c:a eac3 -b:a 128k | |||
| fate-eac3-encode: CMD = enc_dec_pcm eac3 wav s16le $(REF) -c:a eac3 -b:a 128k | |||
| fate-eac3-encode: CMP = stddev | |||
| fate-eac3-encode: REF = $(SAMPLES)/audio-reference/luckynight_2ch_44kHz_s16.wav | |||
| fate-eac3-encode: CMP_SHIFT = -1024 | |||
| @@ -30,7 +30,7 @@ fate-nellymoser: REF = $(SAMPLES)/nellymoser/nellymoser.pcm | |||
| FATE_AUDIO += fate-nellymoser-aref-encode | |||
| fate-nellymoser-aref-encode: $(AREF) | |||
| fate-nellymoser-aref-encode: CMD = enc_dec_pcm flv s16le -c:a nellymoser | |||
| fate-nellymoser-aref-encode: CMD = enc_dec_pcm flv wav s16le $(REF) -c:a nellymoser | |||
| fate-nellymoser-aref-encode: CMP = stddev | |||
| fate-nellymoser-aref-encode: REF = ./tests/data/acodec-16000-1.ref.wav | |||
| fate-nellymoser-aref-encode: CMP_SHIFT = -1172 | |||
| @@ -38,7 +38,7 @@ FATE_TESTS += $(FATE_WMAVOICE) | |||
| fate-wmavoice: $(FATE_WMAVOICE) | |||
| FATE_WMA_ENCODE += fate-wmav1-encode | |||
| fate-wmav1-encode: CMD = enc_dec_pcm asf s16le -c:a wmav1 -b:a 128k | |||
| fate-wmav1-encode: CMD = enc_dec_pcm asf wav s16le $(REF) -c:a wmav1 -b:a 128k | |||
| fate-wmav1-encode: CMP = stddev | |||
| fate-wmav1-encode: REF = $(SAMPLES)/audio-reference/luckynight_2ch_44kHz_s16.wav | |||
| fate-wmav1-encode: CMP_SHIFT = -8192 | |||
| @@ -46,7 +46,7 @@ fate-wmav1-encode: CMP_TARGET = 291.06 | |||
| fate-wmav1-encode: SIZE_TOLERANCE = 4632 | |||
| FATE_WMA_ENCODE += fate-wmav2-encode | |||
| fate-wmav2-encode: CMD = enc_dec_pcm asf s16le -c:a wmav2 -b:a 128k | |||
| fate-wmav2-encode: CMD = enc_dec_pcm asf wav s16le $(REF) -c:a wmav2 -b:a 128k | |||
| fate-wmav2-encode: CMP = stddev | |||
| fate-wmav2-encode: REF = $(SAMPLES)/audio-reference/luckynight_2ch_44kHz_s16.wav | |||
| fate-wmav2-encode: CMP_SHIFT = -8192 | |||