diff --git a/configure b/configure index fc8725e9ca..b3719f8a11 100755 --- a/configure +++ b/configure @@ -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 || diff --git a/ffmpeg.c b/ffmpeg.c index 9661869af3..3e77610288 100644 --- a/ffmpeg.c +++ b/ffmpeg.c @@ -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; idata[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; diff --git a/libavcodec/dv.c b/libavcodec/dv.c index 8b0818fb41..5bb84793b5 100644 --- a/libavcodec/dv.c +++ b/libavcodec/dv.c @@ -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); } diff --git a/libavcodec/dv_vlc_data.h b/libavcodec/dv_vlc_data.h index c23c564613..be768e6f71 100644 --- a/libavcodec/dv_vlc_data.h +++ b/libavcodec/dv_vlc_data.h @@ -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, diff --git a/libavformat/avio.h b/libavformat/avio.h index 0e923fe443..260bdd95d0 100644 --- a/libavformat/avio.h +++ b/libavformat/avio.h @@ -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 */ diff --git a/libavformat/nutdec.c b/libavformat/nutdec.c index be2fd82769..29771a2d68 100644 --- a/libavformat/nutdec.c +++ b/libavformat/nutdec.c @@ -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); } diff --git a/libavutil/x86/x86inc.asm b/libavutil/x86/x86inc.asm index 6b39f23a3b..d4f6926d08 100644 --- a/libavutil/x86/x86inc.asm +++ b/libavutil/x86/x86inc.asm @@ -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 diff --git a/tests/fate-run.sh b/tests/fate-run.sh index e9863af01c..47649f4246 100755 --- a/tests/fate-run.sh +++ b/tests/fate-run.sh @@ -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(){ diff --git a/tests/fate/aac.mak b/tests/fate/aac.mak index 9d107ced52..2a0db6a224 100644 --- a/tests/fate/aac.mak +++ b/tests/fate/aac.mak @@ -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 diff --git a/tests/fate/ac3.mak b/tests/fate/ac3.mak index 2e851864c3..ca0704d08d 100644 --- a/tests/fate/ac3.mak +++ b/tests/fate/ac3.mak @@ -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 diff --git a/tests/fate/audio.mak b/tests/fate/audio.mak index ae598bac7b..186ac6e4ba 100644 --- a/tests/fate/audio.mak +++ b/tests/fate/audio.mak @@ -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 diff --git a/tests/fate/wma.mak b/tests/fate/wma.mak index 9143f8c0f3..6fd4b38ca7 100644 --- a/tests/fate/wma.mak +++ b/tests/fate/wma.mak @@ -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