* qatar/master: ppc: fix build with altivec disabled vp3: move idct and loop filter pointers to new vp3dsp context build: add CONFIG_VP3DSP, reduce repetition in OBJS lists tscc2: do not add/subtract 128 bias during DCT tscc2: fix typo in DCT configure: clarify external library section of help output configure: mark libfdk-aac as nonfree configure: cosmetics: drop some unnecessary backslashes os_support: K&R formatting cosmetics Conflicts: configure libavcodec/vp3.c Merged-by: Michael Niedermayer <michaelni@gmx.at>tags/n1.0
| @@ -177,10 +177,10 @@ External library support: | |||||
| --enable-libcdio enable audio CD grabbing with libcdio | --enable-libcdio enable audio CD grabbing with libcdio | ||||
| --enable-libdc1394 enable IIDC-1394 grabbing using libdc1394 | --enable-libdc1394 enable IIDC-1394 grabbing using libdc1394 | ||||
| and libraw1394 [no] | and libraw1394 [no] | ||||
| --enable-libfaac enable FAAC support via libfaac [no] | |||||
| --enable-libfdk-aac enable AAC support via libfdk-aac [no] | |||||
| --enable-libfaac enable AAC encoding via libfaac [no] | |||||
| --enable-libfdk-aac enable AAC encoding via libfdk-aac [no] | |||||
| --enable-libfreetype enable libfreetype [no] | --enable-libfreetype enable libfreetype [no] | ||||
| --enable-libgsm enable GSM support via libgsm [no] | |||||
| --enable-libgsm enable GSM de/encoding via libgsm [no] | |||||
| --enable-libiec61883 enable iec61883 via libiec61883 [no] | --enable-libiec61883 enable iec61883 via libiec61883 [no] | ||||
| --enable-libilbc enable iLBC de/encoding via libilbc [no] | --enable-libilbc enable iLBC de/encoding via libilbc [no] | ||||
| --enable-libmodplug enable ModPlug via libmodplug [no] | --enable-libmodplug enable ModPlug via libmodplug [no] | ||||
| @@ -193,8 +193,8 @@ External library support: | |||||
| --enable-libopenjpeg enable JPEG 2000 de/encoding via OpenJPEG [no] | --enable-libopenjpeg enable JPEG 2000 de/encoding via OpenJPEG [no] | ||||
| --enable-libpulse enable Pulseaudio input via libpulse [no] | --enable-libpulse enable Pulseaudio input via libpulse [no] | ||||
| --enable-librtmp enable RTMP[E] support via librtmp [no] | --enable-librtmp enable RTMP[E] support via librtmp [no] | ||||
| --enable-libschroedinger enable Dirac support via libschroedinger [no] | |||||
| --enable-libspeex enable Speex support via libspeex [no] | |||||
| --enable-libschroedinger enable Dirac de/encoding via libschroedinger [no] | |||||
| --enable-libspeex enable Speex de/encoding via libspeex [no] | |||||
| --enable-libstagefright-h264 enable H.264 decoding via libstagefright [no] | --enable-libstagefright-h264 enable H.264 decoding via libstagefright [no] | ||||
| --enable-libtheora enable Theora encoding via libtheora [no] | --enable-libtheora enable Theora encoding via libtheora [no] | ||||
| --enable-libutvideo enable Ut Video encoding and decoding via libutvideo [no] | --enable-libutvideo enable Ut Video encoding and decoding via libutvideo [no] | ||||
| @@ -203,7 +203,7 @@ External library support: | |||||
| --enable-libvo-amrwbenc enable AMR-WB encoding via libvo-amrwbenc [no] | --enable-libvo-amrwbenc enable AMR-WB encoding via libvo-amrwbenc [no] | ||||
| --enable-libvorbis enable Vorbis en/decoding via libvorbis, | --enable-libvorbis enable Vorbis en/decoding via libvorbis, | ||||
| native implementation exists [no] | native implementation exists [no] | ||||
| --enable-libvpx enable VP8 support via libvpx [no] | |||||
| --enable-libvpx enable VP8 de/encoding via libvpx [no] | |||||
| --enable-libx264 enable H.264 encoding via x264 [no] | --enable-libx264 enable H.264 encoding via x264 [no] | ||||
| --enable-libxavs enable AVS encoding via xavs [no] | --enable-libxavs enable AVS encoding via xavs [no] | ||||
| --enable-libxvid enable Xvid encoding via xvidcore, | --enable-libxvid enable Xvid encoding via xvidcore, | ||||
| @@ -1327,6 +1327,7 @@ CONFIG_EXTRA=" | |||||
| huffman | huffman | ||||
| lgplv3 | lgplv3 | ||||
| lpc | lpc | ||||
| vp3dsp | |||||
| " | " | ||||
| CMDLINE_SELECT=" | CMDLINE_SELECT=" | ||||
| @@ -1580,7 +1581,9 @@ vc1_vdpau_decoder_select="vdpau vc1_decoder" | |||||
| vc1image_decoder_select="vc1_decoder" | vc1image_decoder_select="vc1_decoder" | ||||
| vorbis_decoder_select="mdct" | vorbis_decoder_select="mdct" | ||||
| vorbis_encoder_select="mdct" | vorbis_encoder_select="mdct" | ||||
| vp6_decoder_select="huffman" | |||||
| vp3_decoder_select="vp3dsp" | |||||
| vp5_decoder_select="vp3dsp" | |||||
| vp6_decoder_select="huffman vp3dsp" | |||||
| vp6a_decoder_select="vp6_decoder" | vp6a_decoder_select="vp6_decoder" | ||||
| vp6f_decoder_select="vp6_decoder" | vp6f_decoder_select="vp6_decoder" | ||||
| vp8_decoder_select="h264pred h264qpel" | vp8_decoder_select="h264pred h264qpel" | ||||
| @@ -2933,8 +2936,8 @@ die_license_disabled gpl x11grab | |||||
| die_license_disabled nonfree libaacplus | die_license_disabled nonfree libaacplus | ||||
| die_license_disabled nonfree libfaac | die_license_disabled nonfree libfaac | ||||
| enabled gpl && die_license_disabled_gpl nonfree openssl | |||||
| enabled gpl && die_license_disabled_gpl nonfree libfdk_aac | enabled gpl && die_license_disabled_gpl nonfree libfdk_aac | ||||
| enabled gpl && die_license_disabled_gpl nonfree openssl | |||||
| die_license_disabled version3 libopencore_amrnb | die_license_disabled version3 libopencore_amrnb | ||||
| die_license_disabled version3 libopencore_amrwb | die_license_disabled version3 libopencore_amrwb | ||||
| @@ -3163,9 +3166,9 @@ if enabled network; then | |||||
| if check_header arpa/inet.h ; then | if check_header arpa/inet.h ; then | ||||
| check_func closesocket | check_func closesocket | ||||
| elif check_header winsock2.h ; then | elif check_header winsock2.h ; then | ||||
| check_func_headers winsock2.h closesocket -lws2 && \ | |||||
| network_extralibs="-lws2" || \ | |||||
| { check_func_headers winsock2.h closesocket -lws2_32 && \ | |||||
| check_func_headers winsock2.h closesocket -lws2 && | |||||
| network_extralibs="-lws2" || | |||||
| { check_func_headers winsock2.h closesocket -lws2_32 && | |||||
| network_extralibs="-lws2_32"; } | network_extralibs="-lws2_32"; } | ||||
| check_func_headers ws2tcpip.h getaddrinfo $network_extralibs | check_func_headers ws2tcpip.h getaddrinfo $network_extralibs | ||||
| check_type ws2tcpip.h socklen_t | check_type ws2tcpip.h socklen_t | ||||
| @@ -3485,7 +3488,7 @@ check_ldflags -Wl,--warn-common | |||||
| check_ldflags -Wl,-rpath-link=libpostproc:libswresample:libswscale:libavfilter:libavdevice:libavformat:libavcodec:libavutil:libavresample | check_ldflags -Wl,-rpath-link=libpostproc:libswresample:libswscale:libavfilter:libavdevice:libavformat:libavcodec:libavutil:libavresample | ||||
| test_ldflags -Wl,-Bsymbolic && append SHFLAGS -Wl,-Bsymbolic | test_ldflags -Wl,-Bsymbolic && append SHFLAGS -Wl,-Bsymbolic | ||||
| enabled xmm_clobber_test && \ | |||||
| enabled xmm_clobber_test && | |||||
| check_ldflags -Wl,--wrap,avcodec_open2 \ | check_ldflags -Wl,--wrap,avcodec_open2 \ | ||||
| -Wl,--wrap,avcodec_decode_audio4 \ | -Wl,--wrap,avcodec_decode_audio4 \ | ||||
| -Wl,--wrap,avcodec_decode_video2 \ | -Wl,--wrap,avcodec_decode_video2 \ | ||||
| @@ -3493,7 +3496,7 @@ enabled xmm_clobber_test && \ | |||||
| -Wl,--wrap,avcodec_encode_audio2 \ | -Wl,--wrap,avcodec_encode_audio2 \ | ||||
| -Wl,--wrap,avcodec_encode_video \ | -Wl,--wrap,avcodec_encode_video \ | ||||
| -Wl,--wrap,avcodec_encode_subtitle \ | -Wl,--wrap,avcodec_encode_subtitle \ | ||||
| -Wl,--wrap,sws_scale || \ | |||||
| -Wl,--wrap,sws_scale || | |||||
| disable xmm_clobber_test | disable xmm_clobber_test | ||||
| echo "X{};" > $TMPV | echo "X{};" > $TMPV | ||||
| @@ -3544,8 +3547,8 @@ if enabled icc; then | |||||
| # icc 11.0 and 11.1 work with ebp_available, but don't pass the test | # icc 11.0 and 11.1 work with ebp_available, but don't pass the test | ||||
| enable ebp_available | enable ebp_available | ||||
| if enabled x86_32; then | if enabled x86_32; then | ||||
| test ${icc_version%%.*} -ge 11 && \ | |||||
| check_cflags -falign-stack=maintain-16-byte || \ | |||||
| test ${icc_version%%.*} -ge 11 && | |||||
| check_cflags -falign-stack=maintain-16-byte || | |||||
| disable aligned_stack | disable aligned_stack | ||||
| fi | fi | ||||
| elif enabled ccc; then | elif enabled ccc; then | ||||
| @@ -59,6 +59,7 @@ OBJS-$(CONFIG_SINEWIN) += sinewin.o | |||||
| OBJS-$(CONFIG_VAAPI) += vaapi.o | OBJS-$(CONFIG_VAAPI) += vaapi.o | ||||
| OBJS-$(CONFIG_VDA) += vda.o | OBJS-$(CONFIG_VDA) += vda.o | ||||
| OBJS-$(CONFIG_VDPAU) += vdpau.o | OBJS-$(CONFIG_VDPAU) += vdpau.o | ||||
| OBJS-$(CONFIG_VP3DSP) += vp3dsp.o | |||||
| # decoders/encoders/hardware accelerators | # decoders/encoders/hardware accelerators | ||||
| OBJS-$(CONFIG_A64MULTI_ENCODER) += a64multienc.o elbg.o | OBJS-$(CONFIG_A64MULTI_ENCODER) += a64multienc.o elbg.o | ||||
| @@ -484,11 +485,11 @@ OBJS-$(CONFIG_VORBIS_DECODER) += vorbisdec.o vorbis.o \ | |||||
| vorbis_data.o xiph.o | vorbis_data.o xiph.o | ||||
| OBJS-$(CONFIG_VORBIS_ENCODER) += vorbisenc.o vorbis.o \ | OBJS-$(CONFIG_VORBIS_ENCODER) += vorbisenc.o vorbis.o \ | ||||
| vorbis_data.o | vorbis_data.o | ||||
| OBJS-$(CONFIG_VP3_DECODER) += vp3.o vp3dsp.o | |||||
| OBJS-$(CONFIG_VP3_DECODER) += vp3.o | |||||
| OBJS-$(CONFIG_VP5_DECODER) += vp5.o vp56.o vp56data.o vp56dsp.o \ | OBJS-$(CONFIG_VP5_DECODER) += vp5.o vp56.o vp56data.o vp56dsp.o \ | ||||
| vp3dsp.o vp56rac.o | |||||
| vp56rac.o | |||||
| OBJS-$(CONFIG_VP6_DECODER) += vp6.o vp56.o vp56data.o vp56dsp.o \ | OBJS-$(CONFIG_VP6_DECODER) += vp6.o vp56.o vp56data.o vp56dsp.o \ | ||||
| vp3dsp.o vp6dsp.o vp56rac.o | |||||
| vp6dsp.o vp56rac.o | |||||
| OBJS-$(CONFIG_VP8_DECODER) += vp8.o vp8dsp.o vp56rac.o | OBJS-$(CONFIG_VP8_DECODER) += vp8.o vp8dsp.o vp56rac.o | ||||
| OBJS-$(CONFIG_VQA_DECODER) += vqavideo.o | OBJS-$(CONFIG_VQA_DECODER) += vqavideo.o | ||||
| OBJS-$(CONFIG_WAVPACK_DECODER) += wavpack.o | OBJS-$(CONFIG_WAVPACK_DECODER) += wavpack.o | ||||
| @@ -11,6 +11,7 @@ ARMV6-OBJS-$(CONFIG_AC3DSP) += arm/ac3dsp_armv6.o | |||||
| OBJS-$(CONFIG_MPEGAUDIODSP) += arm/mpegaudiodsp_init_arm.o | OBJS-$(CONFIG_MPEGAUDIODSP) += arm/mpegaudiodsp_init_arm.o | ||||
| ARMV6-OBJS-$(CONFIG_MPEGAUDIODSP) += arm/mpegaudiodsp_fixed_armv6.o | ARMV6-OBJS-$(CONFIG_MPEGAUDIODSP) += arm/mpegaudiodsp_fixed_armv6.o | ||||
| OBJS-$(CONFIG_VP3DSP) += arm/vp3dsp_init_arm.o | |||||
| OBJS-$(CONFIG_VP5_DECODER) += arm/vp56dsp_init_arm.o | OBJS-$(CONFIG_VP5_DECODER) += arm/vp56dsp_init_arm.o | ||||
| OBJS-$(CONFIG_VP6_DECODER) += arm/vp56dsp_init_arm.o | OBJS-$(CONFIG_VP6_DECODER) += arm/vp56dsp_init_arm.o | ||||
| OBJS-$(CONFIG_VP8_DECODER) += arm/vp8dsp_init_arm.o | OBJS-$(CONFIG_VP8_DECODER) += arm/vp8dsp_init_arm.o | ||||
| @@ -75,13 +76,11 @@ NEON-OBJS-$(CONFIG_RV40_DECODER) += arm/rv34dsp_init_neon.o \ | |||||
| arm/rv40dsp_neon.o \ | arm/rv40dsp_neon.o \ | ||||
| arm/h264cmc_neon.o \ | arm/h264cmc_neon.o \ | ||||
| NEON-OBJS-$(CONFIG_VP3_DECODER) += arm/vp3dsp_neon.o | |||||
| NEON-OBJS-$(CONFIG_VP3DSP) += arm/vp3dsp_neon.o | |||||
| NEON-OBJS-$(CONFIG_VP5_DECODER) += arm/vp56dsp_neon.o \ | NEON-OBJS-$(CONFIG_VP5_DECODER) += arm/vp56dsp_neon.o \ | ||||
| arm/vp3dsp_neon.o \ | |||||
| NEON-OBJS-$(CONFIG_VP6_DECODER) += arm/vp56dsp_neon.o \ | NEON-OBJS-$(CONFIG_VP6_DECODER) += arm/vp56dsp_neon.o \ | ||||
| arm/vp3dsp_neon.o \ | |||||
| NEON-OBJS-$(CONFIG_VP8_DECODER) += arm/vp8dsp_init_neon.o \ | NEON-OBJS-$(CONFIG_VP8_DECODER) += arm/vp8dsp_init_neon.o \ | ||||
| arm/vp8dsp_neon.o | arm/vp8dsp_neon.o | ||||
| @@ -29,11 +29,6 @@ void ff_simple_idct_neon(DCTELEM *data); | |||||
| void ff_simple_idct_put_neon(uint8_t *dest, int line_size, DCTELEM *data); | void ff_simple_idct_put_neon(uint8_t *dest, int line_size, DCTELEM *data); | ||||
| void ff_simple_idct_add_neon(uint8_t *dest, int line_size, DCTELEM *data); | void ff_simple_idct_add_neon(uint8_t *dest, int line_size, DCTELEM *data); | ||||
| void ff_vp3_idct_neon(DCTELEM *data); | |||||
| void ff_vp3_idct_put_neon(uint8_t *dest, int line_size, DCTELEM *data); | |||||
| void ff_vp3_idct_add_neon(uint8_t *dest, int line_size, DCTELEM *data); | |||||
| void ff_vp3_idct_dc_add_neon(uint8_t *dest, int line_size, const DCTELEM *data); | |||||
| void ff_clear_block_neon(DCTELEM *block); | void ff_clear_block_neon(DCTELEM *block); | ||||
| void ff_clear_blocks_neon(DCTELEM *blocks); | void ff_clear_blocks_neon(DCTELEM *blocks); | ||||
| @@ -147,9 +142,6 @@ void ff_avg_h264_chroma_mc8_neon(uint8_t *, uint8_t *, int, int, int, int); | |||||
| void ff_avg_h264_chroma_mc4_neon(uint8_t *, uint8_t *, int, int, int, int); | void ff_avg_h264_chroma_mc4_neon(uint8_t *, uint8_t *, int, int, int, int); | ||||
| void ff_avg_h264_chroma_mc2_neon(uint8_t *, uint8_t *, int, int, int, int); | void ff_avg_h264_chroma_mc2_neon(uint8_t *, uint8_t *, int, int, int, int); | ||||
| void ff_vp3_v_loop_filter_neon(uint8_t *, int, int *); | |||||
| void ff_vp3_h_loop_filter_neon(uint8_t *, int, int *); | |||||
| void ff_vector_fmul_window_neon(float *dst, const float *src0, | void ff_vector_fmul_window_neon(float *dst, const float *src0, | ||||
| const float *src1, const float *win, int len); | const float *src1, const float *win, int len); | ||||
| void ff_vector_fmul_scalar_neon(float *dst, const float *src, float mul, | void ff_vector_fmul_scalar_neon(float *dst, const float *src, float mul, | ||||
| @@ -186,13 +178,6 @@ void ff_dsputil_init_neon(DSPContext *c, AVCodecContext *avctx) | |||||
| c->idct_add = ff_simple_idct_add_neon; | c->idct_add = ff_simple_idct_add_neon; | ||||
| c->idct = ff_simple_idct_neon; | c->idct = ff_simple_idct_neon; | ||||
| c->idct_permutation_type = FF_PARTTRANS_IDCT_PERM; | c->idct_permutation_type = FF_PARTTRANS_IDCT_PERM; | ||||
| } else if ((CONFIG_VP3_DECODER || CONFIG_VP5_DECODER || | |||||
| CONFIG_VP6_DECODER) && | |||||
| avctx->idct_algo == FF_IDCT_VP3) { | |||||
| c->idct_put = ff_vp3_idct_put_neon; | |||||
| c->idct_add = ff_vp3_idct_add_neon; | |||||
| c->idct = ff_vp3_idct_neon; | |||||
| c->idct_permutation_type = FF_TRANSPOSE_IDCT_PERM; | |||||
| } | } | ||||
| } | } | ||||
| @@ -319,12 +304,6 @@ void ff_dsputil_init_neon(DSPContext *c, AVCodecContext *avctx) | |||||
| c->avg_h264_qpel_pixels_tab[1][15] = ff_avg_h264_qpel8_mc33_neon; | c->avg_h264_qpel_pixels_tab[1][15] = ff_avg_h264_qpel8_mc33_neon; | ||||
| } | } | ||||
| if (CONFIG_VP3_DECODER) { | |||||
| c->vp3_v_loop_filter = ff_vp3_v_loop_filter_neon; | |||||
| c->vp3_h_loop_filter = ff_vp3_h_loop_filter_neon; | |||||
| c->vp3_idct_dc_add = ff_vp3_idct_dc_add_neon; | |||||
| } | |||||
| c->vector_fmul_window = ff_vector_fmul_window_neon; | c->vector_fmul_window = ff_vector_fmul_window_neon; | ||||
| c->vector_fmul_scalar = ff_vector_fmul_scalar_neon; | c->vector_fmul_scalar = ff_vector_fmul_scalar_neon; | ||||
| c->butterflies_float = ff_butterflies_float_neon; | c->butterflies_float = ff_butterflies_float_neon; | ||||
| @@ -0,0 +1,45 @@ | |||||
| /* | |||||
| * This file is part of FFmpeg. | |||||
| * | |||||
| * FFmpeg is free software; you can redistribute it and/or | |||||
| * modify it under the terms of the GNU Lesser General Public | |||||
| * License as published by the Free Software Foundation; either | |||||
| * version 2.1 of the License, or (at your option) any later version. | |||||
| * | |||||
| * FFmpeg is distributed in the hope that it will be useful, | |||||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |||||
| * Lesser General Public License for more details. | |||||
| * | |||||
| * You should have received a copy of the GNU Lesser General Public | |||||
| * License along with FFmpeg; if not, write to the Free Software | |||||
| * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |||||
| */ | |||||
| #include <stdint.h> | |||||
| #include "libavutil/attributes.h" | |||||
| #include "libavutil/cpu.h" | |||||
| #include "libavutil/arm/cpu.h" | |||||
| #include "libavcodec/vp3dsp.h" | |||||
| void ff_vp3_idct_put_neon(uint8_t *dest, int line_size, DCTELEM *data); | |||||
| void ff_vp3_idct_add_neon(uint8_t *dest, int line_size, DCTELEM *data); | |||||
| void ff_vp3_idct_dc_add_neon(uint8_t *dest, int line_size, const DCTELEM *data); | |||||
| void ff_vp3_v_loop_filter_neon(uint8_t *, int, int *); | |||||
| void ff_vp3_h_loop_filter_neon(uint8_t *, int, int *); | |||||
| av_cold void ff_vp3dsp_init_arm(VP3DSPContext *c, int flags) | |||||
| { | |||||
| int cpu_flags = av_get_cpu_flags(); | |||||
| if (have_neon(cpu_flags)) { | |||||
| c->idct_put = ff_vp3_idct_put_neon; | |||||
| c->idct_add = ff_vp3_idct_add_neon; | |||||
| c->idct_dc_add = ff_vp3_idct_dc_add_neon; | |||||
| c->v_loop_filter = ff_vp3_v_loop_filter_neon; | |||||
| c->h_loop_filter = ff_vp3_h_loop_filter_neon; | |||||
| c->idct_perm = FF_TRANSPOSE_IDCT_PERM; | |||||
| } | |||||
| } | |||||
| @@ -260,32 +260,6 @@ endfunc | |||||
| VP3_IDCT_END row | VP3_IDCT_END row | ||||
| VP3_IDCT_END col | VP3_IDCT_END col | ||||
| function ff_vp3_idct_neon, export=1 | |||||
| mov ip, lr | |||||
| mov r2, r0 | |||||
| bl vp3_idct_start_neon | |||||
| bl vp3_idct_end_row_neon | |||||
| mov r3, #8 | |||||
| bl vp3_idct_core_neon | |||||
| bl vp3_idct_end_col_neon | |||||
| mov lr, ip | |||||
| vpop {d8-d15} | |||||
| vshr.s16 q8, q8, #4 | |||||
| vshr.s16 q9, q9, #4 | |||||
| vshr.s16 q10, q10, #4 | |||||
| vshr.s16 q11, q11, #4 | |||||
| vshr.s16 q12, q12, #4 | |||||
| vst1.64 {d16-d19}, [r0,:128]! | |||||
| vshr.s16 q13, q13, #4 | |||||
| vshr.s16 q14, q14, #4 | |||||
| vst1.64 {d20-d23}, [r0,:128]! | |||||
| vshr.s16 q15, q15, #4 | |||||
| vst1.64 {d24-d27}, [r0,:128]! | |||||
| vst1.64 {d28-d31}, [r0,:128]! | |||||
| bx lr | |||||
| endfunc | |||||
| function ff_vp3_idct_put_neon, export=1 | function ff_vp3_idct_put_neon, export=1 | ||||
| mov ip, lr | mov ip, lr | ||||
| bl vp3_idct_start_neon | bl vp3_idct_start_neon | ||||
| @@ -2870,12 +2870,6 @@ av_cold void ff_dsputil_init(DSPContext* c, AVCodecContext *avctx) | |||||
| c->idct_add= ff_jref_idct_add; | c->idct_add= ff_jref_idct_add; | ||||
| c->idct = ff_j_rev_dct; | c->idct = ff_j_rev_dct; | ||||
| c->idct_permutation_type= FF_LIBMPEG2_IDCT_PERM; | c->idct_permutation_type= FF_LIBMPEG2_IDCT_PERM; | ||||
| }else if((CONFIG_VP3_DECODER || CONFIG_VP5_DECODER || CONFIG_VP6_DECODER ) && | |||||
| avctx->idct_algo==FF_IDCT_VP3){ | |||||
| c->idct_put= ff_vp3_idct_put_c; | |||||
| c->idct_add= ff_vp3_idct_add_c; | |||||
| c->idct = ff_vp3_idct_c; | |||||
| c->idct_permutation_type= FF_NO_IDCT_PERM; | |||||
| }else if(avctx->idct_algo==FF_IDCT_WMV2){ | }else if(avctx->idct_algo==FF_IDCT_WMV2){ | ||||
| c->idct_put= ff_wmv2_idct_put_c; | c->idct_put= ff_wmv2_idct_put_c; | ||||
| c->idct_add= ff_wmv2_idct_add_c; | c->idct_add= ff_wmv2_idct_add_c; | ||||
| @@ -3037,12 +3031,6 @@ av_cold void ff_dsputil_init(DSPContext* c, AVCodecContext *avctx) | |||||
| c->h263_v_loop_filter= h263_v_loop_filter_c; | c->h263_v_loop_filter= h263_v_loop_filter_c; | ||||
| } | } | ||||
| if (CONFIG_VP3_DECODER) { | |||||
| c->vp3_h_loop_filter= ff_vp3_h_loop_filter_c; | |||||
| c->vp3_v_loop_filter= ff_vp3_v_loop_filter_c; | |||||
| c->vp3_idct_dc_add= ff_vp3_idct_dc_add_c; | |||||
| } | |||||
| c->h261_loop_filter= h261_loop_filter_c; | c->h261_loop_filter= h261_loop_filter_c; | ||||
| c->try_8x8basis= try_8x8basis_c; | c->try_8x8basis= try_8x8basis_c; | ||||
| @@ -108,15 +108,6 @@ PUTAVG_PIXELS(14) | |||||
| #define ff_put_pixels16x16_c ff_put_pixels16x16_8_c | #define ff_put_pixels16x16_c ff_put_pixels16x16_8_c | ||||
| #define ff_avg_pixels16x16_c ff_avg_pixels16x16_8_c | #define ff_avg_pixels16x16_c ff_avg_pixels16x16_8_c | ||||
| /* VP3 DSP functions */ | |||||
| void ff_vp3_idct_c(DCTELEM *block/* align 16*/); | |||||
| void ff_vp3_idct_put_c(uint8_t *dest/*align 8*/, int line_size, DCTELEM *block/*align 16*/); | |||||
| void ff_vp3_idct_add_c(uint8_t *dest/*align 8*/, int line_size, DCTELEM *block/*align 16*/); | |||||
| void ff_vp3_idct_dc_add_c(uint8_t *dest/*align 8*/, int line_size, const DCTELEM *block/*align 16*/); | |||||
| void ff_vp3_v_loop_filter_c(uint8_t *src, int stride, int *bounding_values); | |||||
| void ff_vp3_h_loop_filter_c(uint8_t *src, int stride, int *bounding_values); | |||||
| /* EA functions */ | /* EA functions */ | ||||
| void ff_ea_idct_put_c(uint8_t *dest, int linesize, DCTELEM *block); | void ff_ea_idct_put_c(uint8_t *dest, int linesize, DCTELEM *block); | ||||
| @@ -401,10 +392,6 @@ typedef struct DSPContext { | |||||
| void (*x8_v_loop_filter)(uint8_t *src, int stride, int qscale); | void (*x8_v_loop_filter)(uint8_t *src, int stride, int qscale); | ||||
| void (*x8_h_loop_filter)(uint8_t *src, int stride, int qscale); | void (*x8_h_loop_filter)(uint8_t *src, int stride, int qscale); | ||||
| void (*vp3_idct_dc_add)(uint8_t *dest/*align 8*/, int line_size, const DCTELEM *block/*align 16*/); | |||||
| void (*vp3_v_loop_filter)(uint8_t *src, int stride, int *bounding_values); | |||||
| void (*vp3_h_loop_filter)(uint8_t *src, int stride, int *bounding_values); | |||||
| /* assume len is a multiple of 4, and arrays are 16-byte aligned */ | /* assume len is a multiple of 4, and arrays are 16-byte aligned */ | ||||
| void (*vorbis_inverse_coupling)(float *mag, float *ang, int blocksize); | void (*vorbis_inverse_coupling)(float *mag, float *ang, int blocksize); | ||||
| void (*ac3_downmix)(float (*samples)[256], float (*matrix)[2], int out_ch, int in_ch, int len); | void (*ac3_downmix)(float (*samples)[256], float (*matrix)[2], int out_ch, int in_ch, int len); | ||||
| @@ -1,14 +1,13 @@ | |||||
| OBJS += ppc/dsputil_ppc.o \ | OBJS += ppc/dsputil_ppc.o \ | ||||
| OBJS-$(CONFIG_VP3DSP) += ppc/vp3dsp_altivec.o | |||||
| FFT-OBJS-$(HAVE_GNU_AS) += ppc/fft_altivec_s.o | FFT-OBJS-$(HAVE_GNU_AS) += ppc/fft_altivec_s.o | ||||
| ALTIVEC-OBJS-$(CONFIG_FFT) += ppc/fft_altivec.o \ | ALTIVEC-OBJS-$(CONFIG_FFT) += ppc/fft_altivec.o \ | ||||
| $(FFT-OBJS-yes) | $(FFT-OBJS-yes) | ||||
| ALTIVEC-OBJS-$(CONFIG_H264DSP) += ppc/h264_altivec.o | ALTIVEC-OBJS-$(CONFIG_H264DSP) += ppc/h264_altivec.o | ||||
| ALTIVEC-OBJS-$(CONFIG_MPEGAUDIODSP) += ppc/mpegaudiodec_altivec.o | ALTIVEC-OBJS-$(CONFIG_MPEGAUDIODSP) += ppc/mpegaudiodec_altivec.o | ||||
| ALTIVEC-OBJS-$(CONFIG_VC1_DECODER) += ppc/vc1dsp_altivec.o | ALTIVEC-OBJS-$(CONFIG_VC1_DECODER) += ppc/vc1dsp_altivec.o | ||||
| ALTIVEC-OBJS-$(CONFIG_VP3_DECODER) += ppc/vp3dsp_altivec.o | |||||
| ALTIVEC-OBJS-$(CONFIG_VP5_DECODER) += ppc/vp3dsp_altivec.o | |||||
| ALTIVEC-OBJS-$(CONFIG_VP6_DECODER) += ppc/vp3dsp_altivec.o | |||||
| ALTIVEC-OBJS-$(CONFIG_VP8_DECODER) += ppc/vp8dsp_altivec.o | ALTIVEC-OBJS-$(CONFIG_VP8_DECODER) += ppc/vp8dsp_altivec.o | ||||
| ALTIVEC-OBJS += ppc/dsputil_altivec.o \ | ALTIVEC-OBJS += ppc/dsputil_altivec.o \ | ||||
| @@ -36,10 +36,6 @@ void ff_gmc1_altivec(uint8_t *dst, uint8_t *src, int stride, int h, | |||||
| void ff_idct_put_altivec(uint8_t *dest, int line_size, int16_t *block); | void ff_idct_put_altivec(uint8_t *dest, int line_size, int16_t *block); | ||||
| void ff_idct_add_altivec(uint8_t *dest, int line_size, int16_t *block); | void ff_idct_add_altivec(uint8_t *dest, int line_size, int16_t *block); | ||||
| void ff_vp3_idct_altivec(DCTELEM *block); | |||||
| void ff_vp3_idct_put_altivec(uint8_t *dest, int line_size, DCTELEM *block); | |||||
| void ff_vp3_idct_add_altivec(uint8_t *dest, int line_size, DCTELEM *block); | |||||
| void ff_dsputil_h264_init_ppc(DSPContext* c, AVCodecContext *avctx); | void ff_dsputil_h264_init_ppc(DSPContext* c, AVCodecContext *avctx); | ||||
| void ff_dsputil_init_altivec(DSPContext* c, AVCodecContext *avctx); | void ff_dsputil_init_altivec(DSPContext* c, AVCodecContext *avctx); | ||||
| @@ -193,12 +193,6 @@ void ff_dsputil_init_ppc(DSPContext* c, AVCodecContext *avctx) | |||||
| c->idct_put = ff_idct_put_altivec; | c->idct_put = ff_idct_put_altivec; | ||||
| c->idct_add = ff_idct_add_altivec; | c->idct_add = ff_idct_add_altivec; | ||||
| c->idct_permutation_type = FF_TRANSPOSE_IDCT_PERM; | c->idct_permutation_type = FF_TRANSPOSE_IDCT_PERM; | ||||
| }else if((CONFIG_VP3_DECODER || CONFIG_VP5_DECODER || CONFIG_VP6_DECODER) && | |||||
| avctx->idct_algo==FF_IDCT_VP3){ | |||||
| c->idct_put = ff_vp3_idct_put_altivec; | |||||
| c->idct_add = ff_vp3_idct_add_altivec; | |||||
| c->idct = ff_vp3_idct_altivec; | |||||
| c->idct_permutation_type = FF_TRANSPOSE_IDCT_PERM; | |||||
| } | } | ||||
| } | } | ||||
| @@ -18,6 +18,13 @@ | |||||
| * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | ||||
| */ | */ | ||||
| #include "config.h" | |||||
| #include "libavutil/attributes.h" | |||||
| #include "libavutil/cpu.h" | |||||
| #include "libavcodec/vp3dsp.h" | |||||
| #if HAVE_ALTIVEC | |||||
| #include "libavutil/ppc/types_altivec.h" | #include "libavutil/ppc/types_altivec.h" | ||||
| #include "libavutil/ppc/util_altivec.h" | #include "libavutil/ppc/util_altivec.h" | ||||
| #include "libavcodec/dsputil.h" | #include "libavcodec/dsputil.h" | ||||
| @@ -107,25 +114,7 @@ static inline vec_s16 M16(vec_s16 a, vec_s16 C) | |||||
| #define ADD8(a) vec_add(a, eight) | #define ADD8(a) vec_add(a, eight) | ||||
| #define SHIFT4(a) vec_sra(a, four) | #define SHIFT4(a) vec_sra(a, four) | ||||
| void ff_vp3_idct_altivec(DCTELEM block[64]) | |||||
| { | |||||
| IDCT_START | |||||
| IDCT_1D(NOP, NOP) | |||||
| TRANSPOSE8(b0, b1, b2, b3, b4, b5, b6, b7); | |||||
| IDCT_1D(ADD8, SHIFT4) | |||||
| vec_st(b0, 0x00, block); | |||||
| vec_st(b1, 0x10, block); | |||||
| vec_st(b2, 0x20, block); | |||||
| vec_st(b3, 0x30, block); | |||||
| vec_st(b4, 0x40, block); | |||||
| vec_st(b5, 0x50, block); | |||||
| vec_st(b6, 0x60, block); | |||||
| vec_st(b7, 0x70, block); | |||||
| } | |||||
| void ff_vp3_idct_put_altivec(uint8_t *dst, int stride, DCTELEM block[64]) | |||||
| static void vp3_idct_put_altivec(uint8_t *dst, int stride, DCTELEM block[64]) | |||||
| { | { | ||||
| vec_u8 t; | vec_u8 t; | ||||
| IDCT_START | IDCT_START | ||||
| @@ -153,7 +142,7 @@ void ff_vp3_idct_put_altivec(uint8_t *dst, int stride, DCTELEM block[64]) | |||||
| PUT(b7) | PUT(b7) | ||||
| } | } | ||||
| void ff_vp3_idct_add_altivec(uint8_t *dst, int stride, DCTELEM block[64]) | |||||
| static void vp3_idct_add_altivec(uint8_t *dst, int stride, DCTELEM block[64]) | |||||
| { | { | ||||
| LOAD_ZERO; | LOAD_ZERO; | ||||
| vec_u8 t, vdst; | vec_u8 t, vdst; | ||||
| @@ -183,3 +172,16 @@ void ff_vp3_idct_add_altivec(uint8_t *dst, int stride, DCTELEM block[64]) | |||||
| ADD(b6) dst += stride; | ADD(b6) dst += stride; | ||||
| ADD(b7) | ADD(b7) | ||||
| } | } | ||||
| #endif /* HAVE_ALTIVEC */ | |||||
| av_cold void ff_vp3dsp_init_ppc(VP3DSPContext *c, int flags) | |||||
| { | |||||
| #if HAVE_ALTIVEC | |||||
| if (av_get_cpu_flags() & AV_CPU_FLAG_ALTIVEC) { | |||||
| c->idct_put = vp3_idct_put_altivec; | |||||
| c->idct_add = vp3_idct_add_altivec; | |||||
| c->idct_perm = FF_TRANSPOSE_IDCT_PERM; | |||||
| } | |||||
| #endif | |||||
| } | |||||
| @@ -91,11 +91,11 @@ static av_cold int init_vlcs(TSCC2Context *c) | |||||
| #define DCT1D(d0, d1, d2, d3, s0, s1, s2, s3, OP) \ | #define DCT1D(d0, d1, d2, d3, s0, s1, s2, s3, OP) \ | ||||
| OP(d0, 5 * ((s0) + (s1) + (s2)) + 2 * (s3)); \ | OP(d0, 5 * ((s0) + (s1) + (s2)) + 2 * (s3)); \ | ||||
| OP(d1, 5 * ((s0) - (s2) - (s3)) + 2 * (s1)); \ | OP(d1, 5 * ((s0) - (s2) - (s3)) + 2 * (s1)); \ | ||||
| OP(d2, 5 * ((s0) - (s2) + (s3)) - 2 * (s3)); \ | |||||
| OP(d2, 5 * ((s0) - (s2) + (s3)) - 2 * (s1)); \ | |||||
| OP(d3, 5 * ((s0) - (s1) + (s2)) - 2 * (s3)); \ | OP(d3, 5 * ((s0) - (s1) + (s2)) - 2 * (s3)); \ | ||||
| #define COL_OP(a, b) a = b | #define COL_OP(a, b) a = b | ||||
| #define ROW_OP(a, b) a = (((b) + 0x20) >> 6) + 0x80 | |||||
| #define ROW_OP(a, b) a = ((b) + 0x20) >> 6 | |||||
| static void tscc2_idct4_put(int *in, int q[3], uint8_t *dst, int stride) | static void tscc2_idct4_put(int *in, int q[3], uint8_t *dst, int stride) | ||||
| { | { | ||||
| @@ -158,7 +158,7 @@ static int tscc2_decode_mb(TSCC2Context *c, int *q, int vlc_set, | |||||
| } | } | ||||
| dc = (dc + prev_dc) & 0xFF; | dc = (dc + prev_dc) & 0xFF; | ||||
| prev_dc = dc; | prev_dc = dc; | ||||
| c->block[0] = dc - 0x80; | |||||
| c->block[0] = dc; | |||||
| nc = get_vlc2(gb, c->nc_vlc[vlc_set].table, 9, 1); | nc = get_vlc2(gb, c->nc_vlc[vlc_set].table, 9, 1); | ||||
| if (nc == -1) | if (nc == -1) | ||||
| @@ -40,6 +40,7 @@ | |||||
| #include "get_bits.h" | #include "get_bits.h" | ||||
| #include "vp3data.h" | #include "vp3data.h" | ||||
| #include "vp3dsp.h" | |||||
| #include "xiph.h" | #include "xiph.h" | ||||
| #include "thread.h" | #include "thread.h" | ||||
| @@ -135,6 +136,7 @@ typedef struct Vp3DecodeContext { | |||||
| AVFrame current_frame; | AVFrame current_frame; | ||||
| int keyframe; | int keyframe; | ||||
| DSPContext dsp; | DSPContext dsp; | ||||
| VP3DSPContext vp3dsp; | |||||
| int flipped_image; | int flipped_image; | ||||
| int last_slice_end; | int last_slice_end; | ||||
| int skip_loop_filter; | int skip_loop_filter; | ||||
| @@ -1302,14 +1304,14 @@ static void apply_loop_filter(Vp3DecodeContext *s, int plane, int ystart, int ye | |||||
| { | { | ||||
| /* do not perform left edge filter for left columns frags */ | /* do not perform left edge filter for left columns frags */ | ||||
| if (x > 0) { | if (x > 0) { | ||||
| s->dsp.vp3_h_loop_filter( | |||||
| s->vp3dsp.h_loop_filter( | |||||
| plane_data + 8*x, | plane_data + 8*x, | ||||
| stride, bounding_values); | stride, bounding_values); | ||||
| } | } | ||||
| /* do not perform top edge filter for top row fragments */ | /* do not perform top edge filter for top row fragments */ | ||||
| if (y > 0) { | if (y > 0) { | ||||
| s->dsp.vp3_v_loop_filter( | |||||
| s->vp3dsp.v_loop_filter( | |||||
| plane_data + 8*x, | plane_data + 8*x, | ||||
| stride, bounding_values); | stride, bounding_values); | ||||
| } | } | ||||
| @@ -1319,7 +1321,7 @@ static void apply_loop_filter(Vp3DecodeContext *s, int plane, int ystart, int ye | |||||
| * in this frame (it will be filtered in next iteration) */ | * in this frame (it will be filtered in next iteration) */ | ||||
| if ((x < width - 1) && | if ((x < width - 1) && | ||||
| (s->all_fragments[fragment + 1].coding_method == MODE_COPY)) { | (s->all_fragments[fragment + 1].coding_method == MODE_COPY)) { | ||||
| s->dsp.vp3_h_loop_filter( | |||||
| s->vp3dsp.h_loop_filter( | |||||
| plane_data + 8*x + 8, | plane_data + 8*x + 8, | ||||
| stride, bounding_values); | stride, bounding_values); | ||||
| } | } | ||||
| @@ -1329,7 +1331,7 @@ static void apply_loop_filter(Vp3DecodeContext *s, int plane, int ystart, int ye | |||||
| * in this frame (it will be filtered in the next row) */ | * in this frame (it will be filtered in the next row) */ | ||||
| if ((y < height - 1) && | if ((y < height - 1) && | ||||
| (s->all_fragments[fragment + width].coding_method == MODE_COPY)) { | (s->all_fragments[fragment + width].coding_method == MODE_COPY)) { | ||||
| s->dsp.vp3_v_loop_filter( | |||||
| s->vp3dsp.v_loop_filter( | |||||
| plane_data + 8*x + 8*stride, | plane_data + 8*x + 8*stride, | ||||
| stride, bounding_values); | stride, bounding_values); | ||||
| } | } | ||||
| @@ -1574,20 +1576,18 @@ static void render_slice(Vp3DecodeContext *s, int slice) | |||||
| if (s->all_fragments[i].coding_method == MODE_INTRA) { | if (s->all_fragments[i].coding_method == MODE_INTRA) { | ||||
| vp3_dequant(s, s->all_fragments + i, plane, 0, block); | vp3_dequant(s, s->all_fragments + i, plane, 0, block); | ||||
| if(s->avctx->idct_algo!=FF_IDCT_VP3) | |||||
| block[0] += 128<<3; | |||||
| s->dsp.idct_put( | |||||
| s->vp3dsp.idct_put( | |||||
| output_plane + first_pixel, | output_plane + first_pixel, | ||||
| stride, | stride, | ||||
| block); | block); | ||||
| } else { | } else { | ||||
| if (vp3_dequant(s, s->all_fragments + i, plane, 1, block)) { | if (vp3_dequant(s, s->all_fragments + i, plane, 1, block)) { | ||||
| s->dsp.idct_add( | |||||
| s->vp3dsp.idct_add( | |||||
| output_plane + first_pixel, | output_plane + first_pixel, | ||||
| stride, | stride, | ||||
| block); | block); | ||||
| } else { | } else { | ||||
| s->dsp.vp3_idct_dc_add(output_plane + first_pixel, stride, block); | |||||
| s->vp3dsp.idct_dc_add(output_plane + first_pixel, stride, block); | |||||
| } | } | ||||
| } | } | ||||
| } else { | } else { | ||||
| @@ -1670,10 +1670,10 @@ static av_cold int vp3_decode_init(AVCodecContext *avctx) | |||||
| if (avctx->codec_id != CODEC_ID_THEORA) | if (avctx->codec_id != CODEC_ID_THEORA) | ||||
| avctx->pix_fmt = PIX_FMT_YUV420P; | avctx->pix_fmt = PIX_FMT_YUV420P; | ||||
| avctx->chroma_sample_location = AVCHROMA_LOC_CENTER; | avctx->chroma_sample_location = AVCHROMA_LOC_CENTER; | ||||
| if(avctx->idct_algo==FF_IDCT_AUTO) | |||||
| avctx->idct_algo=FF_IDCT_VP3; | |||||
| ff_dsputil_init(&s->dsp, avctx); | ff_dsputil_init(&s->dsp, avctx); | ||||
| ff_vp3dsp_init(&s->vp3dsp, avctx->flags); | |||||
| ff_init_scantable_permutation(s->dsp.idct_permutation, s->vp3dsp.idct_perm); | |||||
| ff_init_scantable(s->dsp.idct_permutation, &s->scantable, ff_zigzag_direct); | ff_init_scantable(s->dsp.idct_permutation, &s->scantable, ff_zigzag_direct); | ||||
| /* initialize to an impossible value which will force a recalculation | /* initialize to an impossible value which will force a recalculation | ||||
| @@ -24,8 +24,10 @@ | |||||
| * source code. | * source code. | ||||
| */ | */ | ||||
| #include "libavutil/attributes.h" | |||||
| #include "avcodec.h" | #include "avcodec.h" | ||||
| #include "dsputil.h" | #include "dsputil.h" | ||||
| #include "vp3dsp.h" | |||||
| #define IdctAdjustBeforeShift 8 | #define IdctAdjustBeforeShift 8 | ||||
| #define xC1S7 64277 | #define xC1S7 64277 | ||||
| @@ -210,19 +212,16 @@ static av_always_inline void idct(uint8_t *dst, int stride, int16_t *input, int | |||||
| } | } | ||||
| } | } | ||||
| void ff_vp3_idct_c(DCTELEM *block/* align 16*/){ | |||||
| idct(NULL, 0, block, 0); | |||||
| } | |||||
| void ff_vp3_idct_put_c(uint8_t *dest/*align 8*/, int line_size, DCTELEM *block/*align 16*/){ | |||||
| static void vp3_idct_put_c(uint8_t *dest/*align 8*/, int line_size, DCTELEM *block/*align 16*/){ | |||||
| idct(dest, line_size, block, 1); | idct(dest, line_size, block, 1); | ||||
| } | } | ||||
| void ff_vp3_idct_add_c(uint8_t *dest/*align 8*/, int line_size, DCTELEM *block/*align 16*/){ | |||||
| static void vp3_idct_add_c(uint8_t *dest/*align 8*/, int line_size, DCTELEM *block/*align 16*/){ | |||||
| idct(dest, line_size, block, 2); | idct(dest, line_size, block, 2); | ||||
| } | } | ||||
| void ff_vp3_idct_dc_add_c(uint8_t *dest/*align 8*/, int line_size, const DCTELEM *block/*align 16*/){ | |||||
| static void vp3_idct_dc_add_c(uint8_t *dest/*align 8*/, int line_size, | |||||
| const DCTELEM *block/*align 16*/){ | |||||
| int i, dc = (block[0] + 15) >> 5; | int i, dc = (block[0] + 15) >> 5; | ||||
| for(i = 0; i < 8; i++){ | for(i = 0; i < 8; i++){ | ||||
| @@ -238,7 +237,8 @@ void ff_vp3_idct_dc_add_c(uint8_t *dest/*align 8*/, int line_size, const DCTELEM | |||||
| } | } | ||||
| } | } | ||||
| void ff_vp3_v_loop_filter_c(uint8_t *first_pixel, int stride, int *bounding_values) | |||||
| static void vp3_v_loop_filter_c(uint8_t *first_pixel, int stride, | |||||
| int *bounding_values) | |||||
| { | { | ||||
| unsigned char *end; | unsigned char *end; | ||||
| int filter_value; | int filter_value; | ||||
| @@ -254,7 +254,8 @@ void ff_vp3_v_loop_filter_c(uint8_t *first_pixel, int stride, int *bounding_valu | |||||
| } | } | ||||
| } | } | ||||
| void ff_vp3_h_loop_filter_c(uint8_t *first_pixel, int stride, int *bounding_values) | |||||
| static void vp3_h_loop_filter_c(uint8_t *first_pixel, int stride, | |||||
| int *bounding_values) | |||||
| { | { | ||||
| unsigned char *end; | unsigned char *end; | ||||
| int filter_value; | int filter_value; | ||||
| @@ -268,3 +269,21 @@ void ff_vp3_h_loop_filter_c(uint8_t *first_pixel, int stride, int *bounding_valu | |||||
| first_pixel[ 0] = av_clip_uint8(first_pixel[ 0] - filter_value); | first_pixel[ 0] = av_clip_uint8(first_pixel[ 0] - filter_value); | ||||
| } | } | ||||
| } | } | ||||
| av_cold void ff_vp3dsp_init(VP3DSPContext *c, int flags) | |||||
| { | |||||
| c->idct_put = vp3_idct_put_c; | |||||
| c->idct_add = vp3_idct_add_c; | |||||
| c->idct_dc_add = vp3_idct_dc_add_c; | |||||
| c->v_loop_filter = vp3_v_loop_filter_c; | |||||
| c->h_loop_filter = vp3_h_loop_filter_c; | |||||
| c->idct_perm = FF_NO_IDCT_PERM; | |||||
| if (ARCH_ARM) | |||||
| ff_vp3dsp_init_arm(c, flags); | |||||
| if (ARCH_PPC) | |||||
| ff_vp3dsp_init_ppc(c, flags); | |||||
| if (ARCH_X86) | |||||
| ff_vp3dsp_init_x86(c, flags); | |||||
| } | |||||
| @@ -0,0 +1,40 @@ | |||||
| /* | |||||
| * This file is part of FFmpeg. | |||||
| * | |||||
| * FFmpeg is free software; you can redistribute it and/or | |||||
| * modify it under the terms of the GNU Lesser General Public | |||||
| * License as published by the Free Software Foundation; either | |||||
| * version 2.1 of the License, or (at your option) any later version. | |||||
| * | |||||
| * FFmpeg is distributed in the hope that it will be useful, | |||||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |||||
| * Lesser General Public License for more details. | |||||
| * | |||||
| * You should have received a copy of the GNU Lesser General Public | |||||
| * License along with FFmpeg; if not, write to the Free Software | |||||
| * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |||||
| */ | |||||
| #ifndef AVCODEC_VP3DSP_H | |||||
| #define AVCODEC_VP3DSP_H | |||||
| #include <stdint.h> | |||||
| #include "dsputil.h" | |||||
| typedef struct VP3DSPContext { | |||||
| void (*idct_put)(uint8_t *dest, int line_size, DCTELEM *block); | |||||
| void (*idct_add)(uint8_t *dest, int line_size, DCTELEM *block); | |||||
| void (*idct_dc_add)(uint8_t *dest, int line_size, const DCTELEM *block); | |||||
| void (*v_loop_filter)(uint8_t *src, int stride, int *bounding_values); | |||||
| void (*h_loop_filter)(uint8_t *src, int stride, int *bounding_values); | |||||
| int idct_perm; | |||||
| } VP3DSPContext; | |||||
| void ff_vp3dsp_init(VP3DSPContext *c, int flags); | |||||
| void ff_vp3dsp_init_arm(VP3DSPContext *c, int flags); | |||||
| void ff_vp3dsp_init_ppc(VP3DSPContext *c, int flags); | |||||
| void ff_vp3dsp_init_x86(VP3DSPContext *c, int flags); | |||||
| #endif /* AVCODEC_VP3DSP_H */ | |||||
| @@ -411,7 +411,7 @@ static void vp56_decode_mb(VP56Context *s, int row, int col, int is_alpha) | |||||
| case VP56_MB_INTRA: | case VP56_MB_INTRA: | ||||
| for (b=0; b<b_max; b++) { | for (b=0; b<b_max; b++) { | ||||
| plane = ff_vp56_b2p[b+ab]; | plane = ff_vp56_b2p[b+ab]; | ||||
| s->dsp.idct_put(frame_current->data[plane] + s->block_offset[b], | |||||
| s->vp3dsp.idct_put(frame_current->data[plane] + s->block_offset[b], | |||||
| s->stride[plane], s->block_coeff[b]); | s->stride[plane], s->block_coeff[b]); | ||||
| } | } | ||||
| break; | break; | ||||
| @@ -424,7 +424,7 @@ static void vp56_decode_mb(VP56Context *s, int row, int col, int is_alpha) | |||||
| s->dsp.put_pixels_tab[1][0](frame_current->data[plane] + off, | s->dsp.put_pixels_tab[1][0](frame_current->data[plane] + off, | ||||
| frame_ref->data[plane] + off, | frame_ref->data[plane] + off, | ||||
| s->stride[plane], 8); | s->stride[plane], 8); | ||||
| s->dsp.idct_add(frame_current->data[plane] + off, | |||||
| s->vp3dsp.idct_add(frame_current->data[plane] + off, | |||||
| s->stride[plane], s->block_coeff[b]); | s->stride[plane], s->block_coeff[b]); | ||||
| } | } | ||||
| break; | break; | ||||
| @@ -442,7 +442,7 @@ static void vp56_decode_mb(VP56Context *s, int row, int col, int is_alpha) | |||||
| plane = ff_vp56_b2p[b+ab]; | plane = ff_vp56_b2p[b+ab]; | ||||
| vp56_mc(s, b, plane, frame_ref->data[plane], s->stride[plane], | vp56_mc(s, b, plane, frame_ref->data[plane], s->stride[plane], | ||||
| 16*col+x_off, 16*row+y_off); | 16*col+x_off, 16*row+y_off); | ||||
| s->dsp.idct_add(frame_current->data[plane] + s->block_offset[b], | |||||
| s->vp3dsp.idct_add(frame_current->data[plane] + s->block_offset[b], | |||||
| s->stride[plane], s->block_coeff[b]); | s->stride[plane], s->block_coeff[b]); | ||||
| } | } | ||||
| break; | break; | ||||
| @@ -666,10 +666,10 @@ av_cold void ff_vp56_init(AVCodecContext *avctx, int flip, int has_alpha) | |||||
| s->avctx = avctx; | s->avctx = avctx; | ||||
| avctx->pix_fmt = has_alpha ? PIX_FMT_YUVA420P : PIX_FMT_YUV420P; | avctx->pix_fmt = has_alpha ? PIX_FMT_YUVA420P : PIX_FMT_YUV420P; | ||||
| if (avctx->idct_algo == FF_IDCT_AUTO) | |||||
| avctx->idct_algo = FF_IDCT_VP3; | |||||
| ff_dsputil_init(&s->dsp, avctx); | ff_dsputil_init(&s->dsp, avctx); | ||||
| ff_vp3dsp_init(&s->vp3dsp, avctx->flags); | |||||
| ff_vp56dsp_init(&s->vp56dsp, avctx->codec->id); | ff_vp56dsp_init(&s->vp56dsp, avctx->codec->id); | ||||
| ff_init_scantable_permutation(s->dsp.idct_permutation, s->vp3dsp.idct_perm); | |||||
| ff_init_scantable(s->dsp.idct_permutation, &s->scantable,ff_zigzag_direct); | ff_init_scantable(s->dsp.idct_permutation, &s->scantable,ff_zigzag_direct); | ||||
| for (i=0; i<4; i++) { | for (i=0; i<4; i++) { | ||||
| @@ -30,6 +30,7 @@ | |||||
| #include "dsputil.h" | #include "dsputil.h" | ||||
| #include "get_bits.h" | #include "get_bits.h" | ||||
| #include "bytestream.h" | #include "bytestream.h" | ||||
| #include "vp3dsp.h" | |||||
| #include "vp56dsp.h" | #include "vp56dsp.h" | ||||
| typedef struct vp56_context VP56Context; | typedef struct vp56_context VP56Context; | ||||
| @@ -91,6 +92,7 @@ typedef struct { | |||||
| struct vp56_context { | struct vp56_context { | ||||
| AVCodecContext *avctx; | AVCodecContext *avctx; | ||||
| DSPContext dsp; | DSPContext dsp; | ||||
| VP3DSPContext vp3dsp; | |||||
| VP56DSPContext vp56dsp; | VP56DSPContext vp56dsp; | ||||
| ScanTable scantable; | ScanTable scantable; | ||||
| AVFrame frames[4]; | AVFrame frames[4]; | ||||
| @@ -1,5 +1,6 @@ | |||||
| OBJS-$(CONFIG_MLP_DECODER) += x86/mlpdsp.o | OBJS-$(CONFIG_MLP_DECODER) += x86/mlpdsp.o | ||||
| OBJS-$(CONFIG_TRUEHD_DECODER) += x86/mlpdsp.o | OBJS-$(CONFIG_TRUEHD_DECODER) += x86/mlpdsp.o | ||||
| OBJS-$(CONFIG_VP3DSP) += x86/vp3dsp_init.o | |||||
| OBJS-$(CONFIG_XMM_CLOBBER_TEST) += x86/w64xmmtest.o | OBJS-$(CONFIG_XMM_CLOBBER_TEST) += x86/w64xmmtest.o | ||||
| MMX-OBJS += x86/dsputil_mmx.o \ | MMX-OBJS += x86/dsputil_mmx.o \ | ||||
| @@ -67,10 +68,8 @@ YASM-OBJS-$(CONFIG_RV40_DECODER) += x86/rv34dsp.o \ | |||||
| x86/rv40dsp.o | x86/rv40dsp.o | ||||
| YASM-OBJS-$(CONFIG_V210_DECODER) += x86/v210.o | YASM-OBJS-$(CONFIG_V210_DECODER) += x86/v210.o | ||||
| YASM-OBJS-$(CONFIG_VC1_DECODER) += x86/vc1dsp_yasm.o | YASM-OBJS-$(CONFIG_VC1_DECODER) += x86/vc1dsp_yasm.o | ||||
| YASM-OBJS-$(CONFIG_VP3_DECODER) += x86/vp3dsp.o | |||||
| YASM-OBJS-$(CONFIG_VP5_DECODER) += x86/vp3dsp.o | |||||
| YASM-OBJS-$(CONFIG_VP6_DECODER) += x86/vp3dsp.o \ | |||||
| x86/vp56dsp.o | |||||
| YASM-OBJS-$(CONFIG_VP3DSP) += x86/vp3dsp.o | |||||
| YASM-OBJS-$(CONFIG_VP6_DECODER) += x86/vp56dsp.o | |||||
| YASM-OBJS-$(CONFIG_VP8_DECODER) += x86/vp8dsp.o | YASM-OBJS-$(CONFIG_VP8_DECODER) += x86/vp8dsp.o | ||||
| YASM-OBJS += x86/dsputil_yasm.o \ | YASM-OBJS += x86/dsputil_yasm.o \ | ||||
| @@ -2574,20 +2574,6 @@ static void vector_clipf_sse(float *dst, const float *src, | |||||
| ); | ); | ||||
| } | } | ||||
| void ff_vp3_idct_mmx(int16_t *input_data); | |||||
| void ff_vp3_idct_put_mmx(uint8_t *dest, int line_size, DCTELEM *block); | |||||
| void ff_vp3_idct_add_mmx(uint8_t *dest, int line_size, DCTELEM *block); | |||||
| void ff_vp3_idct_dc_add_mmx2(uint8_t *dest, int line_size, | |||||
| const DCTELEM *block); | |||||
| void ff_vp3_v_loop_filter_mmx2(uint8_t *src, int stride, int *bounding_values); | |||||
| void ff_vp3_h_loop_filter_mmx2(uint8_t *src, int stride, int *bounding_values); | |||||
| void ff_vp3_idct_sse2(int16_t *input_data); | |||||
| void ff_vp3_idct_put_sse2(uint8_t *dest, int line_size, DCTELEM *block); | |||||
| void ff_vp3_idct_add_sse2(uint8_t *dest, int line_size, DCTELEM *block); | |||||
| int32_t ff_scalarproduct_int16_mmx2(const int16_t *v1, const int16_t *v2, | int32_t ff_scalarproduct_int16_mmx2(const int16_t *v1, const int16_t *v2, | ||||
| int order); | int order); | ||||
| int32_t ff_scalarproduct_int16_sse2(const int16_t *v1, const int16_t *v2, | int32_t ff_scalarproduct_int16_sse2(const int16_t *v1, const int16_t *v2, | ||||
| @@ -2782,14 +2768,7 @@ static void dsputil_init_mmx2(DSPContext *c, AVCodecContext *avctx, | |||||
| c->avg_pixels_tab[0][3] = avg_pixels16_xy2_mmx2; | c->avg_pixels_tab[0][3] = avg_pixels16_xy2_mmx2; | ||||
| c->avg_pixels_tab[1][3] = avg_pixels8_xy2_mmx2; | c->avg_pixels_tab[1][3] = avg_pixels8_xy2_mmx2; | ||||
| } | } | ||||
| if (CONFIG_VP3_DECODER && HAVE_YASM) { | |||||
| c->vp3_v_loop_filter = ff_vp3_v_loop_filter_mmx2; | |||||
| c->vp3_h_loop_filter = ff_vp3_h_loop_filter_mmx2; | |||||
| } | |||||
| } | } | ||||
| if (CONFIG_VP3_DECODER && HAVE_YASM) | |||||
| c->vp3_idct_dc_add = ff_vp3_idct_dc_add_mmx2; | |||||
| if (CONFIG_VP3_DECODER && (avctx->codec_id == CODEC_ID_VP3 || | if (CONFIG_VP3_DECODER && (avctx->codec_id == CODEC_ID_VP3 || | ||||
| avctx->codec_id == CODEC_ID_THEORA)) { | avctx->codec_id == CODEC_ID_THEORA)) { | ||||
| @@ -3165,20 +3144,6 @@ void ff_dsputil_init_mmx(DSPContext *c, AVCodecContext *avctx) | |||||
| } | } | ||||
| c->idct_permutation_type = FF_LIBMPEG2_IDCT_PERM; | c->idct_permutation_type = FF_LIBMPEG2_IDCT_PERM; | ||||
| #endif | #endif | ||||
| } else if ((CONFIG_VP3_DECODER || CONFIG_VP5_DECODER || | |||||
| CONFIG_VP6_DECODER) && | |||||
| idct_algo == FF_IDCT_VP3 && HAVE_YASM) { | |||||
| if (mm_flags & AV_CPU_FLAG_SSE2) { | |||||
| c->idct_put = ff_vp3_idct_put_sse2; | |||||
| c->idct_add = ff_vp3_idct_add_sse2; | |||||
| c->idct = ff_vp3_idct_sse2; | |||||
| c->idct_permutation_type = FF_TRANSPOSE_IDCT_PERM; | |||||
| } else { | |||||
| c->idct_put = ff_vp3_idct_put_mmx; | |||||
| c->idct_add = ff_vp3_idct_add_mmx; | |||||
| c->idct = ff_vp3_idct_mmx; | |||||
| c->idct_permutation_type = FF_PARTTRANS_IDCT_PERM; | |||||
| } | |||||
| } else if (idct_algo == FF_IDCT_CAVS) { | } else if (idct_algo == FF_IDCT_CAVS) { | ||||
| c->idct_permutation_type = FF_TRANSPOSE_IDCT_PERM; | c->idct_permutation_type = FF_TRANSPOSE_IDCT_PERM; | ||||
| } else if (idct_algo == FF_IDCT_XVIDMMX) { | } else if (idct_algo == FF_IDCT_XVIDMMX) { | ||||
| @@ -524,10 +524,6 @@ cglobal vp3_h_loop_filter_mmx2, 3, 4 | |||||
| %endmacro | %endmacro | ||||
| %macro vp3_idct_funcs 3 | %macro vp3_idct_funcs 3 | ||||
| cglobal vp3_idct_%1, 1, 1, %2 | |||||
| VP3_IDCT_%1 r0 | |||||
| RET | |||||
| cglobal vp3_idct_put_%1, 3, %3, %2 | cglobal vp3_idct_put_%1, 3, %3, %2 | ||||
| VP3_IDCT_%1 r2 | VP3_IDCT_%1 r2 | ||||
| %if ARCH_X86_64 | %if ARCH_X86_64 | ||||
| @@ -0,0 +1,65 @@ | |||||
| /* | |||||
| * This file is part of FFmpeg. | |||||
| * | |||||
| * FFmpeg is free software; you can redistribute it and/or | |||||
| * modify it under the terms of the GNU Lesser General Public | |||||
| * License as published by the Free Software Foundation; either | |||||
| * version 2.1 of the License, or (at your option) any later version. | |||||
| * | |||||
| * FFmpeg is distributed in the hope that it will be useful, | |||||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |||||
| * Lesser General Public License for more details. | |||||
| * | |||||
| * You should have received a copy of the GNU Lesser General Public | |||||
| * License along with FFmpeg; if not, write to the Free Software | |||||
| * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |||||
| */ | |||||
| #include <stdint.h> | |||||
| #include "libavutil/attributes.h" | |||||
| #include "libavutil/cpu.h" | |||||
| #include "libavcodec/avcodec.h" | |||||
| #include "libavcodec/vp3dsp.h" | |||||
| #include "config.h" | |||||
| void ff_vp3_idct_put_mmx(uint8_t *dest, int line_size, DCTELEM *block); | |||||
| void ff_vp3_idct_add_mmx(uint8_t *dest, int line_size, DCTELEM *block); | |||||
| void ff_vp3_idct_put_sse2(uint8_t *dest, int line_size, DCTELEM *block); | |||||
| void ff_vp3_idct_add_sse2(uint8_t *dest, int line_size, DCTELEM *block); | |||||
| void ff_vp3_idct_dc_add_mmx2(uint8_t *dest, int line_size, | |||||
| const DCTELEM *block); | |||||
| void ff_vp3_v_loop_filter_mmx2(uint8_t *src, int stride, int *bounding_values); | |||||
| void ff_vp3_h_loop_filter_mmx2(uint8_t *src, int stride, int *bounding_values); | |||||
| av_cold void ff_vp3dsp_init_x86(VP3DSPContext *c, int flags) | |||||
| { | |||||
| #if HAVE_YASM | |||||
| int cpuflags = av_get_cpu_flags(); | |||||
| if (HAVE_MMX && cpuflags & AV_CPU_FLAG_MMX) { | |||||
| c->idct_put = ff_vp3_idct_put_mmx; | |||||
| c->idct_add = ff_vp3_idct_add_mmx; | |||||
| c->idct_perm = FF_PARTTRANS_IDCT_PERM; | |||||
| } | |||||
| if (HAVE_MMX2 && cpuflags & AV_CPU_FLAG_MMX2) { | |||||
| c->idct_dc_add = ff_vp3_idct_dc_add_mmx2; | |||||
| if (!(flags & CODEC_FLAG_BITEXACT)) { | |||||
| c->v_loop_filter = ff_vp3_v_loop_filter_mmx2; | |||||
| c->h_loop_filter = ff_vp3_h_loop_filter_mmx2; | |||||
| } | |||||
| } | |||||
| if (cpuflags & AV_CPU_FLAG_SSE2) { | |||||
| c->idct_put = ff_vp3_idct_put_sse2; | |||||
| c->idct_add = ff_vp3_idct_add_sse2; | |||||
| c->idct_perm = FF_TRANSPOSE_IDCT_PERM; | |||||
| } | |||||
| #endif | |||||
| } | |||||
| @@ -76,21 +76,22 @@ int ff_win32_open(const char *filename_utf8, int oflag, int pmode) | |||||
| #if !HAVE_INET_ATON | #if !HAVE_INET_ATON | ||||
| #include <stdlib.h> | #include <stdlib.h> | ||||
| int ff_inet_aton (const char * str, struct in_addr * add) | |||||
| int ff_inet_aton(const char *str, struct in_addr *add) | |||||
| { | { | ||||
| unsigned int add1 = 0, add2 = 0, add3 = 0, add4 = 0; | unsigned int add1 = 0, add2 = 0, add3 = 0, add4 = 0; | ||||
| if (sscanf(str, "%d.%d.%d.%d", &add1, &add2, &add3, &add4) != 4) | if (sscanf(str, "%d.%d.%d.%d", &add1, &add2, &add3, &add4) != 4) | ||||
| return 0; | return 0; | ||||
| if (!add1 || (add1|add2|add3|add4) > 255) return 0; | |||||
| if (!add1 || (add1 | add2 | add3 | add4) > 255) | |||||
| return 0; | |||||
| add->s_addr = htonl((add1 << 24) + (add2 << 16) + (add3 << 8) + add4); | add->s_addr = htonl((add1 << 24) + (add2 << 16) + (add3 << 8) + add4); | ||||
| return 1; | return 1; | ||||
| } | } | ||||
| #else | #else | ||||
| int ff_inet_aton (const char * str, struct in_addr * add) | |||||
| int ff_inet_aton(const char *str, struct in_addr *add) | |||||
| { | { | ||||
| return inet_aton(str, add); | return inet_aton(str, add); | ||||
| } | } | ||||
| @@ -98,7 +99,7 @@ int ff_inet_aton (const char * str, struct in_addr * add) | |||||
| #if !HAVE_GETADDRINFO | #if !HAVE_GETADDRINFO | ||||
| int ff_getaddrinfo(const char *node, const char *service, | int ff_getaddrinfo(const char *node, const char *service, | ||||
| const struct addrinfo *hints, struct addrinfo **res) | |||||
| const struct addrinfo *hints, struct addrinfo **res) | |||||
| { | { | ||||
| struct hostent *h = NULL; | struct hostent *h = NULL; | ||||
| struct addrinfo *ai; | struct addrinfo *ai; | ||||
| @@ -115,7 +116,7 @@ int ff_getaddrinfo(const char *node, const char *service, | |||||
| #endif | #endif | ||||
| *res = NULL; | *res = NULL; | ||||
| sin = av_mallocz(sizeof(struct sockaddr_in)); | |||||
| sin = av_mallocz(sizeof(struct sockaddr_in)); | |||||
| if (!sin) | if (!sin) | ||||
| return EAI_FAIL; | return EAI_FAIL; | ||||
| sin->sin_family = AF_INET; | sin->sin_family = AF_INET; | ||||
| @@ -134,9 +135,9 @@ int ff_getaddrinfo(const char *node, const char *service, | |||||
| memcpy(&sin->sin_addr, h->h_addr_list[0], sizeof(struct in_addr)); | memcpy(&sin->sin_addr, h->h_addr_list[0], sizeof(struct in_addr)); | ||||
| } | } | ||||
| } else { | } else { | ||||
| if (hints && (hints->ai_flags & AI_PASSIVE)) { | |||||
| if (hints && (hints->ai_flags & AI_PASSIVE)) | |||||
| sin->sin_addr.s_addr = INADDR_ANY; | sin->sin_addr.s_addr = INADDR_ANY; | ||||
| } else | |||||
| else | |||||
| sin->sin_addr.s_addr = INADDR_LOOPBACK; | sin->sin_addr.s_addr = INADDR_LOOPBACK; | ||||
| } | } | ||||
| @@ -151,16 +152,22 @@ int ff_getaddrinfo(const char *node, const char *service, | |||||
| return EAI_FAIL; | return EAI_FAIL; | ||||
| } | } | ||||
| *res = ai; | |||||
| ai->ai_family = AF_INET; | |||||
| *res = ai; | |||||
| ai->ai_family = AF_INET; | |||||
| ai->ai_socktype = hints ? hints->ai_socktype : 0; | ai->ai_socktype = hints ? hints->ai_socktype : 0; | ||||
| switch (ai->ai_socktype) { | switch (ai->ai_socktype) { | ||||
| case SOCK_STREAM: ai->ai_protocol = IPPROTO_TCP; break; | |||||
| case SOCK_DGRAM: ai->ai_protocol = IPPROTO_UDP; break; | |||||
| default: ai->ai_protocol = 0; break; | |||||
| case SOCK_STREAM: | |||||
| ai->ai_protocol = IPPROTO_TCP; | |||||
| break; | |||||
| case SOCK_DGRAM: | |||||
| ai->ai_protocol = IPPROTO_UDP; | |||||
| break; | |||||
| default: | |||||
| ai->ai_protocol = 0; | |||||
| break; | |||||
| } | } | ||||
| ai->ai_addr = (struct sockaddr *)sin; | |||||
| ai->ai_addr = (struct sockaddr *)sin; | |||||
| ai->ai_addrlen = sizeof(struct sockaddr_in); | ai->ai_addrlen = sizeof(struct sockaddr_in); | ||||
| if (hints && (hints->ai_flags & AI_CANONNAME)) | if (hints && (hints->ai_flags & AI_CANONNAME)) | ||||
| ai->ai_canonname = h ? av_strdup(h->h_name) : NULL; | ai->ai_canonname = h ? av_strdup(h->h_name) : NULL; | ||||
| @@ -223,7 +230,7 @@ int ff_getnameinfo(const struct sockaddr *sa, int salen, | |||||
| a = ntohl(sin->sin_addr.s_addr); | a = ntohl(sin->sin_addr.s_addr); | ||||
| snprintf(host, hostlen, "%d.%d.%d.%d", | snprintf(host, hostlen, "%d.%d.%d.%d", | ||||
| ((a >> 24) & 0xff), ((a >> 16) & 0xff), | ((a >> 24) & 0xff), ((a >> 16) & 0xff), | ||||
| ((a >> 8) & 0xff), ( a & 0xff)); | |||||
| ((a >> 8) & 0xff), (a & 0xff)); | |||||
| } | } | ||||
| } | } | ||||
| @@ -232,9 +239,9 @@ int ff_getnameinfo(const struct sockaddr *sa, int salen, | |||||
| if (!(flags & NI_NUMERICSERV)) | if (!(flags & NI_NUMERICSERV)) | ||||
| ent = getservbyport(sin->sin_port, flags & NI_DGRAM ? "udp" : "tcp"); | ent = getservbyport(sin->sin_port, flags & NI_DGRAM ? "udp" : "tcp"); | ||||
| if (ent) { | |||||
| if (ent) | |||||
| snprintf(serv, servlen, "%s", ent->s_name); | snprintf(serv, servlen, "%s", ent->s_name); | ||||
| } else | |||||
| else | |||||
| snprintf(serv, servlen, "%d", ntohs(sin->sin_port)); | snprintf(serv, servlen, "%d", ntohs(sin->sin_port)); | ||||
| } | } | ||||
| @@ -245,18 +252,28 @@ int ff_getnameinfo(const struct sockaddr *sa, int salen, | |||||
| #if !HAVE_GETADDRINFO || HAVE_WINSOCK2_H | #if !HAVE_GETADDRINFO || HAVE_WINSOCK2_H | ||||
| const char *ff_gai_strerror(int ecode) | const char *ff_gai_strerror(int ecode) | ||||
| { | { | ||||
| switch(ecode) { | |||||
| case EAI_AGAIN : return "Temporary failure in name resolution"; | |||||
| case EAI_BADFLAGS: return "Invalid flags for ai_flags"; | |||||
| case EAI_FAIL : return "A non-recoverable error occurred"; | |||||
| case EAI_FAMILY : return "The address family was not recognized or the address length was invalid for the specified family"; | |||||
| case EAI_MEMORY : return "Memory allocation failure"; | |||||
| switch (ecode) { | |||||
| case EAI_AGAIN: | |||||
| return "Temporary failure in name resolution"; | |||||
| case EAI_BADFLAGS: | |||||
| return "Invalid flags for ai_flags"; | |||||
| case EAI_FAIL: | |||||
| return "A non-recoverable error occurred"; | |||||
| case EAI_FAMILY: | |||||
| return "The address family was not recognized or the address " | |||||
| "length was invalid for the specified family"; | |||||
| case EAI_MEMORY: | |||||
| return "Memory allocation failure"; | |||||
| #if EAI_NODATA != EAI_NONAME | #if EAI_NODATA != EAI_NONAME | ||||
| case EAI_NODATA : return "No address associated with hostname"; | |||||
| case EAI_NODATA: | |||||
| return "No address associated with hostname"; | |||||
| #endif | #endif | ||||
| case EAI_NONAME : return "The name does not resolve for the supplied parameters"; | |||||
| case EAI_SERVICE: return "servname not supported for ai_socktype"; | |||||
| case EAI_SOCKTYPE: return "ai_socktype not supported"; | |||||
| case EAI_NONAME: | |||||
| return "The name does not resolve for the supplied parameters"; | |||||
| case EAI_SERVICE: | |||||
| return "servname not supported for ai_socktype"; | |||||
| case EAI_SOCKTYPE: | |||||
| return "ai_socktype not supported"; | |||||
| } | } | ||||
| return "Unknown error"; | return "Unknown error"; | ||||
| @@ -266,13 +283,13 @@ const char *ff_gai_strerror(int ecode) | |||||
| int ff_socket_nonblock(int socket, int enable) | int ff_socket_nonblock(int socket, int enable) | ||||
| { | { | ||||
| #if HAVE_WINSOCK2_H | #if HAVE_WINSOCK2_H | ||||
| u_long param = enable; | |||||
| return ioctlsocket(socket, FIONBIO, ¶m); | |||||
| u_long param = enable; | |||||
| return ioctlsocket(socket, FIONBIO, ¶m); | |||||
| #else | #else | ||||
| if (enable) | |||||
| return fcntl(socket, F_SETFL, fcntl(socket, F_GETFL) | O_NONBLOCK); | |||||
| else | |||||
| return fcntl(socket, F_SETFL, fcntl(socket, F_GETFL) & ~O_NONBLOCK); | |||||
| if (enable) | |||||
| return fcntl(socket, F_SETFL, fcntl(socket, F_GETFL) | O_NONBLOCK); | |||||
| else | |||||
| return fcntl(socket, F_SETFL, fcntl(socket, F_GETFL) & ~O_NONBLOCK); | |||||
| #endif | #endif | ||||
| } | } | ||||
| @@ -298,7 +315,7 @@ int ff_poll(struct pollfd *fds, nfds_t numfds, int timeout) | |||||
| FD_ZERO(&exception_set); | FD_ZERO(&exception_set); | ||||
| n = 0; | n = 0; | ||||
| for(i = 0; i < numfds; i++) { | |||||
| for (i = 0; i < numfds; i++) { | |||||
| if (fds[i].fd < 0) | if (fds[i].fd < 0) | ||||
| continue; | continue; | ||||
| #if !HAVE_WINSOCK2_H | #if !HAVE_WINSOCK2_H | ||||
| @@ -308,38 +325,43 @@ int ff_poll(struct pollfd *fds, nfds_t numfds, int timeout) | |||||
| } | } | ||||
| #endif | #endif | ||||
| if (fds[i].events & POLLIN) FD_SET(fds[i].fd, &read_set); | |||||
| if (fds[i].events & POLLOUT) FD_SET(fds[i].fd, &write_set); | |||||
| if (fds[i].events & POLLERR) FD_SET(fds[i].fd, &exception_set); | |||||
| if (fds[i].events & POLLIN) | |||||
| FD_SET(fds[i].fd, &read_set); | |||||
| if (fds[i].events & POLLOUT) | |||||
| FD_SET(fds[i].fd, &write_set); | |||||
| if (fds[i].events & POLLERR) | |||||
| FD_SET(fds[i].fd, &exception_set); | |||||
| if (fds[i].fd >= n) | if (fds[i].fd >= n) | ||||
| n = fds[i].fd + 1; | n = fds[i].fd + 1; | ||||
| }; | |||||
| } | |||||
| if (n == 0) | if (n == 0) | ||||
| /* Hey!? Nothing to poll, in fact!!! */ | /* Hey!? Nothing to poll, in fact!!! */ | ||||
| return 0; | return 0; | ||||
| if (timeout < 0) | |||||
| if (timeout < 0) { | |||||
| rc = select(n, &read_set, &write_set, &exception_set, NULL); | rc = select(n, &read_set, &write_set, &exception_set, NULL); | ||||
| else { | |||||
| struct timeval tv; | |||||
| tv.tv_sec = timeout / 1000; | |||||
| } else { | |||||
| struct timeval tv; | |||||
| tv.tv_sec = timeout / 1000; | |||||
| tv.tv_usec = 1000 * (timeout % 1000); | tv.tv_usec = 1000 * (timeout % 1000); | ||||
| rc = select(n, &read_set, &write_set, &exception_set, &tv); | |||||
| }; | |||||
| rc = select(n, &read_set, &write_set, &exception_set, &tv); | |||||
| } | |||||
| if (rc < 0) | if (rc < 0) | ||||
| return rc; | return rc; | ||||
| for(i = 0; i < numfds; i++) { | |||||
| for (i = 0; i < numfds; i++) { | |||||
| fds[i].revents = 0; | fds[i].revents = 0; | ||||
| if (FD_ISSET(fds[i].fd, &read_set)) fds[i].revents |= POLLIN; | |||||
| if (FD_ISSET(fds[i].fd, &write_set)) fds[i].revents |= POLLOUT; | |||||
| if (FD_ISSET(fds[i].fd, &exception_set)) fds[i].revents |= POLLERR; | |||||
| }; | |||||
| if (FD_ISSET(fds[i].fd, &read_set)) | |||||
| fds[i].revents |= POLLIN; | |||||
| if (FD_ISSET(fds[i].fd, &write_set)) | |||||
| fds[i].revents |= POLLOUT; | |||||
| if (FD_ISSET(fds[i].fd, &exception_set)) | |||||
| fds[i].revents |= POLLERR; | |||||
| } | |||||
| return rc; | return rc; | ||||
| } | } | ||||