Commit 034fc7bf authored by Michael Niedermayer's avatar Michael Niedermayer

Merge remote-tracking branch 'qatar/master'

* qatar/master: (22 commits)
  configure: enable memalign_hack automatically when needed
  swscale: unbreak the build on non-x86 systems.
  swscale: remove if(bitexact) branch from functions.
  swscale: remove if(canMMX2BeUsed) conditional.
  swscale: remove swScale_{c,MMX,MMX2} duplication.
  swscale: use emms_c().
  Move emms_c() from libavcodec to libavutil.
  tiff: set palette in the context when specified in TIFF_PAL tag
  rtsp: use strtoul to parse rtptime and seq values.
  pgssubdec: fix incorrect colors.
  dvdsubdec: fix incorrect colors.
  ape: Allow demuxing of files with metadata tags.
  swscale: remove dead macro WRITEBGR24OLD.
  swscale: remove AMD3DNOW "optimizations".
  swscale: remove duplicate code in ppc/ subdirectory.
  swscale: remove duplicated x86/ functions.
  swscale: force --enable-runtime-cpudetect and remove SWS_CPU_CAPS_*.
  vsrc_buffer.h: add file doxy
  vsrc_buffer: tweak error message in init()
  msmpeg4: reindent.
  ...
Merged-by: 's avatarMichael Niedermayer <michaelni@gmx.at>
parents d1adad3c 9bbd6a4c
...@@ -2859,11 +2859,6 @@ check_header X11/extensions/XvMClib.h ...@@ -2859,11 +2859,6 @@ check_header X11/extensions/XvMClib.h
check_struct dxva2api.h DXVA_PictureParameters wDecodedPictureIndex check_struct dxva2api.h DXVA_PictureParameters wDecodedPictureIndex
if ! enabled_any memalign memalign_hack posix_memalign malloc_aligned &&
enabled_any $need_memalign ; then
die "Error, no aligned memory allocator but SSE enabled, disable it or use --enable-memalign-hack."
fi
disabled zlib || check_lib zlib.h zlibVersion -lz || disable zlib disabled zlib || check_lib zlib.h zlibVersion -lz || disable zlib
disabled bzlib || check_lib2 bzlib.h BZ2_bzlibVersion -lbz2 || disable bzlib disabled bzlib || check_lib2 bzlib.h BZ2_bzlibVersion -lbz2 || disable bzlib
...@@ -3156,6 +3151,9 @@ check_deps $CONFIG_LIST \ ...@@ -3156,6 +3151,9 @@ check_deps $CONFIG_LIST \
enabled asm || { arch=c; disable $ARCH_LIST $ARCH_EXT_LIST; } enabled asm || { arch=c; disable $ARCH_LIST $ARCH_EXT_LIST; }
! enabled_any memalign posix_memalign malloc_aligned &&
enabled_any $need_memalign && enable memalign_hack
echo "install prefix $prefix" echo "install prefix $prefix"
echo "source path $source_path" echo "source path $source_path"
echo "C compiler $cc" echo "C compiler $cc"
......
...@@ -433,3 +433,49 @@ For more information about libx264 and the supported options see: ...@@ -433,3 +433,49 @@ For more information about libx264 and the supported options see:
@url{http://www.videolan.org/developers/x264.html} @url{http://www.videolan.org/developers/x264.html}
@c man end VIDEO ENCODERS @c man end VIDEO ENCODERS
@subheading Floating-Point-Only AC-3 Encoding Options
These options are only valid for the floating-point encoder and do not exist
for the fixed-point encoder due to the corresponding features not being
implemented in fixed-point.
@table @option
@item -channel_coupling @var{boolean}
Enables/Disables use of channel coupling, which is an optional AC-3 feature
that increases quality by combining high frequency information from multiple
channels into a single channel. The per-channel high frequency information is
sent with less accuracy in both the frequency and time domains. This allows
more bits to be used for lower frequencies while preserving enough information
to reconstruct the high frequencies. This option is enabled by default for the
floating-point encoder and should generally be left as enabled except for
testing purposes or to increase encoding speed.
@table @option
@item -1
@itemx auto
Selected by Encoder (default)
@item 0
@itemx off
Disable Channel Coupling
@item 1
@itemx on
Enable Channel Coupling
@end table
@item -cpl_start_band @var{number}
Coupling Start Band. Sets the channel coupling start band, from 1 to 15. If a
value higher than the bandwidth is used, it will be reduced to 1 less than the
coupling end band. If @var{auto} is used, the start band will be determined by
the encoder based on the bit rate, sample rate, and channel layout. This option
has no effect if channel coupling is disabled.
@table @option
@item -1
@itemx auto
Selected by Encoder (default)
@end table
@end table
@c man end ENCODERS
...@@ -269,8 +269,6 @@ OBJS-$(CONFIG_MPEG2VIDEO_ENCODER) += mpeg12enc.o mpegvideo_enc.o \ ...@@ -269,8 +269,6 @@ OBJS-$(CONFIG_MPEG2VIDEO_ENCODER) += mpeg12enc.o mpegvideo_enc.o \
mpegvideo.o error_resilience.o mpegvideo.o error_resilience.o
OBJS-$(CONFIG_MPEG4_VAAPI_HWACCEL) += vaapi_mpeg4.o OBJS-$(CONFIG_MPEG4_VAAPI_HWACCEL) += vaapi_mpeg4.o
OBJS-$(CONFIG_MSMPEG4V1_DECODER) += msmpeg4.o msmpeg4data.o OBJS-$(CONFIG_MSMPEG4V1_DECODER) += msmpeg4.o msmpeg4data.o
OBJS-$(CONFIG_MSMPEG4V1_ENCODER) += msmpeg4.o msmpeg4data.o h263dec.o \
h263.o ituh263dec.o mpeg4videodec.o
OBJS-$(CONFIG_MSMPEG4V2_DECODER) += msmpeg4.o msmpeg4data.o h263dec.o \ OBJS-$(CONFIG_MSMPEG4V2_DECODER) += msmpeg4.o msmpeg4data.o h263dec.o \
h263.o ituh263dec.o mpeg4videodec.o h263.o ituh263dec.o mpeg4videodec.o
OBJS-$(CONFIG_MSMPEG4V2_ENCODER) += msmpeg4.o msmpeg4data.o h263dec.o \ OBJS-$(CONFIG_MSMPEG4V2_ENCODER) += msmpeg4.o msmpeg4data.o h263dec.o \
......
...@@ -28,7 +28,8 @@ ...@@ -28,7 +28,8 @@
#define AVCODEC_AC3_H #define AVCODEC_AC3_H
#define AC3_MAX_CODED_FRAME_SIZE 3840 /* in bytes */ #define AC3_MAX_CODED_FRAME_SIZE 3840 /* in bytes */
#define AC3_MAX_CHANNELS 6 /* including LFE channel */ #define AC3_MAX_CHANNELS 7 /**< maximum number of channels, including coupling channel */
#define CPL_CH 0 /**< coupling channel index */
#define AC3_MAX_COEFS 256 #define AC3_MAX_COEFS 256
#define AC3_BLOCK_SIZE 256 #define AC3_BLOCK_SIZE 256
...@@ -158,7 +159,9 @@ typedef struct AC3EncOptions { ...@@ -158,7 +159,9 @@ typedef struct AC3EncOptions {
/* other encoding options */ /* other encoding options */
int allow_per_frame_metadata; int allow_per_frame_metadata;
int stereo_rematrixing; int stereo_rematrixing;
int channel_coupling;
int cpl_start;
} AC3EncOptions; } AC3EncOptions;
......
...@@ -58,11 +58,6 @@ ...@@ -58,11 +58,6 @@
#include "fft.h" #include "fft.h"
#include "fmtconvert.h" #include "fmtconvert.h"
/* override ac3.h to include coupling channel */
#undef AC3_MAX_CHANNELS
#define AC3_MAX_CHANNELS 7
#define CPL_CH 0
#define AC3_OUTPUT_LFEON 8 #define AC3_OUTPUT_LFEON 8
#define SPX_MAX_BANDS 17 #define SPX_MAX_BANDS 17
......
...@@ -53,12 +53,6 @@ const uint8_t ff_eac3_hebap_tab[64] = { ...@@ -53,12 +53,6 @@ const uint8_t ff_eac3_hebap_tab[64] = {
19, 19, 19, 19, 19, 19, 19, 19,
}; };
/**
* Table E2.16 Default Coupling Banding Structure
*/
const uint8_t ff_eac3_default_cpl_band_struct[18] =
{ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1 };
/** /**
* Table E2.15 Default Spectral Extension Banding Structure * Table E2.15 Default Spectral Extension Banding Structure
*/ */
......
...@@ -27,7 +27,6 @@ ...@@ -27,7 +27,6 @@
extern const uint8_t ff_ac3_ungroup_3_in_5_bits_tab[32][3]; extern const uint8_t ff_ac3_ungroup_3_in_5_bits_tab[32][3];
extern const uint8_t ff_eac3_hebap_tab[64]; extern const uint8_t ff_eac3_hebap_tab[64];
extern const uint8_t ff_eac3_default_cpl_band_struct[18];
extern const uint8_t ff_eac3_default_spx_band_struct[17]; extern const uint8_t ff_eac3_default_spx_band_struct[17];
#endif /* AVCODEC_AC3DEC_DATA_H */ #endif /* AVCODEC_AC3DEC_DATA_H */
This diff is collapsed.
...@@ -101,7 +101,7 @@ static void scale_coefficients(AC3EncodeContext *s) ...@@ -101,7 +101,7 @@ static void scale_coefficients(AC3EncodeContext *s)
for (blk = 0; blk < AC3_MAX_BLOCKS; blk++) { for (blk = 0; blk < AC3_MAX_BLOCKS; blk++) {
AC3Block *block = &s->blocks[blk]; AC3Block *block = &s->blocks[blk];
for (ch = 0; ch < s->channels; ch++) { for (ch = 1; ch <= s->channels; ch++) {
s->ac3dsp.ac3_rshift_int32(block->mdct_coef[ch], AC3_MAX_COEFS, s->ac3dsp.ac3_rshift_int32(block->mdct_coef[ch], AC3_MAX_COEFS,
block->coeff_shift[ch]); block->coeff_shift[ch]);
} }
......
...@@ -93,8 +93,10 @@ static int normalize_samples(AC3EncodeContext *s) ...@@ -93,8 +93,10 @@ static int normalize_samples(AC3EncodeContext *s)
*/ */
static void scale_coefficients(AC3EncodeContext *s) static void scale_coefficients(AC3EncodeContext *s)
{ {
s->ac3dsp.float_to_fixed24(s->fixed_coef_buffer, s->mdct_coef_buffer, int chan_size = AC3_MAX_COEFS * AC3_MAX_BLOCKS;
AC3_MAX_COEFS * AC3_MAX_BLOCKS * s->channels); s->ac3dsp.float_to_fixed24(s->fixed_coef_buffer + chan_size,
s->mdct_coef_buffer + chan_size,
chan_size * s->channels);
} }
......
...@@ -138,6 +138,13 @@ const uint16_t ff_ac3_bitrate_tab[19] = { ...@@ -138,6 +138,13 @@ const uint16_t ff_ac3_bitrate_tab[19] = {
*/ */
const uint8_t ff_ac3_rematrix_band_tab[5] = { 13, 25, 37, 61, 253 }; const uint8_t ff_ac3_rematrix_band_tab[5] = { 13, 25, 37, 61, 253 };
/**
* Table E2.16 Default Coupling Banding Structure
*/
const uint8_t ff_eac3_default_cpl_band_struct[18] = {
0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1
};
/* AC-3 MDCT window */ /* AC-3 MDCT window */
/* MDCT window */ /* MDCT window */
......
...@@ -39,6 +39,7 @@ extern const uint8_t ff_ac3_dec_channel_map[8][2][6]; ...@@ -39,6 +39,7 @@ extern const uint8_t ff_ac3_dec_channel_map[8][2][6];
extern const uint16_t ff_ac3_sample_rate_tab[3]; extern const uint16_t ff_ac3_sample_rate_tab[3];
extern const uint16_t ff_ac3_bitrate_tab[19]; extern const uint16_t ff_ac3_bitrate_tab[19];
extern const uint8_t ff_ac3_rematrix_band_tab[5]; extern const uint8_t ff_ac3_rematrix_band_tab[5];
extern const uint8_t ff_eac3_default_cpl_band_struct[18];
extern const int16_t ff_ac3_window[AC3_WINDOW_SIZE/2]; extern const int16_t ff_ac3_window[AC3_WINDOW_SIZE/2];
extern const uint8_t ff_ac3_log_add_tab[260]; extern const uint8_t ff_ac3_log_add_tab[260];
extern const uint16_t ff_ac3_hearing_threshold_tab[AC3_CRITICAL_BANDS][3]; extern const uint16_t ff_ac3_hearing_threshold_tab[AC3_CRITICAL_BANDS][3];
......
...@@ -156,7 +156,7 @@ void avcodec_register_all(void) ...@@ -156,7 +156,7 @@ void avcodec_register_all(void)
REGISTER_DECODER (MPEG1_VDPAU, mpeg1_vdpau); REGISTER_DECODER (MPEG1_VDPAU, mpeg1_vdpau);
REGISTER_DECODER (MPEG2_CRYSTALHD, mpeg2_crystalhd); REGISTER_DECODER (MPEG2_CRYSTALHD, mpeg2_crystalhd);
REGISTER_DECODER (MSMPEG4_CRYSTALHD, msmpeg4_crystalhd); REGISTER_DECODER (MSMPEG4_CRYSTALHD, msmpeg4_crystalhd);
REGISTER_ENCDEC (MSMPEG4V1, msmpeg4v1); REGISTER_DECODER (MSMPEG4V1, msmpeg4v1);
REGISTER_ENCDEC (MSMPEG4V2, msmpeg4v2); REGISTER_ENCDEC (MSMPEG4V2, msmpeg4v2);
REGISTER_ENCDEC (MSMPEG4V3, msmpeg4v3); REGISTER_ENCDEC (MSMPEG4V3, msmpeg4v3);
REGISTER_DECODER (MSRLE, msrle); REGISTER_DECODER (MSRLE, msrle);
......
...@@ -628,13 +628,6 @@ static inline int get_penalty_factor(int lambda, int lambda2, int type){ ...@@ -628,13 +628,6 @@ static inline int get_penalty_factor(int lambda, int lambda2, int type){
} }
} }
/**
* Empty mmx state.
* this must be called between any dsp function and float/double code.
* for example sin(); dsp->idct_put(); emms_c(); cos()
*/
#define emms_c()
void dsputil_init_alpha(DSPContext* c, AVCodecContext *avctx); void dsputil_init_alpha(DSPContext* c, AVCodecContext *avctx);
void dsputil_init_arm(DSPContext* c, AVCodecContext *avctx); void dsputil_init_arm(DSPContext* c, AVCodecContext *avctx);
void dsputil_init_bfin(DSPContext* c, AVCodecContext *avctx); void dsputil_init_bfin(DSPContext* c, AVCodecContext *avctx);
...@@ -652,22 +645,9 @@ void ff_intrax8dsp_init(DSPContext* c, AVCodecContext *avctx); ...@@ -652,22 +645,9 @@ void ff_intrax8dsp_init(DSPContext* c, AVCodecContext *avctx);
void ff_mlp_init(DSPContext* c, AVCodecContext *avctx); void ff_mlp_init(DSPContext* c, AVCodecContext *avctx);
void ff_mlp_init_x86(DSPContext* c, AVCodecContext *avctx); void ff_mlp_init_x86(DSPContext* c, AVCodecContext *avctx);
#if HAVE_MMX
#undef emms_c
static inline void emms(void) #if ARCH_ARM
{
__asm__ volatile ("emms;":::"memory");
}
#define emms_c() \
{\
if(av_get_cpu_flags() & AV_CPU_FLAG_MMX)\
emms();\
}
#elif ARCH_ARM
#if HAVE_NEON #if HAVE_NEON
# define STRIDE_ALIGN 16 # define STRIDE_ALIGN 16
......
...@@ -638,15 +638,6 @@ av_cold int MPV_encode_init(AVCodecContext *avctx) ...@@ -638,15 +638,6 @@ av_cold int MPV_encode_init(AVCodecContext *avctx)
s->low_delay= s->max_b_frames ? 0 : 1; s->low_delay= s->max_b_frames ? 0 : 1;
avctx->delay= s->low_delay ? 0 : (s->max_b_frames + 1); avctx->delay= s->low_delay ? 0 : (s->max_b_frames + 1);
break; break;
case CODEC_ID_MSMPEG4V1:
s->out_format = FMT_H263;
s->h263_msmpeg4 = 1;
s->h263_pred = 1;
s->unrestricted_mv = 1;
s->msmpeg4_version= 1;
avctx->delay=0;
s->low_delay=1;
break;
case CODEC_ID_MSMPEG4V2: case CODEC_ID_MSMPEG4V2:
s->out_format = FMT_H263; s->out_format = FMT_H263;
s->h263_msmpeg4 = 1; s->h263_msmpeg4 = 1;
...@@ -3807,18 +3798,6 @@ AVCodec ff_h263p_encoder = { ...@@ -3807,18 +3798,6 @@ AVCodec ff_h263p_encoder = {
.long_name= NULL_IF_CONFIG_SMALL("H.263+ / H.263-1998 / H.263 version 2"), .long_name= NULL_IF_CONFIG_SMALL("H.263+ / H.263-1998 / H.263 version 2"),
}; };
AVCodec ff_msmpeg4v1_encoder = {
"msmpeg4v1",
AVMEDIA_TYPE_VIDEO,
CODEC_ID_MSMPEG4V1,
sizeof(MpegEncContext),
MPV_encode_init,
MPV_encode_picture,
MPV_encode_end,
.pix_fmts= (const enum PixelFormat[]){PIX_FMT_YUV420P, PIX_FMT_NONE},
.long_name= NULL_IF_CONFIG_SMALL("MPEG-4 part 2 Microsoft variant version 1"),
};
AVCodec ff_msmpeg4v2_encoder = { AVCodec ff_msmpeg4v2_encoder = {
"msmpeg4v2", "msmpeg4v2",
AVMEDIA_TYPE_VIDEO, AVMEDIA_TYPE_VIDEO,
......
...@@ -846,22 +846,14 @@ static void msmpeg4_encode_dc(MpegEncContext * s, int level, int n, int *dir_ptr ...@@ -846,22 +846,14 @@ static void msmpeg4_encode_dc(MpegEncContext * s, int level, int n, int *dir_ptr
int pred, extquant; int pred, extquant;
int extrabits = 0; int extrabits = 0;
if(s->msmpeg4_version==1){ int16_t *dc_val;
int32_t *dc_val; pred = msmpeg4_pred_dc(s, n, &dc_val, dir_ptr);
pred = msmpeg4v1_pred_dc(s, n, &dc_val);
/* update predictor */
*dc_val= level;
}else{
int16_t *dc_val;
pred = msmpeg4_pred_dc(s, n, &dc_val, dir_ptr);
/* update predictor */ /* update predictor */
if (n < 4) { if (n < 4) {
*dc_val = level * s->y_dc_scale; *dc_val = level * s->y_dc_scale;
} else { } else {
*dc_val = level * s->c_dc_scale; *dc_val = level * s->c_dc_scale;
}
} }
/* do the prediction */ /* do the prediction */
......
...@@ -54,8 +54,7 @@ int ff_wmv2_decode_mb(MpegEncContext *s, DCTELEM block[6][64]); ...@@ -54,8 +54,7 @@ int ff_wmv2_decode_mb(MpegEncContext *s, DCTELEM block[6][64]);
CONFIG_MSMPEG4V3_DECODER || \ CONFIG_MSMPEG4V3_DECODER || \
CONFIG_WMV2_DECODER || \ CONFIG_WMV2_DECODER || \
CONFIG_VC1_DECODER) CONFIG_VC1_DECODER)
#define CONFIG_MSMPEG4_ENCODER (CONFIG_MSMPEG4V1_ENCODER || \ #define CONFIG_MSMPEG4_ENCODER (CONFIG_MSMPEG4V2_ENCODER || \
CONFIG_MSMPEG4V2_ENCODER || \
CONFIG_MSMPEG4V3_ENCODER || \ CONFIG_MSMPEG4V3_ENCODER || \
CONFIG_WMV2_ENCODER) CONFIG_WMV2_ENCODER)
......
...@@ -39,6 +39,8 @@ typedef struct TiffContext { ...@@ -39,6 +39,8 @@ typedef struct TiffContext {
int width, height; int width, height;
unsigned int bpp, bppcount; unsigned int bpp, bppcount;
uint32_t palette[256];
int palette_is_set;
int le; int le;
enum TiffCompr compr; enum TiffCompr compr;
int invert; int invert;
...@@ -255,11 +257,15 @@ static int init_image(TiffContext *s) ...@@ -255,11 +257,15 @@ static int init_image(TiffContext *s)
av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed\n"); av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed\n");
return ret; return ret;
} }
if (s->bpp == 8 && s->picture.data[1]){ if (s->avctx->pix_fmt == PIX_FMT_PAL8) {
/* make default grayscale pal */ if (s->palette_is_set) {
pal = (uint32_t *) s->picture.data[1]; memcpy(s->picture.data[1], s->palette, sizeof(s->palette));
for (i = 0; i < 256; i++) } else {
pal[i] = i * 0x010101; /* make default grayscale pal */
pal = (uint32_t *) s->picture.data[1];
for (i = 0; i < 256; i++)
pal[i] = i * 0x010101;
}
} }
return 0; return 0;
} }
...@@ -442,11 +448,7 @@ static int tiff_decode_tag(TiffContext *s, const uint8_t *start, const uint8_t * ...@@ -442,11 +448,7 @@ static int tiff_decode_tag(TiffContext *s, const uint8_t *start, const uint8_t *
s->fill_order = value - 1; s->fill_order = value - 1;
break; break;
case TIFF_PAL: case TIFF_PAL:
if(s->avctx->pix_fmt != PIX_FMT_PAL8){ pal = (uint32_t *) s->palette;
av_log(s->avctx, AV_LOG_ERROR, "Palette met but this is not palettized format\n");
return -1;
}
pal = (uint32_t *) s->picture.data[1];
off = type_sizes[type]; off = type_sizes[type];
rp = buf; rp = buf;
gp = buf + count / 3 * off; gp = buf + count / 3 * off;
...@@ -459,6 +461,7 @@ static int tiff_decode_tag(TiffContext *s, const uint8_t *start, const uint8_t * ...@@ -459,6 +461,7 @@ static int tiff_decode_tag(TiffContext *s, const uint8_t *start, const uint8_t *
j |= tget(&bp, type, s->le) >> off; j |= tget(&bp, type, s->le) >> off;
pal[i] = j; pal[i] = j;
} }
s->palette_is_set = 1;
break; break;
case TIFF_PLANAR: case TIFF_PLANAR:
if(value == 2){ if(value == 2){
......
...@@ -287,13 +287,8 @@ zrmjpeg ...@@ -287,13 +287,8 @@ zrmjpeg
CpuCaps gCpuCaps; //FIXME initialize this so optims work CpuCaps gCpuCaps; //FIXME initialize this so optims work
//exact copy from vf_scale.c
int get_sws_cpuflags(void){ int get_sws_cpuflags(void){
return return 0;
(gCpuCaps.hasMMX ? SWS_CPU_CAPS_MMX : 0)
| (gCpuCaps.hasMMX2 ? SWS_CPU_CAPS_MMX2 : 0)
| (gCpuCaps.has3DNow ? SWS_CPU_CAPS_3DNOW : 0)
| (gCpuCaps.hasAltiVec ? SWS_CPU_CAPS_ALTIVEC : 0);
} }
static void sws_getFlagsAndFilterFromCmdLine(int *flags, SwsFilter **srcFilterParam, SwsFilter **dstFilterParam) static void sws_getFlagsAndFilterFromCmdLine(int *flags, SwsFilter **srcFilterParam, SwsFilter **dstFilterParam)
...@@ -348,7 +343,7 @@ struct SwsContext *sws_getContextFromCmdLine(int srcW, int srcH, int srcFormat, ...@@ -348,7 +343,7 @@ struct SwsContext *sws_getContextFromCmdLine(int srcW, int srcH, int srcFormat,
if (srcFormat == IMGFMT_RGB8 || srcFormat == IMGFMT_BGR8) sfmt = PIX_FMT_PAL8; if (srcFormat == IMGFMT_RGB8 || srcFormat == IMGFMT_BGR8) sfmt = PIX_FMT_PAL8;
sws_getFlagsAndFilterFromCmdLine(&flags, &srcFilterParam, &dstFilterParam); sws_getFlagsAndFilterFromCmdLine(&flags, &srcFilterParam, &dstFilterParam);
return sws_getContext(srcW, srcH, sfmt, dstW, dstH, dfmt, flags | get_sws_cpuflags(), srcFilterParam, dstFilterParam, NULL); return sws_getContext(srcW, srcH, sfmt, dstW, dstH, dfmt, flags , srcFilterParam, dstFilterParam, NULL);
} }
typedef struct { typedef struct {
......
...@@ -27,6 +27,7 @@ ...@@ -27,6 +27,7 @@
* memory buffer source API for video * memory buffer source API for video
*/ */
#include "avfilter.h" #include "avfilter.h"
/** /**
......
...@@ -276,7 +276,7 @@ static int ape_read_header(AVFormatContext * s, AVFormatParameters * ap) ...@@ -276,7 +276,7 @@ static int ape_read_header(AVFormatContext * s, AVFormatParameters * ap)
ape->frames[0].nblocks = ape->blocksperframe; ape->frames[0].nblocks = ape->blocksperframe;
ape->frames[0].skip = 0; ape->frames[0].skip = 0;
for (i = 1; i < ape->totalframes; i++) { for (i = 1; i < ape->totalframes; i++) {
ape->frames[i].pos = ape->seektable[i] + ape->junklength; //ape->frames[i-1].pos + ape->blocksperframe; ape->frames[i].pos = ape->seektable[i] + ape->junklength;
ape->frames[i].nblocks = ape->blocksperframe; ape->frames[i].nblocks = ape->blocksperframe;
ape->frames[i - 1].size = ape->frames[i].pos - ape->frames[i - 1].pos; ape->frames[i - 1].size = ape->frames[i].pos - ape->frames[i - 1].pos;
ape->frames[i].skip = (ape->frames[i].pos - ape->frames[0].pos) & 3; ape->frames[i].skip = (ape->frames[i].pos - ape->frames[0].pos) & 3;
......
...@@ -37,6 +37,7 @@ ...@@ -37,6 +37,7 @@
#include "config.h" #include "config.h"
#include "attributes.h" #include "attributes.h"
#include "timer.h" #include "timer.h"
#include "cpu.h"
#ifndef attribute_align_arg #ifndef attribute_align_arg
#if ARCH_X86_32 && AV_GCC_VERSION_AT_LEAST(4,2) #if ARCH_X86_32 && AV_GCC_VERSION_AT_LEAST(4,2)
...@@ -222,4 +223,19 @@ ...@@ -222,4 +223,19 @@
# define ONLY_IF_THREADS_ENABLED(x) NULL # define ONLY_IF_THREADS_ENABLED(x) NULL
#endif #endif
#if HAVE_MMX
/**
* Empty mmx state.
* this must be called between any dsp function and float/double code.
* for example sin(); dsp->idct_put(); emms_c(); cos()
*/
static av_always_inline void emms_c(void)
{
if(av_get_cpu_flags() & AV_CPU_FLAG_MMX)
__asm__ volatile ("emms" ::: "memory");
}
#else /* HAVE_MMX */
#define emms_c()
#endif /* HAVE_MMX */
#endif /* AVUTIL_INTERNAL_H */ #endif /* AVUTIL_INTERNAL_H */
...@@ -79,15 +79,13 @@ static int yuyvtoyv12_unscaled(SwsContext *c, uint8_t* src[], int srcStride[], i ...@@ -79,15 +79,13 @@ static int yuyvtoyv12_unscaled(SwsContext *c, uint8_t* src[], int srcStride[], i
void ff_bfin_get_unscaled_swscale(SwsContext *c) void ff_bfin_get_unscaled_swscale(SwsContext *c)
{ {
SwsFunc swScale = c->swScale; SwsFunc swScale = c->swScale;
if (c->flags & SWS_CPU_CAPS_BFIN)
if (c->dstFormat == PIX_FMT_YUV420P) if (c->dstFormat == PIX_FMT_YUV420P && c->srcFormat == PIX_FMT_UYVY422) {
if (c->srcFormat == PIX_FMT_UYVY422) { av_log (NULL, AV_LOG_VERBOSE, "selecting Blackfin optimized uyvytoyv12_unscaled\n");
av_log (NULL, AV_LOG_VERBOSE, "selecting Blackfin optimized uyvytoyv12_unscaled\n"); c->swScale = uyvytoyv12_unscaled;
c->swScale = uyvytoyv12_unscaled; }
} if (c->dstFormat == PIX_FMT_YUV420P && c->srcFormat == PIX_FMT_YUYV422) {
if (c->dstFormat == PIX_FMT_YUV420P) av_log (NULL, AV_LOG_VERBOSE, "selecting Blackfin optimized yuyvtoyv12_unscaled\n");
if (c->srcFormat == PIX_FMT_YUYV422) { c->swScale = yuyvtoyv12_unscaled;
av_log (NULL, AV_LOG_VERBOSE, "selecting Blackfin optimized yuyvtoyv12_unscaled\n"); }
c->swScale = yuyvtoyv12_unscaled;
}
} }
...@@ -33,31 +33,6 @@ ...@@ -33,31 +33,6 @@
#define FUNC(s,d,n) {s,d,#n,n} #define FUNC(s,d,n) {s,d,#n,n}
static int cpu_caps;
static char *args_parse(int argc, char *argv[])
{
int o;
while ((o = getopt(argc, argv, "m23")) != -1) {
switch (o) {
case 'm':
cpu_caps |= SWS_CPU_CAPS_MMX;
break;
case '2':
cpu_caps |= SWS_CPU_CAPS_MMX2;
break;
case '3':
cpu_caps |= SWS_CPU_CAPS_3DNOW;
break;
default:
av_log(NULL, AV_LOG_ERROR, "Unknown option %c\n", o);
}
}
return argv[optind];
}
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
int i, funcNum; int i, funcNum;
...@@ -70,9 +45,7 @@ int main(int argc, char **argv) ...@@ -70,9 +45,7 @@ int main(int argc, char **argv)
return -1; return -1;
av_log(NULL, AV_LOG_INFO, "memory corruption test ...\n"); av_log(NULL, AV_LOG_INFO, "memory corruption test ...\n");
args_parse(argc, argv); sws_rgb2rgb_init();
av_log(NULL, AV_LOG_INFO, "CPU capabilities forced to %x\n", cpu_caps);
sws_rgb2rgb_init(cpu_caps);
for(funcNum=0; ; funcNum++) { for(funcNum=0; ; funcNum++) {
struct func_info_s { struct func_info_s {
......
...@@ -48,12 +48,6 @@ static const AVOption options[] = { ...@@ -48,12 +48,6 @@ static const AVOption options[] = {
{ "spline", "natural bicubic spline", 0, FF_OPT_TYPE_CONST, {.dbl = SWS_SPLINE }, INT_MIN, INT_MAX, VE, "sws_flags" }, { "spline", "natural bicubic spline", 0, FF_OPT_TYPE_CONST, {.dbl = SWS_SPLINE }, INT_MIN, INT_MAX, VE, "sws_flags" },
{ "print_info", "print info", 0, FF_OPT_TYPE_CONST, {.dbl = SWS_PRINT_INFO }, INT_MIN, INT_MAX, VE, "sws_flags" }, { "print_info", "print info", 0, FF_OPT_TYPE_CONST, {.dbl = SWS_PRINT_INFO }, INT_MIN, INT_MAX, VE, "sws_flags" },
{ "accurate_rnd", "accurate rounding", 0, FF_OPT_TYPE_CONST, {.dbl = SWS_ACCURATE_RND }, INT_MIN, INT_MAX, VE, "sws_flags" }, { "accurate_rnd", "accurate rounding", 0, FF_OPT_TYPE_CONST, {.dbl = SWS_ACCURATE_RND }, INT_MIN, INT_MAX, VE, "sws_flags" },
{ "mmx", "MMX SIMD acceleration", 0, FF_OPT_TYPE_CONST, {.dbl = SWS_CPU_CAPS_MMX }, INT_MIN, INT_MAX, VE, "sws_flags" },
{ "mmx2", "MMX2 SIMD acceleration", 0, FF_OPT_TYPE_CONST, {.dbl = SWS_CPU_CAPS_MMX2 }, INT_MIN, INT_MAX, VE, "sws_flags" },
{ "sse2", "SSE2 SIMD acceleration", 0, FF_OPT_TYPE_CONST, {.dbl = SWS_CPU_CAPS_SSE2 }, INT_MIN, INT_MAX, VE, "sws_flags" },
{ "3dnow", "3DNOW SIMD acceleration", 0, FF_OPT_TYPE_CONST, {.dbl = SWS_CPU_CAPS_3DNOW }, INT_MIN, INT_MAX, VE, "sws_flags" },
{ "altivec", "AltiVec SIMD acceleration", 0, FF_OPT_TYPE_CONST, {.dbl = SWS_CPU_CAPS_ALTIVEC }, INT_MIN, INT_MAX, VE, "sws_flags" },
{ "bfin", "Blackfin SIMD acceleration", 0, FF_OPT_TYPE_CONST, {.dbl = SWS_CPU_CAPS_BFIN }, INT_MIN, INT_MAX, VE, "sws_flags" },
{ "full_chroma_int", "full chroma interpolation", 0 , FF_OPT_TYPE_CONST, {.dbl = SWS_FULL_CHR_H_INT }, INT_MIN, INT_MAX, VE, "sws_flags" }, { "full_chroma_int", "full chroma interpolation", 0 , FF_OPT_TYPE_CONST, {.dbl = SWS_FULL_CHR_H_INT }, INT_MIN, INT_MAX, VE, "sws_flags" },
{ "full_chroma_inp", "full chroma input", 0 , FF_OPT_TYPE_CONST, {.dbl = SWS_FULL_CHR_H_INP }, INT_MIN, INT_MAX, VE, "sws_flags" }, { "full_chroma_inp", "full chroma input", 0 , FF_OPT_TYPE_CONST, {.dbl = SWS_FULL_CHR_H_INP }, INT_MIN, INT_MAX, VE, "sws_flags" },
{ "bitexact", "", 0 , FF_OPT_TYPE_CONST, {.dbl = SWS_BITEXACT }, INT_MIN, INT_MAX, VE, "sws_flags" }, { "bitexact", "", 0 , FF_OPT_TYPE_CONST, {.dbl = SWS_BITEXACT }, INT_MIN, INT_MAX, VE, "sws_flags" },
......
This diff is collapsed.
...@@ -94,6 +94,7 @@ adjustment. ...@@ -94,6 +94,7 @@ adjustment.
#include "libswscale/rgb2rgb.h" #include "libswscale/rgb2rgb.h"
#include "libswscale/swscale.h" #include "libswscale/swscale.h"
#include "libswscale/swscale_internal.h" #include "libswscale/swscale_internal.h"
#include "libavutil/cpu.h"
#undef PROFILE_THE_BEAST #undef PROFILE_THE_BEAST
#undef INC_SCALING #undef INC_SCALING
...@@ -692,7 +693,7 @@ static int altivec_uyvy_rgb32 (SwsContext *c, ...@@ -692,7 +693,7 @@ static int altivec_uyvy_rgb32 (SwsContext *c,
*/ */
SwsFunc ff_yuv2rgb_init_altivec(SwsContext *c) SwsFunc ff_yuv2rgb_init_altivec(SwsContext *c)
{ {
if (!(c->flags & SWS_CPU_CAPS_ALTIVEC)) if (!(av_get_cpu_flags() & AV_CPU_FLAG_ALTIVEC))
return NULL; return NULL;
/* /*
......
...@@ -116,12 +116,11 @@ void (*yuyvtoyuv422)(uint8_t *ydst, uint8_t *udst, uint8_t *vdst, const uint8_t ...@@ -116,12 +116,11 @@ void (*yuyvtoyuv422)(uint8_t *ydst, uint8_t *udst, uint8_t *vdst, const uint8_t
32-bit C version, and and&add trick by Michael Niedermayer 32-bit C version, and and&add trick by Michael Niedermayer
*/ */
void sws_rgb2rgb_init(int flags) void sws_rgb2rgb_init(void)
{ {
rgb2rgb_init_c(); rgb2rgb_init_c();
#if HAVE_MMX2 || HAVE_AMD3DNOW || HAVE_MMX if (HAVE_MMX)
rgb2rgb_init_x86(flags); rgb2rgb_init_x86();
#endif /* HAVE_MMX2 || HAVE_AMD3DNOW || HAVE_MMX */
} }
#if LIBSWSCALE_VERSION_MAJOR < 1 #if LIBSWSCALE_VERSION_MAJOR < 1
......
...@@ -166,8 +166,8 @@ extern void (*yuyvtoyuv422)(uint8_t *ydst, uint8_t *udst, uint8_t *vdst, const u ...@@ -166,8 +166,8 @@ extern void (*yuyvtoyuv422)(uint8_t *ydst, uint8_t *udst, uint8_t *vdst, const u
long width, long height, long width, long height,
long lumStride, long chromStride, long srcStride); long lumStride, long chromStride, long srcStride);
void sws_rgb2rgb_init(int flags); void sws_rgb2rgb_init(void);
void rgb2rgb_init_x86(int flags); void rgb2rgb_init_x86(void);
#endif /* SWSCALE_RGB2RGB_H */ #endif /* SWSCALE_RGB2RGB_H */
...@@ -278,25 +278,6 @@ static inline void rgb16tobgr24_c(const uint8_t *src, uint8_t *dst, long src_siz ...@@ -278,25 +278,6 @@ static inline void rgb16tobgr24_c(const uint8_t *src, uint8_t *dst, long src_siz
} }
} }
/*
* mm0 = 00 B3 00 B2 00 B1 00 B0
* mm1 = 00 G3 00 G2 00 G1 00 G0
* mm2 = 00 R3 00 R2 00 R1 00 R0
* mm6 = FF FF FF FF FF FF FF FF
* mm7 = 00 00 00 00 00 00 00 00
*/
#define PACK_RGB32 \
"packuswb %%mm7, %%mm0 \n\t" /* 00 00 00 00 B3 B2 B1 B0 */ \
"packuswb %%mm7, %%mm1 \n\t" /* 00 00 00 00 G3 G2 G1 G0 */ \
"packuswb %%mm7, %%mm2 \n\t" /* 00 00 00 00 R3 R2 R1 R0 */ \
"punpcklbw %%mm1, %%mm0 \n\t" /* G3 B3 G2 B2 G1 B1 G0 B0 */ \
"punpcklbw %%mm6, %%mm2 \n\t" /* FF R3 FF R2 FF R1 FF R0 */ \
"movq %%mm0, %%mm3 \n\t" \
"punpcklwd %%mm2, %%mm0 \n\t" /* FF R1 G1 B1 FF R0 G0 B0 */ \
"punpckhwd %%mm2, %%mm3 \n\t" /* FF R3 G3 B3 FF R2 G2 B2 */ \
MOVNTQ" %%mm0, %0 \n\t" \
MOVNTQ" %%mm3, 8%0 \n\t" \
static inline void rgb15to32_c(const uint8_t *src, uint8_t *dst, long src_size) static inline void rgb15to32_c(const uint8_t *src, uint8_t *dst, long src_size)
{ {
const uint16_t *end; const uint16_t *end;
......
...@@ -63,6 +63,7 @@ untested special converters ...@@ -63,6 +63,7 @@ untested special converters
#include "libavutil/avassert.h" #include "libavutil/avassert.h"
#include "libavutil/intreadwrite.h" #include "libavutil/intreadwrite.h"
#include "libavutil/x86_cpu.h" #include "libavutil/x86_cpu.h"
#include "libavutil/cpu.h"
#include "libavutil/avutil.h" #include "libavutil/avutil.h"
#include "libavutil/mathematics.h" #include "libavutil/mathematics.h"
#include "libavutil/bswap.h" #include "libavutil/bswap.h"
...@@ -71,10 +72,6 @@ untested special converters ...@@ -71,10 +72,6 @@ untested special converters
#undef MOVNTQ #undef MOVNTQ
#undef PAVGB #undef PAVGB
//#undef HAVE_MMX2
//#define HAVE_AMD3DNOW
//#undef HAVE_MMX
//#undef ARCH_X86
#define DITHER1XBPP #define DITHER1XBPP
#define isPacked(x) ( \ #define isPacked(x) ( \
...@@ -1262,57 +1259,13 @@ static inline void monoblack2Y(uint8_t *dst, const uint8_t *src, long width, uin ...@@ -1262,57 +1259,13 @@ static inline void monoblack2Y(uint8_t *dst, const uint8_t *src, long width, uin
//Note: we have C, MMX, MMX2, 3DNOW versions, there is no 3DNOW+MMX2 one //Note: we have C, MMX, MMX2, 3DNOW versions, there is no 3DNOW+MMX2 one
//Plain C versions //Plain C versions
#if CONFIG_RUNTIME_CPUDETECT
# define COMPILE_C 1
# if ARCH_X86
# define COMPILE_MMX 1
# define COMPILE_MMX2 1
# define COMPILE_3DNOW 1
# elif ARCH_PPC
# define COMPILE_ALTIVEC HAVE_ALTIVEC
# endif
#else /* CONFIG_RUNTIME_CPUDETECT */
# if ARCH_X86
# if HAVE_MMX2
# define COMPILE_MMX2 1
# elif HAVE_AMD3DNOW
# define COMPILE_3DNOW 1
# elif HAVE_MMX
# define COMPILE_MMX 1
# else
# define COMPILE_C 1
# endif
# elif ARCH_PPC && HAVE_ALTIVEC
# define COMPILE_ALTIVEC 1
# else
# define COMPILE_C 1
# endif
#endif
#ifndef COMPILE_C
# define COMPILE_C 0
#endif
#ifndef COMPILE_MMX
# define COMPILE_MMX 0
#endif
#ifndef COMPILE_MMX2
# define COMPILE_MMX2 0
#endif
#ifndef COMPILE_3DNOW
# define COMPILE_3DNOW 0
#endif
#ifndef COMPILE_ALTIVEC
# define COMPILE_ALTIVEC 0
#endif
#define COMPILE_TEMPLATE_MMX 0
#define COMPILE_TEMPLATE_MMX2 0 #define COMPILE_TEMPLATE_MMX2 0
#define COMPILE_TEMPLATE_AMD3DNOW 0
#define COMPILE_TEMPLATE_ALTIVEC 0 #define COMPILE_TEMPLATE_ALTIVEC 0
#include "swscale_template.c" #include "swscale_template.c"
#if COMPILE_ALTIVEC #if HAVE_ALTIVEC
#undef RENAME #undef RENAME
#undef COMPILE_TEMPLATE_ALTIVEC #undef COMPILE_TEMPLATE_ALTIVEC
#define COMPILE_TEMPLATE_ALTIVEC 1 #define COMPILE_TEMPLATE_ALTIVEC 1
...@@ -1320,90 +1273,42 @@ static inline void monoblack2Y(uint8_t *dst, const uint8_t *src, long width, uin ...@@ -1320,90 +1273,42 @@ static inline void monoblack2Y(uint8_t *dst, const uint8_t *src, long width, uin
#include "ppc/swscale_template.c" #include "ppc/swscale_template.c"
#endif #endif
#if ARCH_X86
//MMX versions //MMX versions
#if COMPILE_MMX #if HAVE_MMX
#undef RENAME #undef RENAME
#undef COMPILE_TEMPLATE_MMX
#undef COMPILE_TEMPLATE_MMX2 #undef COMPILE_TEMPLATE_MMX2
#undef COMPILE_TEMPLATE_AMD3DNOW
#define COMPILE_TEMPLATE_MMX 1
#define COMPILE_TEMPLATE_MMX2 0 #define COMPILE_TEMPLATE_MMX2 0
#define COMPILE_TEMPLATE_AMD3DNOW 0
#define RENAME(a) a ## _MMX #define RENAME(a) a ## _MMX
#include "x86/swscale_template.c" #include "x86/swscale_template.c"
#endif #endif
//MMX2 versions //MMX2 versions
#if COMPILE_MMX2 #if HAVE_MMX2
#undef RENAME #undef RENAME
#undef COMPILE_TEMPLATE_MMX
#undef COMPILE_TEMPLATE_MMX2 #undef COMPILE_TEMPLATE_MMX2
#undef COMPILE_TEMPLATE_AMD3DNOW
#define COMPILE_TEMPLATE_MMX 1
#define COMPILE_TEMPLATE_MMX2 1 #define COMPILE_TEMPLATE_MMX2 1
#define COMPILE_TEMPLATE_AMD3DNOW 0
#define RENAME(a) a ## _MMX2 #define RENAME(a) a ## _MMX2
#include "x86/swscale_template.c" #include "x86/swscale_template.c"
#endif #endif
//3DNOW versions
#if COMPILE_3DNOW
#undef RENAME
#undef COMPILE_TEMPLATE_MMX
#undef COMPILE_TEMPLATE_MMX2
#undef COMPILE_TEMPLATE_AMD3DNOW
#define COMPILE_TEMPLATE_MMX 1
#define COMPILE_TEMPLATE_MMX2 0
#define COMPILE_TEMPLATE_AMD3DNOW 1
#define RENAME(a) a ## _3DNow
#include "x86/swscale_template.c"
#endif
#endif //ARCH_X86
SwsFunc ff_getSwsFunc(SwsContext *c) SwsFunc ff_getSwsFunc(SwsContext *c)
{ {
int cpu_flags = av_get_cpu_flags();
sws_init_swScale_c(c); sws_init_swScale_c(c);
#if CONFIG_RUNTIME_CPUDETECT #if HAVE_MMX
#if ARCH_X86 if (cpu_flags & AV_CPU_FLAG_MMX)
// ordered per speed fastest first
if (c->flags & SWS_CPU_CAPS_MMX2) {
sws_init_swScale_MMX2(c);
return swScale_MMX2;
} else if (c->flags & SWS_CPU_CAPS_3DNOW) {
sws_init_swScale_3DNow(c);
return swScale_3DNow;
} else if (c->flags & SWS_CPU_CAPS_MMX) {
sws_init_swScale_MMX(c); sws_init_swScale_MMX(c);
return swScale_MMX;
}
#else
#if COMPILE_ALTIVEC
if (c->flags & SWS_CPU_CAPS_ALTIVEC) {
sws_init_swScale_altivec(c);
return swScale_altivec;
}
#endif #endif
#endif /* ARCH_X86 */ #if HAVE_MMX2
#else //CONFIG_RUNTIME_CPUDETECT if (cpu_flags & AV_CPU_FLAG_MMX2)
#if COMPILE_TEMPLATE_MMX2 sws_init_swScale_MMX2(c);
sws_init_swScale_MMX2(c); #endif
return swScale_MMX2; #if HAVE_ALTIVEC
#elif COMPILE_TEMPLATE_AMD3DNOW if (cpu_flags & AV_CPU_FLAG_ALTIVEC)
sws_init_swScale_3DNow(c); sws_init_swScale_altivec(c);
return swScale_3DNow;
#elif COMPILE_TEMPLATE_MMX
sws_init_swScale_MMX(c);
return swScale_MMX;
#elif COMPILE_TEMPLATE_ALTIVEC
sws_init_swScale_altivec(c);
return swScale_altivec;
#endif #endif
#endif //!CONFIG_RUNTIME_CPUDETECT
return swScale_c; return swScale_c;
} }
...@@ -1900,23 +1805,6 @@ static int planarCopyWrapper(SwsContext *c, const uint8_t* src[], int srcStride[ ...@@ -1900,23 +1805,6 @@ static int planarCopyWrapper(SwsContext *c, const uint8_t* src[], int srcStride[
return srcSliceH; return srcSliceH;
} }
int ff_hardcodedcpuflags(void)
{
int flags = 0;
#if COMPILE_TEMPLATE_MMX2
flags |= SWS_CPU_CAPS_MMX|SWS_CPU_CAPS_MMX2;
#elif COMPILE_TEMPLATE_AMD3DNOW
flags |= SWS_CPU_CAPS_MMX|SWS_CPU_CAPS_3DNOW;
#elif COMPILE_TEMPLATE_MMX
flags |= SWS_CPU_CAPS_MMX;
#elif COMPILE_TEMPLATE_ALTIVEC
flags |= SWS_CPU_CAPS_ALTIVEC;
#elif ARCH_BFIN
flags |= SWS_CPU_CAPS_BFIN;
#endif
return flags;
}
void ff_get_unscaled_swscale(SwsContext *c) void ff_get_unscaled_swscale(SwsContext *c)
{ {
const enum PixelFormat srcFormat = c->srcFormat; const enum PixelFormat srcFormat = c->srcFormat;
...@@ -2000,8 +1888,8 @@ void ff_get_unscaled_swscale(SwsContext *c) ...@@ -2000,8 +1888,8 @@ void ff_get_unscaled_swscale(SwsContext *c)
if(srcFormat == PIX_FMT_UYVY422 && dstFormat == PIX_FMT_YUV422P) if(srcFormat == PIX_FMT_UYVY422 && dstFormat == PIX_FMT_YUV422P)
c->swScale= uyvyToYuv422Wrapper; c->swScale= uyvyToYuv422Wrapper;
#if COMPILE_ALTIVEC #if HAVE_ALTIVEC
if ((c->flags & SWS_CPU_CAPS_ALTIVEC) && if ((av_get_cpu_flags() & AV_CPU_FLAG_ALTIVEC) &&
!(c->flags & SWS_BITEXACT) && !(c->flags & SWS_BITEXACT) &&
srcFormat == PIX_FMT_YUV420P) { srcFormat == PIX_FMT_YUV420P) {
// unscaled YV12 -> packed YUV, we want speed // unscaled YV12 -> packed YUV, we want speed
...@@ -2031,8 +1919,7 @@ void ff_get_unscaled_swscale(SwsContext *c) ...@@ -2031,8 +1919,7 @@ void ff_get_unscaled_swscale(SwsContext *c)
c->swScale= planarCopyWrapper; c->swScale= planarCopyWrapper;
} }
#if ARCH_BFIN #if ARCH_BFIN
if (flags & SWS_CPU_CAPS_BFIN) ff_bfin_get_unscaled_swscale (c);
ff_bfin_get_unscaled_swscale (c);
#endif #endif
} }
......
...@@ -95,13 +95,6 @@ const char *swscale_license(void); ...@@ -95,13 +95,6 @@ const char *swscale_license(void);
#define SWS_ACCURATE_RND 0x40000 #define SWS_ACCURATE_RND 0x40000
#define SWS_BITEXACT 0x80000 #define SWS_BITEXACT 0x80000
#define SWS_CPU_CAPS_MMX 0x80000000
#define SWS_CPU_CAPS_MMX2 0x20000000
#define SWS_CPU_CAPS_3DNOW 0x40000000
#define SWS_CPU_CAPS_ALTIVEC 0x10000000
#define SWS_CPU_CAPS_BFIN 0x01000000
#define SWS_CPU_CAPS_SSE2 0x02000000
#define SWS_MAX_REDUCE_CUTOFF 0.002 #define SWS_MAX_REDUCE_CUTOFF 0.002
#define SWS_CS_ITU709 1 #define SWS_CS_ITU709 1
......
...@@ -481,11 +481,6 @@ extern const AVClass sws_context_class; ...@@ -481,11 +481,6 @@ extern const AVClass sws_context_class;
*/ */
void ff_get_unscaled_swscale(SwsContext *c); void ff_get_unscaled_swscale(SwsContext *c);
/**
* Returns the SWS_CPU_CAPS for the optimized code compiled into swscale.
*/
int ff_hardcodedcpuflags(void);
/** /**
* Returns function pointer to fastest main scaler path function depending * Returns function pointer to fastest main scaler path function depending
* on architecture and available optimizations. * on architecture and available optimizations.
......
This diff is collapsed.
This diff is collapsed.
...@@ -27,6 +27,7 @@ ...@@ -27,6 +27,7 @@
#include "config.h" #include "config.h"
#include "libavutil/x86_cpu.h" #include "libavutil/x86_cpu.h"
#include "libavutil/cpu.h"
#include "libavutil/bswap.h" #include "libavutil/bswap.h"
#include "libswscale/rgb2rgb.h" #include "libswscale/rgb2rgb.h"
#include "libswscale/swscale.h" #include "libswscale/swscale.h"
...@@ -122,16 +123,16 @@ DECLARE_ASM_CONST(8, uint64_t, blue_15mask) = 0x0000001f0000001fULL; ...@@ -122,16 +123,16 @@ DECLARE_ASM_CONST(8, uint64_t, blue_15mask) = 0x0000001f0000001fULL;
32-bit C version, and and&add trick by Michael Niedermayer 32-bit C version, and and&add trick by Michael Niedermayer
*/ */
void rgb2rgb_init_x86(int flags) void rgb2rgb_init_x86(void)
{ {
#if HAVE_MMX2 || HAVE_AMD3DNOW || HAVE_MMX int cpu_flags = av_get_cpu_flags();
if (flags & SWS_CPU_CAPS_SSE2)
rgb2rgb_init_SSE2(); if (HAVE_MMX && cpu_flags & AV_CPU_FLAG_MMX)
else if (flags & SWS_CPU_CAPS_MMX2)
rgb2rgb_init_MMX2();
else if (flags & SWS_CPU_CAPS_3DNOW)
rgb2rgb_init_3DNOW();
else if (flags & SWS_CPU_CAPS_MMX)
rgb2rgb_init_MMX(); rgb2rgb_init_MMX();
#endif /* HAVE_MMX2 || HAVE_AMD3DNOW || HAVE_MMX */ if (HAVE_AMD3DNOW && cpu_flags & AV_CPU_FLAG_3DNOW)
rgb2rgb_init_3DNOW();
if (HAVE_MMX2 && cpu_flags & AV_CPU_FLAG_MMX2)
rgb2rgb_init_MMX2();
if (HAVE_SSE && cpu_flags & AV_CPU_FLAG_SSE2)
rgb2rgb_init_SSE2();
} }
This diff is collapsed.
...@@ -34,6 +34,7 @@ ...@@ -34,6 +34,7 @@
#include "libswscale/swscale.h" #include "libswscale/swscale.h"
#include "libswscale/swscale_internal.h" #include "libswscale/swscale_internal.h"
#include "libavutil/x86_cpu.h" #include "libavutil/x86_cpu.h"
#include "libavutil/cpu.h"
#define DITHER1XBPP // only for MMX #define DITHER1XBPP // only for MMX
...@@ -46,57 +47,58 @@ DECLARE_ASM_CONST(8, uint64_t, pb_03) = 0x0303030303030303ULL; ...@@ -46,57 +47,58 @@ DECLARE_ASM_CONST(8, uint64_t, pb_03) = 0x0303030303030303ULL;
DECLARE_ASM_CONST(8, uint64_t, pb_07) = 0x0707070707070707ULL; DECLARE_ASM_CONST(8, uint64_t, pb_07) = 0x0707070707070707ULL;
//MMX versions //MMX versions
#if HAVE_MMX
#undef RENAME #undef RENAME
#undef HAVE_MMX2 #undef COMPILE_TEMPLATE_MMX2
#undef HAVE_AMD3DNOW #define COMPILE_TEMPLATE_MMX2 0
#define HAVE_MMX2 0
#define HAVE_AMD3DNOW 0
#define RENAME(a) a ## _MMX #define RENAME(a) a ## _MMX
#include "yuv2rgb_template.c" #include "yuv2rgb_template.c"
#endif /* HAVE_MMX */
//MMX2 versions //MMX2 versions
#if HAVE_MMX2
#undef RENAME #undef RENAME
#undef HAVE_MMX2 #undef COMPILE_TEMPLATE_MMX2
#define HAVE_MMX2 1 #define COMPILE_TEMPLATE_MMX2 1
#define RENAME(a) a ## _MMX2 #define RENAME(a) a ## _MMX2
#include "yuv2rgb_template.c" #include "yuv2rgb_template.c"
#endif /* HAVE_MMX2 */
SwsFunc ff_yuv2rgb_init_mmx(SwsContext *c) SwsFunc ff_yuv2rgb_init_mmx(SwsContext *c)
{ {
if (c->flags & SWS_CPU_CAPS_MMX2) { int cpu_flags = av_get_cpu_flags();
if (c->srcFormat != PIX_FMT_YUV420P &&
c->srcFormat != PIX_FMT_YUVA420P)
return NULL;
if (HAVE_MMX2 && cpu_flags & AV_CPU_FLAG_MMX2) {
switch (c->dstFormat) { switch (c->dstFormat) {
case PIX_FMT_RGB32:
if (CONFIG_SWSCALE_ALPHA && c->srcFormat == PIX_FMT_YUVA420P) {
if (HAVE_7REGS) return yuva420_rgb32_MMX2;
break;
} else return yuv420_rgb32_MMX2;
case PIX_FMT_BGR32:
if (CONFIG_SWSCALE_ALPHA && c->srcFormat == PIX_FMT_YUVA420P) {
if (HAVE_7REGS) return yuva420_bgr32_MMX2;
break;
} else return yuv420_bgr32_MMX2;
case PIX_FMT_RGB24: return yuv420_rgb24_MMX2; case PIX_FMT_RGB24: return yuv420_rgb24_MMX2;
case PIX_FMT_BGR24: return yuv420_bgr24_MMX2; case PIX_FMT_BGR24: return yuv420_bgr24_MMX2;
case PIX_FMT_RGB565: return yuv420_rgb16_MMX2;
case PIX_FMT_RGB555: return yuv420_rgb15_MMX2;
} }
} }
if (c->flags & SWS_CPU_CAPS_MMX) {
if (HAVE_MMX && cpu_flags & AV_CPU_FLAG_MMX) {
switch (c->dstFormat) { switch (c->dstFormat) {
case PIX_FMT_RGB32: case PIX_FMT_RGB32:
if (CONFIG_SWSCALE_ALPHA && c->srcFormat == PIX_FMT_YUVA420P) { if (CONFIG_SWSCALE_ALPHA && c->srcFormat == PIX_FMT_YUVA420P) {
if (HAVE_7REGS) return yuva420_rgb32_MMX; #if HAVE_7REGS
break; return yuva420_rgb32_MMX;
} else return yuv420_rgb32_MMX; #endif
case PIX_FMT_BGR32: break;
if (CONFIG_SWSCALE_ALPHA && c->srcFormat == PIX_FMT_YUVA420P) { } else return yuv420_rgb32_MMX;
if (HAVE_7REGS) return yuva420_bgr32_MMX; case PIX_FMT_BGR32:
break; if (CONFIG_SWSCALE_ALPHA && c->srcFormat == PIX_FMT_YUVA420P) {
} else return yuv420_bgr32_MMX; #if HAVE_7REGS
case PIX_FMT_RGB24: return yuv420_rgb24_MMX; return yuva420_bgr32_MMX;
case PIX_FMT_BGR24: return yuv420_bgr24_MMX; #endif
case PIX_FMT_RGB565: return yuv420_rgb16_MMX; break;
case PIX_FMT_RGB555: return yuv420_rgb15_MMX; } else return yuv420_bgr32_MMX;
case PIX_FMT_RGB24: return yuv420_rgb24_MMX;
case PIX_FMT_BGR24: return yuv420_bgr24_MMX;
case PIX_FMT_RGB565: return yuv420_rgb16_MMX;
case PIX_FMT_RGB555: return yuv420_rgb15_MMX;
} }
} }
......
...@@ -25,14 +25,7 @@ ...@@ -25,14 +25,7 @@
#undef EMMS #undef EMMS
#undef SFENCE #undef SFENCE
#if HAVE_AMD3DNOW #if COMPILE_TEMPLATE_MMX2
/* On K6 femms is faster than emms. On K7 femms is directly mapped to emms. */
#define EMMS "femms"
#else
#define EMMS "emms"
#endif
#if HAVE_MMX2
#define MOVNTQ "movntq" #define MOVNTQ "movntq"
#define SFENCE "sfence" #define SFENCE "sfence"
#else #else
...@@ -159,7 +152,8 @@ ...@@ -159,7 +152,8 @@
} \ } \
#define YUV2RGB_ENDFUNC \ #define YUV2RGB_ENDFUNC \
__asm__ volatile (SFENCE"\n\t"EMMS); \ __asm__ volatile (SFENCE"\n\t" \
"emms \n\t"); \
return srcSliceH; \ return srcSliceH; \
#define IF0(x) #define IF0(x)
...@@ -188,6 +182,7 @@ ...@@ -188,6 +182,7 @@
"paddusb "GREEN_DITHER"(%4), %%mm2\n\t" \ "paddusb "GREEN_DITHER"(%4), %%mm2\n\t" \
"paddusb "RED_DITHER"(%4), %%mm1\n\t" \ "paddusb "RED_DITHER"(%4), %%mm1\n\t" \
#if !COMPILE_TEMPLATE_MMX2
static inline int RENAME(yuv420_rgb15)(SwsContext *c, const uint8_t *src[], static inline int RENAME(yuv420_rgb15)(SwsContext *c, const uint8_t *src[],
int srcStride[], int srcStride[],
int srcSliceY, int srcSliceH, int srcSliceY, int srcSliceH,
...@@ -243,6 +238,7 @@ static inline int RENAME(yuv420_rgb16)(SwsContext *c, const uint8_t *src[], ...@@ -243,6 +238,7 @@ static inline int RENAME(yuv420_rgb16)(SwsContext *c, const uint8_t *src[],
YUV2RGB_OPERANDS YUV2RGB_OPERANDS
YUV2RGB_ENDFUNC YUV2RGB_ENDFUNC
} }
#endif /* !COMPILE_TEMPLATE_MMX2 */
#define RGB_PACK24(blue, red)\ #define RGB_PACK24(blue, red)\
"packuswb %%mm3, %%mm0 \n" /* R0 R2 R4 R6 R1 R3 R5 R7 */\ "packuswb %%mm3, %%mm0 \n" /* R0 R2 R4 R6 R1 R3 R5 R7 */\
...@@ -259,7 +255,7 @@ static inline int RENAME(yuv420_rgb16)(SwsContext *c, const uint8_t *src[], ...@@ -259,7 +255,7 @@ static inline int RENAME(yuv420_rgb16)(SwsContext *c, const uint8_t *src[],
"punpckhwd %%mm6, %%mm5 \n" /* R4 G4 B4 R5 R6 G6 B6 R7 */\ "punpckhwd %%mm6, %%mm5 \n" /* R4 G4 B4 R5 R6 G6 B6 R7 */\
RGB_PACK24_B RGB_PACK24_B
#if HAVE_MMX2 #if COMPILE_TEMPLATE_MMX2
DECLARE_ASM_CONST(8, int16_t, mask1101[4]) = {-1,-1, 0,-1}; DECLARE_ASM_CONST(8, int16_t, mask1101[4]) = {-1,-1, 0,-1};
DECLARE_ASM_CONST(8, int16_t, mask0010[4]) = { 0, 0,-1, 0}; DECLARE_ASM_CONST(8, int16_t, mask0010[4]) = { 0, 0,-1, 0};
DECLARE_ASM_CONST(8, int16_t, mask0110[4]) = { 0,-1,-1, 0}; DECLARE_ASM_CONST(8, int16_t, mask0110[4]) = { 0,-1,-1, 0};
...@@ -366,6 +362,7 @@ static inline int RENAME(yuv420_bgr24)(SwsContext *c, const uint8_t *src[], ...@@ -366,6 +362,7 @@ static inline int RENAME(yuv420_bgr24)(SwsContext *c, const uint8_t *src[],
MOVNTQ " %%mm5, 16(%1)\n\t" \ MOVNTQ " %%mm5, 16(%1)\n\t" \
MOVNTQ " %%mm"alpha", 24(%1)\n\t" \ MOVNTQ " %%mm"alpha", 24(%1)\n\t" \
#if !COMPILE_TEMPLATE_MMX2
static inline int RENAME(yuv420_rgb32)(SwsContext *c, const uint8_t *src[], static inline int RENAME(yuv420_rgb32)(SwsContext *c, const uint8_t *src[],
int srcStride[], int srcStride[],
int srcSliceY, int srcSliceH, int srcSliceY, int srcSliceH,
...@@ -386,12 +383,12 @@ static inline int RENAME(yuv420_rgb32)(SwsContext *c, const uint8_t *src[], ...@@ -386,12 +383,12 @@ static inline int RENAME(yuv420_rgb32)(SwsContext *c, const uint8_t *src[],
YUV2RGB_ENDFUNC YUV2RGB_ENDFUNC
} }
#if HAVE_7REGS && CONFIG_SWSCALE_ALPHA
static inline int RENAME(yuva420_rgb32)(SwsContext *c, const uint8_t *src[], static inline int RENAME(yuva420_rgb32)(SwsContext *c, const uint8_t *src[],
int srcStride[], int srcStride[],
int srcSliceY, int srcSliceH, int srcSliceY, int srcSliceH,
uint8_t *dst[], int dstStride[]) uint8_t *dst[], int dstStride[])
{ {
#if HAVE_7REGS
int y, h_size; int y, h_size;
YUV2RGB_LOOP(4) YUV2RGB_LOOP(4)
...@@ -406,9 +403,8 @@ static inline int RENAME(yuva420_rgb32)(SwsContext *c, const uint8_t *src[], ...@@ -406,9 +403,8 @@ static inline int RENAME(yuva420_rgb32)(SwsContext *c, const uint8_t *src[],
YUV2RGB_ENDLOOP(4) YUV2RGB_ENDLOOP(4)
YUV2RGB_OPERANDS_ALPHA YUV2RGB_OPERANDS_ALPHA
YUV2RGB_ENDFUNC YUV2RGB_ENDFUNC
#endif
return 0;
} }
#endif
static inline int RENAME(yuv420_bgr32)(SwsContext *c, const uint8_t *src[], static inline int RENAME(yuv420_bgr32)(SwsContext *c, const uint8_t *src[],
int srcStride[], int srcStride[],
...@@ -430,12 +426,12 @@ static inline int RENAME(yuv420_bgr32)(SwsContext *c, const uint8_t *src[], ...@@ -430,12 +426,12 @@ static inline int RENAME(yuv420_bgr32)(SwsContext *c, const uint8_t *src[],
YUV2RGB_ENDFUNC YUV2RGB_ENDFUNC
} }
#if HAVE_7REGS && CONFIG_SWSCALE_ALPHA
static inline int RENAME(yuva420_bgr32)(SwsContext *c, const uint8_t *src[], static inline int RENAME(yuva420_bgr32)(SwsContext *c, const uint8_t *src[],
int srcStride[], int srcStride[],
int srcSliceY, int srcSliceH, int srcSliceY, int srcSliceH,
uint8_t *dst[], int dstStride[]) uint8_t *dst[], int dstStride[])
{ {
#if HAVE_7REGS
int y, h_size; int y, h_size;
YUV2RGB_LOOP(4) YUV2RGB_LOOP(4)
...@@ -450,6 +446,7 @@ static inline int RENAME(yuva420_bgr32)(SwsContext *c, const uint8_t *src[], ...@@ -450,6 +446,7 @@ static inline int RENAME(yuva420_bgr32)(SwsContext *c, const uint8_t *src[],
YUV2RGB_ENDLOOP(4) YUV2RGB_ENDLOOP(4)
YUV2RGB_OPERANDS_ALPHA YUV2RGB_OPERANDS_ALPHA
YUV2RGB_ENDFUNC YUV2RGB_ENDFUNC
#endif
return 0;
} }
#endif
#endif /* !COMPILE_TEMPLATE_MMX2 */
...@@ -32,7 +32,7 @@ ...@@ -32,7 +32,7 @@
#include "rgb2rgb.h" #include "rgb2rgb.h"
#include "swscale.h" #include "swscale.h"
#include "swscale_internal.h" #include "swscale_internal.h"
#include "libavutil/x86_cpu.h" #include "libavutil/cpu.h"
#include "libavutil/bswap.h" #include "libavutil/bswap.h"
extern const uint8_t dither_4x4_16[4][8]; extern const uint8_t dither_4x4_16[4][8];
...@@ -579,24 +579,18 @@ CLOSEYUV2RGBFUNC(1) ...@@ -579,24 +579,18 @@ CLOSEYUV2RGBFUNC(1)
SwsFunc ff_yuv2rgb_get_func_ptr(SwsContext *c) SwsFunc ff_yuv2rgb_get_func_ptr(SwsContext *c)
{ {
SwsFunc t = NULL; SwsFunc t = NULL;
#if HAVE_MMX
t = ff_yuv2rgb_init_mmx(c);
#endif
#if HAVE_VIS
t = ff_yuv2rgb_init_vis(c);
#endif
#if CONFIG_MLIB
t = ff_yuv2rgb_init_mlib(c);
#endif
#if HAVE_ALTIVEC
if (c->flags & SWS_CPU_CAPS_ALTIVEC)
t = ff_yuv2rgb_init_altivec(c);
#endif
#if ARCH_BFIN if (HAVE_MMX) {
if (c->flags & SWS_CPU_CAPS_BFIN) t = ff_yuv2rgb_init_mmx(c);
} else if (HAVE_VIS) {
t = ff_yuv2rgb_init_vis(c);
} else if (CONFIG_MLIB) {
t = ff_yuv2rgb_init_mlib(c);
} else if (HAVE_ALTIVEC) {
t = ff_yuv2rgb_init_altivec(c);
} else if (ARCH_BFIN) {
t = ff_yuv2rgb_get_func_ptr_bfin(c); t = ff_yuv2rgb_get_func_ptr_bfin(c);
#endif }
if (t) if (t)
return t; return t;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment