mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2024-12-28 02:12:28 +00:00
Merge commit 'a1bcc76e6036e78f25cbb7323c145056cfca9d93'
* commit 'a1bcc76e6036e78f25cbb7323c145056cfca9d93': (21 commits) cmdutils: fix a memleak when specifying an option twice. x86: mpegvideo: more sensible names for optimization file and init function x86: mpegvideoenc: Split optimizations off into a separate file dnxhdenc: x86: more sensible names for optimization file and init function svq1/svq3: Move common code out of SVQ1 decoder-specific file dirac: add Comments and references to the standard lavr: x86: optimized 6-channel flt to fltp conversion lavr: x86: optimized 2-channel flt to fltp conversion lavr: x86: optimized 6-channel flt to s16p conversion lavr: x86: optimized 2-channel flt to s16p conversion lavr: x86: optimized 6-channel s16 to fltp conversion lavr: x86: optimized 2-channel s16 to fltp conversion lavr: x86: optimized 6-channel s16 to s16p conversion lavr: x86: optimized 2-channel s16 to s16p conversion lavr: x86: optimized 2-channel fltp to flt conversion lavr: x86: optimized 6-channel fltp to s16 conversion lavr: x86: optimized 2-channel fltp to s16 conversion lavr: x86: optimized 6-channel s16p to flt conversion lavr: x86: optimized 2-channel s16p to flt conversion lavr: x86: optimized 6-channel s16p to s16 conversion ... Conflicts: libavcodec/dirac.c libavcodec/mpegvideo.h libavcodec/x86/Makefile Merged-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
commit
bec180e112
@ -301,6 +301,7 @@ int parse_option(void *optctx, const char *opt, const char *arg,
|
||||
if (po->flags & OPT_STRING) {
|
||||
char *str;
|
||||
str = av_strdup(arg);
|
||||
// av_freep(dst);
|
||||
*(char **)dst = str;
|
||||
} else if (po->flags & OPT_BOOL) {
|
||||
*(int *)dst = bool_val;
|
||||
|
@ -405,14 +405,13 @@ OBJS-$(CONFIG_SUBRIP_ENCODER) += srtenc.o ass_split.o
|
||||
OBJS-$(CONFIG_SUBVIEWER_DECODER) += subviewerdec.o ass.o
|
||||
OBJS-$(CONFIG_SUNRAST_DECODER) += sunrast.o
|
||||
OBJS-$(CONFIG_SUNRAST_ENCODER) += sunrastenc.o
|
||||
OBJS-$(CONFIG_SVQ1_DECODER) += svq1dec.o svq1.o h263.o
|
||||
OBJS-$(CONFIG_SVQ1_DECODER) += svq1dec.o svq1.o svq13.o h263.o
|
||||
OBJS-$(CONFIG_SVQ1_ENCODER) += svq1enc.o svq1.o \
|
||||
h263.o ituh263enc.o
|
||||
OBJS-$(CONFIG_SVQ3_DECODER) += h264.o svq3.o \
|
||||
OBJS-$(CONFIG_SVQ3_DECODER) += svq3.o svq13.o h263.o h264.o \
|
||||
h264_loopfilter.o h264_direct.o \
|
||||
h264_sei.o h264_ps.o h264_refs.o \
|
||||
h264_cavlc.o h264_cabac.o cabac.o \
|
||||
svq1dec.o svq1.o h263.o
|
||||
h264_cavlc.o h264_cabac.o cabac.o
|
||||
OBJS-$(CONFIG_TARGA_DECODER) += targa.o
|
||||
OBJS-$(CONFIG_TARGA_ENCODER) += targaenc.o rle.o
|
||||
OBJS-$(CONFIG_THEORA_DECODER) += xiph.o
|
||||
|
@ -57,10 +57,7 @@ static const dirac_source_params dirac_source_parameters_defaults[] = {
|
||||
{ 7680, 4320, 1, 0, 1, 6, 1, 3840, 2160, 0, 0, 3, 3 },
|
||||
};
|
||||
|
||||
/**
|
||||
* Dirac Specification ->
|
||||
* Table 10.4 - Available preset pixel aspect ratio values
|
||||
*/
|
||||
/* [DIRAC_STD] Table 10.4 - Available preset pixel aspect ratio values */
|
||||
static const AVRational dirac_preset_aspect_ratios[] = {
|
||||
{1, 1},
|
||||
{10, 11},
|
||||
@ -70,19 +67,16 @@ static const AVRational dirac_preset_aspect_ratios[] = {
|
||||
{4, 3},
|
||||
};
|
||||
|
||||
/**
|
||||
* Dirac Specification ->
|
||||
* Values 9,10 of 10.3.5 Frame Rate. Table 10.3 Available preset frame rate values
|
||||
/* [DIRAC_STD] Values 9,10 of 10.3.5 Frame Rate.
|
||||
* Table 10.3 Available preset frame rate values
|
||||
*/
|
||||
static const AVRational dirac_frame_rate[] = {
|
||||
{15000, 1001},
|
||||
{25, 2},
|
||||
};
|
||||
|
||||
/**
|
||||
* Dirac Specification ->
|
||||
* This should be equivalent to Table 10.5 Available signal range presets
|
||||
*/
|
||||
/* [DIRAC_STD] This should be equivalent to Table 10.5 Available signal
|
||||
* range presets */
|
||||
static const struct {
|
||||
uint8_t bitdepth;
|
||||
enum AVColorRange color_range;
|
||||
@ -111,19 +105,14 @@ static const struct {
|
||||
{ AVCOL_PRI_BT709, AVCOL_SPC_BT709, AVCOL_TRC_UNSPECIFIED /* DCinema */ },
|
||||
};
|
||||
|
||||
/**
|
||||
* Dirac Specification ->
|
||||
* Table 10.2 Supported chroma sampling formats + Luma Offset
|
||||
*/
|
||||
/* [DIRAC_STD] Table 10.2 Supported chroma sampling formats + luma Offset */
|
||||
static const enum PixelFormat dirac_pix_fmt[2][3] = {
|
||||
{ PIX_FMT_YUV444P, PIX_FMT_YUV422P, PIX_FMT_YUV420P },
|
||||
{ PIX_FMT_YUVJ444P, PIX_FMT_YUVJ422P, PIX_FMT_YUVJ420P },
|
||||
};
|
||||
|
||||
/**
|
||||
* Dirac Specification ->
|
||||
* 10.3 Parse Source Parameters. source_parameters(base_video_format)
|
||||
*/
|
||||
/* [DIRAC_STD] 10.3 Parse Source Parameters.
|
||||
* source_parameters(base_video_format) */
|
||||
static int parse_source_parameters(AVCodecContext *avctx, GetBitContext *gb,
|
||||
dirac_source_params *source)
|
||||
{
|
||||
@ -132,15 +121,18 @@ static int parse_source_parameters(AVCodecContext *avctx, GetBitContext *gb,
|
||||
int idx;
|
||||
|
||||
/* [DIRAC_STD] 10.3.2 Frame size. frame_size(video_params) */
|
||||
if (get_bits1(gb)) { /* [DIRAC_STD] custom_dimensions_flag */
|
||||
source->width = svq3_get_ue_golomb(gb); /* [DIRAC_STD] FRAME_WIDTH */
|
||||
source->height = svq3_get_ue_golomb(gb); /* [DIRAC_STD] FRAME_HEIGHT */
|
||||
/* [DIRAC_STD] custom_dimensions_flag */
|
||||
if (get_bits1(gb)) {
|
||||
source->width = svq3_get_ue_golomb(gb); /* [DIRAC_STD] FRAME_WIDTH */
|
||||
source->height = svq3_get_ue_golomb(gb); /* [DIRAC_STD] FRAME_HEIGHT */
|
||||
}
|
||||
|
||||
/* [DIRAC_STD] 10.3.3 Chroma Sampling Format.
|
||||
chroma_sampling_format(video_params) */
|
||||
if (get_bits1(gb)) /* [DIRAC_STD] custom_chroma_format_flag */
|
||||
source->chroma_format = svq3_get_ue_golomb(gb); /*[DIRAC_STD] CHROMA_FORMAT_INDEX */
|
||||
* chroma_sampling_format(video_params) */
|
||||
/* [DIRAC_STD] custom_chroma_format_flag */
|
||||
if (get_bits1(gb))
|
||||
/* [DIRAC_STD] CHROMA_FORMAT_INDEX */
|
||||
source->chroma_format = svq3_get_ue_golomb(gb);
|
||||
if (source->chroma_format > 2U) {
|
||||
av_log(avctx, AV_LOG_ERROR, "Unknown chroma format %d\n",
|
||||
source->chroma_format);
|
||||
@ -148,8 +140,10 @@ static int parse_source_parameters(AVCodecContext *avctx, GetBitContext *gb,
|
||||
}
|
||||
|
||||
/* [DIRAC_STD] 10.3.4 Scan Format. scan_format(video_params) */
|
||||
if (get_bits1(gb)) /* [DIRAC_STD] custom_scan_format_flag */
|
||||
source->interlaced = svq3_get_ue_golomb(gb); /* [DIRAC_STD] SOURCE_SAMPLING */
|
||||
/* [DIRAC_STD] custom_scan_format_flag */
|
||||
if (get_bits1(gb))
|
||||
/* [DIRAC_STD] SOURCE_SAMPLING */
|
||||
source->interlaced = svq3_get_ue_golomb(gb);
|
||||
if (source->interlaced > 1U)
|
||||
return AVERROR_INVALIDDATA;
|
||||
|
||||
@ -160,23 +154,29 @@ static int parse_source_parameters(AVCodecContext *avctx, GetBitContext *gb,
|
||||
if (source->frame_rate_index > 10U)
|
||||
return AVERROR_INVALIDDATA;
|
||||
|
||||
if (!source->frame_rate_index){
|
||||
frame_rate.num = svq3_get_ue_golomb(gb); /* [DIRAC_STD] FRAME_RATE_NUMER */
|
||||
frame_rate.den = svq3_get_ue_golomb(gb); /* [DIRAC_STD] FRAME_RATE_DENOM */
|
||||
if (!source->frame_rate_index) {
|
||||
/* [DIRAC_STD] FRAME_RATE_NUMER */
|
||||
frame_rate.num = svq3_get_ue_golomb(gb);
|
||||
/* [DIRAC_STD] FRAME_RATE_DENOM */
|
||||
frame_rate.den = svq3_get_ue_golomb(gb);
|
||||
}
|
||||
}
|
||||
if (source->frame_rate_index > 0) { /* [DIRAC_STD] preset_frame_rate(video_params,index) */
|
||||
/* [DIRAC_STD] preset_frame_rate(video_params, index) */
|
||||
if (source->frame_rate_index > 0) {
|
||||
if (source->frame_rate_index <= 8)
|
||||
frame_rate = avpriv_frame_rate_tab[source->frame_rate_index]; /* [DIRAC_STD] Table 10.3 values 1-8 */
|
||||
else
|
||||
frame_rate = dirac_frame_rate[source->frame_rate_index-9]; /* [DIRAC_STD] Table 10.3 values 9-10 */
|
||||
/* [DIRAC_STD] Table 10.3 values 9-10 */
|
||||
frame_rate = dirac_frame_rate[source->frame_rate_index-9];
|
||||
}
|
||||
av_reduce(&avctx->time_base.num, &avctx->time_base.den,
|
||||
frame_rate.den, frame_rate.num, 1<<30);
|
||||
|
||||
/* [DIRAC_STD] 10.3.6 Pixel Aspect Ratio. pixel_aspect_ratio(video_params) */
|
||||
/* [DIRAC_STD] 10.3.6 Pixel Aspect Ratio.
|
||||
* pixel_aspect_ratio(video_params) */
|
||||
if (get_bits1(gb)) { /* [DIRAC_STD] custom_pixel_aspect_ratio_flag */
|
||||
source->aspect_ratio_index = svq3_get_ue_golomb(gb); /* [DIRAC_STD] index */
|
||||
/* [DIRAC_STD] index */
|
||||
source->aspect_ratio_index = svq3_get_ue_golomb(gb);
|
||||
|
||||
if (source->aspect_ratio_index > 6U)
|
||||
return AVERROR_INVALIDDATA;
|
||||
@ -186,22 +186,30 @@ static int parse_source_parameters(AVCodecContext *avctx, GetBitContext *gb,
|
||||
avctx->sample_aspect_ratio.den = svq3_get_ue_golomb(gb);
|
||||
}
|
||||
}
|
||||
if (source->aspect_ratio_index > 0) /* [DIRAC_STD] Take value from Table 10.4 Available preset pixel aspect ratio values */
|
||||
/* [DIRAC_STD] Take value from Table 10.4 Available preset pixel
|
||||
* aspect ratio values */
|
||||
if (source->aspect_ratio_index > 0)
|
||||
avctx->sample_aspect_ratio =
|
||||
dirac_preset_aspect_ratios[source->aspect_ratio_index-1];
|
||||
|
||||
/* [DIRAC_STD] 10.3.7 Clean area. clean_area(video_params) */
|
||||
if (get_bits1(gb)) { /* [DIRAC_STD] custom_clean_area_flag */
|
||||
source->clean_width = svq3_get_ue_golomb(gb); /* [DIRAC_STD] CLEAN_WIDTH */
|
||||
source->clean_height = svq3_get_ue_golomb(gb); /* [DIRAC_STD] CLEAN_HEIGHT */
|
||||
source->clean_left_offset = svq3_get_ue_golomb(gb); /* [DIRAC_STD] CLEAN_LEFT_OFFSET */
|
||||
source->clean_right_offset = svq3_get_ue_golomb(gb); /* [DIRAC_STD] CLEAN_RIGHT_OFFSET */
|
||||
/* [DIRAC_STD] CLEAN_WIDTH */
|
||||
source->clean_width = svq3_get_ue_golomb(gb);
|
||||
/* [DIRAC_STD] CLEAN_HEIGHT */
|
||||
source->clean_height = svq3_get_ue_golomb(gb);
|
||||
/* [DIRAC_STD] CLEAN_LEFT_OFFSET */
|
||||
source->clean_left_offset = svq3_get_ue_golomb(gb);
|
||||
/* [DIRAC_STD] CLEAN_RIGHT_OFFSET */
|
||||
source->clean_right_offset = svq3_get_ue_golomb(gb);
|
||||
}
|
||||
|
||||
/*[DIRAC_STD] 10.3.8 Signal range. signal_range(video_params)
|
||||
WARNING: Some adaptation seemed to be done using the AVCOL_RANGE_MPEG/JPEG values */
|
||||
if (get_bits1(gb)) { /*[DIRAC_STD] custom_signal_range_flag */
|
||||
source->pixel_range_index = svq3_get_ue_golomb(gb); /*[DIRAC_STD] index */
|
||||
/* [DIRAC_STD] 10.3.8 Signal range. signal_range(video_params)
|
||||
* WARNING: Some adaptation seems to be done using the
|
||||
* AVCOL_RANGE_MPEG/JPEG values */
|
||||
if (get_bits1(gb)) { /* [DIRAC_STD] custom_signal_range_flag */
|
||||
/* [DIRAC_STD] index */
|
||||
source->pixel_range_index = svq3_get_ue_golomb(gb);
|
||||
|
||||
if (source->pixel_range_index > 4U)
|
||||
return AVERROR_INVALIDDATA;
|
||||
@ -210,13 +218,14 @@ static int parse_source_parameters(AVCodecContext *avctx, GetBitContext *gb,
|
||||
if (!source->pixel_range_index) {
|
||||
luma_offset = svq3_get_ue_golomb(gb);
|
||||
luma_depth = av_log2(svq3_get_ue_golomb(gb))+1;
|
||||
svq3_get_ue_golomb(gb); /* chroma offset @Jordi: Why are these two ignored? */
|
||||
svq3_get_ue_golomb(gb); /* chroma offset */
|
||||
svq3_get_ue_golomb(gb); /* chroma excursion */
|
||||
|
||||
avctx->color_range = luma_offset ? AVCOL_RANGE_MPEG : AVCOL_RANGE_JPEG;
|
||||
}
|
||||
}
|
||||
if (source->pixel_range_index > 0) { /*[DIRAC_STD] Take values from Table 10.5 Available signal range presets */
|
||||
/* [DIRAC_STD] Table 10.5
|
||||
* Available signal range presets <--> pixel_range_presets */
|
||||
if (source->pixel_range_index > 0) {
|
||||
idx = source->pixel_range_index-1;
|
||||
luma_depth = pixel_range_presets[idx].bitdepth;
|
||||
avctx->color_range = pixel_range_presets[idx].color_range;
|
||||
@ -229,7 +238,8 @@ static int parse_source_parameters(AVCodecContext *avctx, GetBitContext *gb,
|
||||
|
||||
/* [DIRAC_STD] 10.3.9 Colour specification. colour_spec(video_params) */
|
||||
if (get_bits1(gb)) { /* [DIRAC_STD] custom_colour_spec_flag */
|
||||
idx = source->color_spec_index = svq3_get_ue_golomb(gb); /* [DIRAC_STD] index */
|
||||
/* [DIRAC_STD] index */
|
||||
idx = source->color_spec_index = svq3_get_ue_golomb(gb);
|
||||
|
||||
if (source->color_spec_index > 4U)
|
||||
return AVERROR_INVALIDDATA;
|
||||
@ -239,13 +249,13 @@ static int parse_source_parameters(AVCodecContext *avctx, GetBitContext *gb,
|
||||
avctx->color_trc = dirac_color_presets[idx].color_trc;
|
||||
|
||||
if (!source->color_spec_index) {
|
||||
/* [DIRAC_STD] 10.3.9.1 Color primaries */
|
||||
/* [DIRAC_STD] 10.3.9.1 Colour primaries */
|
||||
if (get_bits1(gb)) {
|
||||
idx = svq3_get_ue_golomb(gb);
|
||||
if (idx < 3U)
|
||||
avctx->color_primaries = dirac_primaries[idx];
|
||||
}
|
||||
/* [DIRAC_STD] 10.3.9.2 Color matrix */
|
||||
/* [DIRAC_STD] 10.3.9.2 Colour matrix */
|
||||
if (get_bits1(gb)) {
|
||||
idx = svq3_get_ue_golomb(gb);
|
||||
if (!idx)
|
||||
@ -267,10 +277,7 @@ static int parse_source_parameters(AVCodecContext *avctx, GetBitContext *gb,
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Dirac Specification ->
|
||||
* 10. Sequence Header. sequence_header()
|
||||
*/
|
||||
/* [DIRAC_STD] 10. Sequence Header. sequence_header() */
|
||||
int avpriv_dirac_parse_sequence_header(AVCodecContext *avctx, GetBitContext *gb,
|
||||
dirac_source_params *source)
|
||||
{
|
||||
@ -284,7 +291,7 @@ int avpriv_dirac_parse_sequence_header(AVCodecContext *avctx, GetBitContext *gb,
|
||||
avctx->profile = svq3_get_ue_golomb(gb);
|
||||
avctx->level = svq3_get_ue_golomb(gb);
|
||||
/* [DIRAC_SPEC] sequence_header() -> base_video_format as defined in
|
||||
10.2 Base Video Format, table 10.1 Dirac predefined video formats */
|
||||
* 10.2 Base Video Format, table 10.1 Dirac predefined video formats */
|
||||
video_format = svq3_get_ue_golomb(gb);
|
||||
|
||||
if (version_major < 2)
|
||||
@ -298,7 +305,8 @@ int avpriv_dirac_parse_sequence_header(AVCodecContext *avctx, GetBitContext *gb,
|
||||
/* Fill in defaults for the source parameters. */
|
||||
*source = dirac_source_parameters_defaults[video_format];
|
||||
|
||||
// Override the defaults.
|
||||
/* [DIRAC_STD] 10.3 Source Parameters
|
||||
* Override the defaults. */
|
||||
if (ret = parse_source_parameters(avctx, gb, source))
|
||||
return ret;
|
||||
|
||||
@ -307,8 +315,8 @@ int avpriv_dirac_parse_sequence_header(AVCodecContext *avctx, GetBitContext *gb,
|
||||
|
||||
avcodec_set_dimensions(avctx, source->width, source->height);
|
||||
|
||||
/*[DIRAC_STD] picture_coding_mode shall be 0 for fields and 1 for frames
|
||||
currently only used to signal field coding */
|
||||
/* [DIRAC_STD] picture_coding_mode shall be 0 for fields and 1 for frames
|
||||
* currently only used to signal field coding */
|
||||
picture_coding_mode = svq3_get_ue_golomb(gb);
|
||||
if (picture_coding_mode != 0) {
|
||||
av_log(avctx, AV_LOG_ERROR, "Unsupported picture coding mode %d",
|
||||
|
@ -294,9 +294,8 @@ static int dnxhd_encode_init(AVCodecContext *avctx)
|
||||
ctx->block_width_l2 = 3;
|
||||
}
|
||||
|
||||
#if HAVE_MMX
|
||||
ff_dnxhd_init_mmx(ctx);
|
||||
#endif
|
||||
if (ARCH_X86)
|
||||
ff_dnxhdenc_init_x86(ctx);
|
||||
|
||||
ctx->m.mb_height = (avctx->height + 15) / 16;
|
||||
ctx->m.mb_width = (avctx->width + 15) / 16;
|
||||
|
@ -93,6 +93,6 @@ typedef struct DNXHDEncContext {
|
||||
void (*get_pixels_8x4_sym)(DCTELEM * /*align 16*/, const uint8_t *, int);
|
||||
} DNXHDEncContext;
|
||||
|
||||
void ff_dnxhd_init_mmx(DNXHDEncContext *ctx);
|
||||
void ff_dnxhdenc_init_x86(DNXHDEncContext *ctx);
|
||||
|
||||
#endif /* AVCODEC_DNXHDENC_H */
|
||||
|
@ -185,8 +185,8 @@ av_cold int ff_dct_common_init(MpegEncContext *s)
|
||||
s->dct_unquantize_mpeg2_intra = dct_unquantize_mpeg2_intra_bitexact;
|
||||
s->dct_unquantize_mpeg2_inter = dct_unquantize_mpeg2_inter_c;
|
||||
|
||||
#if HAVE_MMX
|
||||
ff_MPV_common_init_mmx(s);
|
||||
#if ARCH_X86
|
||||
ff_MPV_common_init_x86(s);
|
||||
#elif ARCH_ALPHA
|
||||
ff_MPV_common_init_axp(s);
|
||||
#elif HAVE_MMI
|
||||
|
@ -765,7 +765,8 @@ int ff_MPV_encode_init(AVCodecContext *avctx);
|
||||
int ff_MPV_encode_end(AVCodecContext *avctx);
|
||||
int ff_MPV_encode_picture(AVCodecContext *avctx, AVPacket *pkt,
|
||||
AVFrame *frame, int *got_packet);
|
||||
void ff_MPV_common_init_mmx(MpegEncContext *s);
|
||||
void ff_MPV_encode_init_x86(MpegEncContext *s);
|
||||
void ff_MPV_common_init_x86(MpegEncContext *s);
|
||||
void ff_MPV_common_init_axp(MpegEncContext *s);
|
||||
void ff_MPV_common_init_mmi(MpegEncContext *s);
|
||||
void ff_MPV_common_init_arm(MpegEncContext *s);
|
||||
|
@ -832,6 +832,9 @@ av_cold int ff_MPV_encode_init(AVCodecContext *avctx)
|
||||
if (ff_MPV_common_init(s) < 0)
|
||||
return -1;
|
||||
|
||||
if (ARCH_X86)
|
||||
ff_MPV_encode_init_x86(s);
|
||||
|
||||
if (!s->dct_quantize)
|
||||
s->dct_quantize = ff_dct_quantize_c;
|
||||
if (!s->denoise_dct)
|
||||
|
68
libavcodec/svq13.c
Normal file
68
libavcodec/svq13.c
Normal file
@ -0,0 +1,68 @@
|
||||
/*
|
||||
* SVQ1/SVQ3 decoder common code
|
||||
*
|
||||
* 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 "svq1.h"
|
||||
|
||||
static const uint16_t checksum_table[256] = {
|
||||
0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7,
|
||||
0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF,
|
||||
0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6,
|
||||
0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE,
|
||||
0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485,
|
||||
0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D,
|
||||
0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4,
|
||||
0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC,
|
||||
0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823,
|
||||
0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B,
|
||||
0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12,
|
||||
0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A,
|
||||
0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41,
|
||||
0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49,
|
||||
0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70,
|
||||
0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78,
|
||||
0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F,
|
||||
0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067,
|
||||
0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E,
|
||||
0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256,
|
||||
0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D,
|
||||
0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
|
||||
0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C,
|
||||
0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634,
|
||||
0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB,
|
||||
0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3,
|
||||
0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A,
|
||||
0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92,
|
||||
0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9,
|
||||
0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1,
|
||||
0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8,
|
||||
0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0
|
||||
};
|
||||
|
||||
uint16_t ff_svq1_packet_checksum (const uint8_t *data, const int length, int value) {
|
||||
int i;
|
||||
|
||||
for (i=0; i < length; i++) {
|
||||
value = checksum_table[data[i] ^ (value >> 8)] ^ ((value & 0xFF) << 8);
|
||||
}
|
||||
|
||||
return value;
|
||||
}
|
@ -58,41 +58,6 @@ typedef struct svq1_pmv_s {
|
||||
int y;
|
||||
} svq1_pmv;
|
||||
|
||||
static const uint16_t checksum_table[256] = {
|
||||
0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7,
|
||||
0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF,
|
||||
0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6,
|
||||
0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE,
|
||||
0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485,
|
||||
0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D,
|
||||
0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4,
|
||||
0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC,
|
||||
0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823,
|
||||
0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B,
|
||||
0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12,
|
||||
0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A,
|
||||
0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41,
|
||||
0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49,
|
||||
0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70,
|
||||
0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78,
|
||||
0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F,
|
||||
0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067,
|
||||
0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E,
|
||||
0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256,
|
||||
0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D,
|
||||
0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
|
||||
0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C,
|
||||
0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634,
|
||||
0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB,
|
||||
0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3,
|
||||
0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A,
|
||||
0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92,
|
||||
0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9,
|
||||
0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1,
|
||||
0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8,
|
||||
0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0
|
||||
};
|
||||
|
||||
static const uint8_t string_table[256] = {
|
||||
0x00, 0xD5, 0x7F, 0xAA, 0xFE, 0x2B, 0x81, 0x54,
|
||||
0x29, 0xFC, 0x56, 0x83, 0xD7, 0x02, 0xA8, 0x7D,
|
||||
@ -524,16 +489,6 @@ static int svq1_decode_delta_block (MpegEncContext *s, GetBitContext *bitbuf,
|
||||
return result;
|
||||
}
|
||||
|
||||
uint16_t ff_svq1_packet_checksum (const uint8_t *data, const int length, int value) {
|
||||
int i;
|
||||
|
||||
for (i=0; i < length; i++) {
|
||||
value = checksum_table[data[i] ^ (value >> 8)] ^ ((value & 0xFF) << 8);
|
||||
}
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
static void svq1_parse_string (GetBitContext *bitbuf, uint8_t *out) {
|
||||
uint8_t seed;
|
||||
int i;
|
||||
|
@ -14,7 +14,7 @@ MMX-OBJS += x86/dsputil_mmx.o \
|
||||
MMX-OBJS-$(CONFIG_AAC_DECODER) += x86/sbrdsp_init.o
|
||||
MMX-OBJS-$(CONFIG_AC3DSP) += x86/ac3dsp_init.o
|
||||
MMX-OBJS-$(CONFIG_CAVS_DECODER) += x86/cavsdsp_mmx.o
|
||||
MMX-OBJS-$(CONFIG_DNXHD_ENCODER) += x86/dnxhd_mmx.o
|
||||
MMX-OBJS-$(CONFIG_DNXHD_ENCODER) += x86/dnxhdenc.o
|
||||
MMX-OBJS-$(CONFIG_DWT) += x86/snowdsp_mmx.o \
|
||||
x86/dwt.o
|
||||
MMX-OBJS-$(CONFIG_ENCODERS) += x86/dsputilenc_mmx.o
|
||||
@ -24,7 +24,8 @@ MMX-OBJS-$(CONFIG_H264DSP) += x86/h264dsp_init.o
|
||||
MMX-OBJS-$(CONFIG_H264PRED) += x86/h264_intrapred_init.o
|
||||
MMX-OBJS-$(CONFIG_LPC) += x86/lpc_mmx.o
|
||||
MMX-OBJS-$(CONFIG_MPEGAUDIODSP) += x86/mpegaudiodec_mmx.o
|
||||
MMX-OBJS-$(CONFIG_MPEGVIDEO) += x86/mpegvideo_mmx.o
|
||||
MMX-OBJS-$(CONFIG_MPEGVIDEO) += x86/mpegvideo.o
|
||||
MMX-OBJS-$(CONFIG_MPEGVIDEOENC) += x86/mpegvideoenc.o
|
||||
MMX-OBJS-$(CONFIG_PNG_DECODER) += x86/pngdsp_init.o
|
||||
MMX-OBJS-$(CONFIG_PRORES_DECODER) += x86/proresdsp_init.o
|
||||
MMX-OBJS-$(CONFIG_PRORES_LGPL_DECODER) += x86/proresdsp_init.o
|
||||
|
@ -54,7 +54,7 @@ static void get_pixels_8x4_sym_sse2(DCTELEM *block, const uint8_t *pixels, int l
|
||||
|
||||
#endif /* HAVE_INLINE_ASM */
|
||||
|
||||
void ff_dnxhd_init_mmx(DNXHDEncContext *ctx)
|
||||
void ff_dnxhdenc_init_x86(DNXHDEncContext *ctx)
|
||||
{
|
||||
#if HAVE_INLINE_ASM
|
||||
if (av_get_cpu_flags() & AV_CPU_FLAG_SSE2) {
|
@ -1,7 +1,4 @@
|
||||
/*
|
||||
* The simplest mpeg encoder (well, it was the simplest!)
|
||||
* Copyright (c) 2000,2001 Fabrice Bellard
|
||||
*
|
||||
* Optimized for ia32 CPUs by Nick Kurshev <nickols_k@mail.ru>
|
||||
* h263, mpeg1, mpeg2 dequantizer & draw_edges by Michael Niedermayer <michaelni@gmx.at>
|
||||
*
|
||||
@ -31,9 +28,6 @@
|
||||
|
||||
#if HAVE_INLINE_ASM
|
||||
|
||||
extern uint16_t ff_inv_zigzag_direct16[64];
|
||||
|
||||
|
||||
static void dct_unquantize_h263_intra_mmx(MpegEncContext *s,
|
||||
DCTELEM *block, int n, int qscale)
|
||||
{
|
||||
@ -588,56 +582,14 @@ static void denoise_dct_sse2(MpegEncContext *s, DCTELEM *block){
|
||||
);
|
||||
}
|
||||
|
||||
#if HAVE_SSSE3
|
||||
#define HAVE_SSSE3_BAK
|
||||
#endif
|
||||
#undef HAVE_SSSE3
|
||||
#define HAVE_SSSE3 0
|
||||
|
||||
#undef HAVE_SSE2
|
||||
#undef HAVE_MMXEXT
|
||||
#define HAVE_SSE2 0
|
||||
#define HAVE_MMXEXT 0
|
||||
#define RENAME(a) a ## _MMX
|
||||
#define RENAMEl(a) a ## _mmx
|
||||
#include "mpegvideo_mmx_template.c"
|
||||
|
||||
#undef HAVE_MMXEXT
|
||||
#define HAVE_MMXEXT 1
|
||||
#undef RENAME
|
||||
#undef RENAMEl
|
||||
#define RENAME(a) a ## _MMX2
|
||||
#define RENAMEl(a) a ## _mmx2
|
||||
#include "mpegvideo_mmx_template.c"
|
||||
|
||||
#undef HAVE_SSE2
|
||||
#define HAVE_SSE2 1
|
||||
#undef RENAME
|
||||
#undef RENAMEl
|
||||
#define RENAME(a) a ## _SSE2
|
||||
#define RENAMEl(a) a ## _sse2
|
||||
#include "mpegvideo_mmx_template.c"
|
||||
|
||||
#ifdef HAVE_SSSE3_BAK
|
||||
#undef HAVE_SSSE3
|
||||
#define HAVE_SSSE3 1
|
||||
#undef RENAME
|
||||
#undef RENAMEl
|
||||
#define RENAME(a) a ## _SSSE3
|
||||
#define RENAMEl(a) a ## _sse2
|
||||
#include "mpegvideo_mmx_template.c"
|
||||
#endif
|
||||
|
||||
#endif /* HAVE_INLINE_ASM */
|
||||
|
||||
void ff_MPV_common_init_mmx(MpegEncContext *s)
|
||||
void ff_MPV_common_init_x86(MpegEncContext *s)
|
||||
{
|
||||
#if HAVE_INLINE_ASM
|
||||
int mm_flags = av_get_cpu_flags();
|
||||
|
||||
if (mm_flags & AV_CPU_FLAG_MMX) {
|
||||
const int dct_algo = s->avctx->dct_algo;
|
||||
|
||||
s->dct_unquantize_h263_intra = dct_unquantize_h263_intra_mmx;
|
||||
s->dct_unquantize_h263_inter = dct_unquantize_h263_inter_mmx;
|
||||
s->dct_unquantize_mpeg1_intra = dct_unquantize_mpeg1_intra_mmx;
|
||||
@ -651,21 +603,6 @@ void ff_MPV_common_init_mmx(MpegEncContext *s)
|
||||
} else {
|
||||
s->denoise_dct= denoise_dct_mmx;
|
||||
}
|
||||
|
||||
if(dct_algo==FF_DCT_AUTO || dct_algo==FF_DCT_MMX){
|
||||
#if HAVE_SSSE3
|
||||
if(mm_flags & AV_CPU_FLAG_SSSE3){
|
||||
s->dct_quantize= dct_quantize_SSSE3;
|
||||
} else
|
||||
#endif
|
||||
if(mm_flags & AV_CPU_FLAG_SSE2){
|
||||
s->dct_quantize= dct_quantize_SSE2;
|
||||
} else if (mm_flags & AV_CPU_FLAG_MMXEXT) {
|
||||
s->dct_quantize= dct_quantize_MMX2;
|
||||
} else {
|
||||
s->dct_quantize= dct_quantize_MMX;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif /* HAVE_INLINE_ASM */
|
||||
}
|
96
libavcodec/x86/mpegvideoenc.c
Normal file
96
libavcodec/x86/mpegvideoenc.c
Normal file
@ -0,0 +1,96 @@
|
||||
/*
|
||||
* The simplest mpeg encoder (well, it was the simplest!)
|
||||
* Copyright (c) 2000,2001 Fabrice Bellard
|
||||
*
|
||||
* 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 "libavutil/cpu.h"
|
||||
#include "libavutil/x86/asm.h"
|
||||
#include "libavcodec/avcodec.h"
|
||||
#include "libavcodec/dsputil.h"
|
||||
#include "libavcodec/mpegvideo.h"
|
||||
#include "dsputil_mmx.h"
|
||||
|
||||
#if HAVE_INLINE_ASM
|
||||
|
||||
extern uint16_t ff_inv_zigzag_direct16[64];
|
||||
|
||||
#if HAVE_SSSE3
|
||||
#define HAVE_SSSE3_BAK
|
||||
#endif
|
||||
#undef HAVE_SSSE3
|
||||
#define HAVE_SSSE3 0
|
||||
|
||||
#undef HAVE_SSE2
|
||||
#undef HAVE_MMXEXT
|
||||
#define HAVE_SSE2 0
|
||||
#define HAVE_MMXEXT 0
|
||||
#define RENAME(a) a ## _MMX
|
||||
#define RENAMEl(a) a ## _mmx
|
||||
#include "mpegvideoenc_template.c"
|
||||
|
||||
#undef HAVE_MMXEXT
|
||||
#define HAVE_MMXEXT 1
|
||||
#undef RENAME
|
||||
#undef RENAMEl
|
||||
#define RENAME(a) a ## _MMX2
|
||||
#define RENAMEl(a) a ## _mmx2
|
||||
#include "mpegvideoenc_template.c"
|
||||
|
||||
#undef HAVE_SSE2
|
||||
#define HAVE_SSE2 1
|
||||
#undef RENAME
|
||||
#undef RENAMEl
|
||||
#define RENAME(a) a ## _SSE2
|
||||
#define RENAMEl(a) a ## _sse2
|
||||
#include "mpegvideoenc_template.c"
|
||||
|
||||
#ifdef HAVE_SSSE3_BAK
|
||||
#undef HAVE_SSSE3
|
||||
#define HAVE_SSSE3 1
|
||||
#undef RENAME
|
||||
#undef RENAMEl
|
||||
#define RENAME(a) a ## _SSSE3
|
||||
#define RENAMEl(a) a ## _sse2
|
||||
#include "mpegvideoenc_template.c"
|
||||
#endif
|
||||
|
||||
#endif /* HAVE_INLINE_ASM */
|
||||
|
||||
void ff_MPV_encode_init_x86(MpegEncContext *s)
|
||||
{
|
||||
#if HAVE_INLINE_ASM
|
||||
int mm_flags = av_get_cpu_flags();
|
||||
const int dct_algo = s->avctx->dct_algo;
|
||||
|
||||
if (dct_algo == FF_DCT_AUTO || dct_algo == FF_DCT_MMX) {
|
||||
#if HAVE_SSSE3
|
||||
if (mm_flags & AV_CPU_FLAG_SSSE3) {
|
||||
s->dct_quantize = dct_quantize_SSSE3;
|
||||
} else
|
||||
#endif
|
||||
if (mm_flags & AV_CPU_FLAG_SSE2) {
|
||||
s->dct_quantize = dct_quantize_SSE2;
|
||||
} else if (mm_flags & AV_CPU_FLAG_MMXEXT) {
|
||||
s->dct_quantize = dct_quantize_MMX2;
|
||||
} else {
|
||||
s->dct_quantize = dct_quantize_MMX;
|
||||
}
|
||||
}
|
||||
#endif /* HAVE_INLINE_ASM */
|
||||
}
|
@ -30,6 +30,11 @@ pf_s32_inv_scale: times 8 dd 0x30000000
|
||||
pf_s32_scale: times 8 dd 0x4f000000
|
||||
pf_s16_inv_scale: times 4 dd 0x38000000
|
||||
pf_s16_scale: times 4 dd 0x47000000
|
||||
pb_shuf_unpack_even: db -1, -1, 0, 1, -1, -1, 2, 3, -1, -1, 8, 9, -1, -1, 10, 11
|
||||
pb_shuf_unpack_odd: db -1, -1, 4, 5, -1, -1, 6, 7, -1, -1, 12, 13, -1, -1, 14, 15
|
||||
pb_interleave_words: SHUFFLE_MASK_W 0, 4, 1, 5, 2, 6, 3, 7
|
||||
pb_deinterleave_words: SHUFFLE_MASK_W 0, 2, 4, 6, 1, 3, 5, 7
|
||||
pw_zero_even: times 4 dw 0x0000, 0xffff
|
||||
|
||||
SECTION_TEXT
|
||||
|
||||
@ -223,6 +228,512 @@ INIT_YMM avx
|
||||
CONV_FLT_TO_S32
|
||||
%endif
|
||||
|
||||
;------------------------------------------------------------------------------
|
||||
; void ff_conv_s16p_to_s16_2ch(int16_t *dst, int16_t *const *src, int len,
|
||||
; int channels);
|
||||
;------------------------------------------------------------------------------
|
||||
|
||||
%macro CONV_S16P_TO_S16_2CH 0
|
||||
cglobal conv_s16p_to_s16_2ch, 3,4,5, dst, src0, len, src1
|
||||
mov src1q, [src0q+gprsize]
|
||||
mov src0q, [src0q ]
|
||||
lea lenq, [2*lend]
|
||||
add src0q, lenq
|
||||
add src1q, lenq
|
||||
lea dstq, [dstq+2*lenq]
|
||||
neg lenq
|
||||
.loop
|
||||
mova m0, [src0q+lenq ]
|
||||
mova m1, [src1q+lenq ]
|
||||
mova m2, [src0q+lenq+mmsize]
|
||||
mova m3, [src1q+lenq+mmsize]
|
||||
SBUTTERFLY2 wd, 0, 1, 4
|
||||
SBUTTERFLY2 wd, 2, 3, 4
|
||||
mova [dstq+2*lenq+0*mmsize], m0
|
||||
mova [dstq+2*lenq+1*mmsize], m1
|
||||
mova [dstq+2*lenq+2*mmsize], m2
|
||||
mova [dstq+2*lenq+3*mmsize], m3
|
||||
add lenq, 2*mmsize
|
||||
jl .loop
|
||||
REP_RET
|
||||
%endmacro
|
||||
|
||||
INIT_XMM sse2
|
||||
CONV_S16P_TO_S16_2CH
|
||||
%if HAVE_AVX
|
||||
INIT_XMM avx
|
||||
CONV_S16P_TO_S16_2CH
|
||||
%endif
|
||||
|
||||
;------------------------------------------------------------------------------
|
||||
; void ff_conv_s16p_to_s16_6ch(int16_t *dst, int16_t *const *src, int len,
|
||||
; int channels);
|
||||
;------------------------------------------------------------------------------
|
||||
|
||||
;------------------------------------------------------------------------------
|
||||
; NOTE: In the 6-channel functions, len could be used as an index on x86-64
|
||||
; instead of just a counter, which would avoid incrementing the
|
||||
; pointers, but the extra complexity and amount of code is not worth
|
||||
; the small gain. On x86-32 there are not enough registers to use len
|
||||
; as an index without keeping two of the pointers on the stack and
|
||||
; loading them in each iteration.
|
||||
;------------------------------------------------------------------------------
|
||||
|
||||
%macro CONV_S16P_TO_S16_6CH 0
|
||||
%if ARCH_X86_64
|
||||
cglobal conv_s16p_to_s16_6ch, 3,8,7, dst, src0, len, src1, src2, src3, src4, src5
|
||||
%else
|
||||
cglobal conv_s16p_to_s16_6ch, 2,7,7, dst, src0, src1, src2, src3, src4, src5
|
||||
%define lend dword r2m
|
||||
%endif
|
||||
mov src1q, [src0q+1*gprsize]
|
||||
mov src2q, [src0q+2*gprsize]
|
||||
mov src3q, [src0q+3*gprsize]
|
||||
mov src4q, [src0q+4*gprsize]
|
||||
mov src5q, [src0q+5*gprsize]
|
||||
mov src0q, [src0q]
|
||||
sub src1q, src0q
|
||||
sub src2q, src0q
|
||||
sub src3q, src0q
|
||||
sub src4q, src0q
|
||||
sub src5q, src0q
|
||||
.loop:
|
||||
%if cpuflag(sse2slow)
|
||||
movq m0, [src0q ] ; m0 = 0, 6, 12, 18, x, x, x, x
|
||||
movq m1, [src0q+src1q] ; m1 = 1, 7, 13, 19, x, x, x, x
|
||||
movq m2, [src0q+src2q] ; m2 = 2, 8, 14, 20, x, x, x, x
|
||||
movq m3, [src0q+src3q] ; m3 = 3, 9, 15, 21, x, x, x, x
|
||||
movq m4, [src0q+src4q] ; m4 = 4, 10, 16, 22, x, x, x, x
|
||||
movq m5, [src0q+src5q] ; m5 = 5, 11, 17, 23, x, x, x, x
|
||||
; unpack words:
|
||||
punpcklwd m0, m1 ; m0 = 0, 1, 6, 7, 12, 13, 18, 19
|
||||
punpcklwd m2, m3 ; m2 = 4, 5, 10, 11, 16, 17, 22, 23
|
||||
punpcklwd m4, m5 ; m4 = 2, 3, 8, 9, 14, 15, 20, 21
|
||||
; blend dwords
|
||||
shufps m1, m0, m2, q2020 ; m1 = 0, 1, 12, 13, 2, 3, 14, 15
|
||||
shufps m0, m4, q2031 ; m0 = 6, 7, 18, 19, 4, 5, 16, 17
|
||||
shufps m2, m4, q3131 ; m2 = 8, 9, 20, 21, 10, 11, 22, 23
|
||||
; shuffle dwords
|
||||
pshufd m0, m0, q1302 ; m0 = 4, 5, 6, 7, 16, 17, 18, 19
|
||||
pshufd m1, m1, q3120 ; m1 = 0, 1, 2, 3, 12, 13, 14, 15
|
||||
pshufd m2, m2, q3120 ; m2 = 8, 9, 10, 11, 20, 21, 22, 23
|
||||
movq [dstq+0*mmsize/2], m1
|
||||
movq [dstq+1*mmsize/2], m0
|
||||
movq [dstq+2*mmsize/2], m2
|
||||
movhps [dstq+3*mmsize/2], m1
|
||||
movhps [dstq+4*mmsize/2], m0
|
||||
movhps [dstq+5*mmsize/2], m2
|
||||
add src0q, mmsize/2
|
||||
add dstq, mmsize*3
|
||||
sub lend, mmsize/4
|
||||
%else
|
||||
mova m0, [src0q ] ; m0 = 0, 6, 12, 18, 24, 30, 36, 42
|
||||
mova m1, [src0q+src1q] ; m1 = 1, 7, 13, 19, 25, 31, 37, 43
|
||||
mova m2, [src0q+src2q] ; m2 = 2, 8, 14, 20, 26, 32, 38, 44
|
||||
mova m3, [src0q+src3q] ; m3 = 3, 9, 15, 21, 27, 33, 39, 45
|
||||
mova m4, [src0q+src4q] ; m4 = 4, 10, 16, 22, 28, 34, 40, 46
|
||||
mova m5, [src0q+src5q] ; m5 = 5, 11, 17, 23, 29, 35, 41, 47
|
||||
; unpack words:
|
||||
SBUTTERFLY2 wd, 0, 1, 6 ; m0 = 0, 1, 6, 7, 12, 13, 18, 19
|
||||
; m1 = 24, 25, 30, 31, 36, 37, 42, 43
|
||||
SBUTTERFLY2 wd, 2, 3, 6 ; m2 = 2, 3, 8, 9, 14, 15, 20, 21
|
||||
; m3 = 26, 27, 32, 33, 38, 39, 44, 45
|
||||
SBUTTERFLY2 wd, 4, 5, 6 ; m4 = 4, 5, 10, 11, 16, 17, 22, 23
|
||||
; m5 = 28, 29, 34, 35, 40, 41, 46, 47
|
||||
; blend dwords
|
||||
shufps m6, m0, m2, q2020 ; m6 = 0, 1, 12, 13, 2, 3, 14, 15
|
||||
shufps m0, m4, q2031 ; m0 = 6, 7, 18, 19, 4, 5, 16, 17
|
||||
shufps m2, m4, q3131 ; m2 = 8, 9, 20, 21, 10, 11, 22, 23
|
||||
SWAP 4,6 ; m4 = 0, 1, 12, 13, 2, 3, 14, 15
|
||||
shufps m6, m1, m3, q2020 ; m6 = 24, 25, 36, 37, 26, 27, 38, 39
|
||||
shufps m1, m5, q2031 ; m1 = 30, 31, 42, 43, 28, 29, 40, 41
|
||||
shufps m3, m5, q3131 ; m3 = 32, 33, 44, 45, 34, 35, 46, 47
|
||||
SWAP 5,6 ; m5 = 24, 25, 36, 37, 26, 27, 38, 39
|
||||
; shuffle dwords
|
||||
pshufd m0, m0, q1302 ; m0 = 4, 5, 6, 7, 16, 17, 18, 19
|
||||
pshufd m2, m2, q3120 ; m2 = 8, 9, 10, 11, 20, 21, 22, 23
|
||||
pshufd m4, m4, q3120 ; m4 = 0, 1, 2, 3, 12, 13, 14, 15
|
||||
pshufd m1, m1, q1302 ; m1 = 28, 29, 30, 31, 40, 41, 42, 43
|
||||
pshufd m3, m3, q3120 ; m3 = 32, 33, 34, 35, 44, 45, 46, 47
|
||||
pshufd m5, m5, q3120 ; m5 = 24, 25, 26, 27, 36, 37, 38, 39
|
||||
; shuffle qwords
|
||||
punpcklqdq m6, m4, m0 ; m6 = 0, 1, 2, 3, 4, 5, 6, 7
|
||||
punpckhqdq m0, m2 ; m0 = 16, 17, 18, 19, 20, 21, 22, 23
|
||||
shufps m2, m4, q3210 ; m2 = 8, 9, 10, 11, 12, 13, 14, 15
|
||||
SWAP 4,6 ; m4 = 0, 1, 2, 3, 4, 5, 6, 7
|
||||
punpcklqdq m6, m5, m1 ; m6 = 24, 25, 26, 27, 28, 29, 30, 31
|
||||
punpckhqdq m1, m3 ; m1 = 40, 41, 42, 43, 44, 45, 46, 47
|
||||
shufps m3, m5, q3210 ; m3 = 32, 33, 34, 35, 36, 37, 38, 39
|
||||
SWAP 5,6 ; m5 = 24, 25, 26, 27, 28, 29, 30, 31
|
||||
mova [dstq+0*mmsize], m4
|
||||
mova [dstq+1*mmsize], m2
|
||||
mova [dstq+2*mmsize], m0
|
||||
mova [dstq+3*mmsize], m5
|
||||
mova [dstq+4*mmsize], m3
|
||||
mova [dstq+5*mmsize], m1
|
||||
add src0q, mmsize
|
||||
add dstq, mmsize*6
|
||||
sub lend, mmsize/2
|
||||
%endif
|
||||
jg .loop
|
||||
REP_RET
|
||||
%endmacro
|
||||
|
||||
INIT_XMM sse2
|
||||
CONV_S16P_TO_S16_6CH
|
||||
INIT_XMM sse2slow
|
||||
CONV_S16P_TO_S16_6CH
|
||||
%if HAVE_AVX
|
||||
INIT_XMM avx
|
||||
CONV_S16P_TO_S16_6CH
|
||||
%endif
|
||||
|
||||
;------------------------------------------------------------------------------
|
||||
; void ff_conv_s16p_to_flt_2ch(float *dst, int16_t *const *src, int len,
|
||||
; int channels);
|
||||
;------------------------------------------------------------------------------
|
||||
|
||||
%macro CONV_S16P_TO_FLT_2CH 0
|
||||
cglobal conv_s16p_to_flt_2ch, 3,4,6, dst, src0, len, src1
|
||||
lea lenq, [2*lend]
|
||||
mov src1q, [src0q+gprsize]
|
||||
mov src0q, [src0q ]
|
||||
lea dstq, [dstq+4*lenq]
|
||||
add src0q, lenq
|
||||
add src1q, lenq
|
||||
neg lenq
|
||||
mova m5, [pf_s32_inv_scale]
|
||||
.loop:
|
||||
mova m2, [src0q+lenq] ; m2 = 0, 2, 4, 6, 8, 10, 12, 14
|
||||
mova m4, [src1q+lenq] ; m4 = 1, 3, 5, 7, 9, 11, 13, 15
|
||||
SBUTTERFLY2 wd, 2, 4, 3 ; m2 = 0, 1, 2, 3, 4, 5, 6, 7
|
||||
; m4 = 8, 9, 10, 11, 12, 13, 14, 15
|
||||
pxor m3, m3
|
||||
punpcklwd m0, m3, m2 ; m0 = 0, 1, 2, 3
|
||||
punpckhwd m1, m3, m2 ; m1 = 4, 5, 6, 7
|
||||
punpcklwd m2, m3, m4 ; m2 = 8, 9, 10, 11
|
||||
punpckhwd m3, m4 ; m3 = 12, 13, 14, 15
|
||||
cvtdq2ps m0, m0
|
||||
cvtdq2ps m1, m1
|
||||
cvtdq2ps m2, m2
|
||||
cvtdq2ps m3, m3
|
||||
mulps m0, m5
|
||||
mulps m1, m5
|
||||
mulps m2, m5
|
||||
mulps m3, m5
|
||||
mova [dstq+4*lenq ], m0
|
||||
mova [dstq+4*lenq+ mmsize], m1
|
||||
mova [dstq+4*lenq+2*mmsize], m2
|
||||
mova [dstq+4*lenq+3*mmsize], m3
|
||||
add lenq, mmsize
|
||||
jl .loop
|
||||
REP_RET
|
||||
%endmacro
|
||||
|
||||
INIT_XMM sse2
|
||||
CONV_S16P_TO_FLT_2CH
|
||||
%if HAVE_AVX
|
||||
INIT_XMM avx
|
||||
CONV_S16P_TO_FLT_2CH
|
||||
%endif
|
||||
|
||||
;------------------------------------------------------------------------------
|
||||
; void ff_conv_s16p_to_flt_6ch(float *dst, int16_t *const *src, int len,
|
||||
; int channels);
|
||||
;------------------------------------------------------------------------------
|
||||
|
||||
%macro CONV_S16P_TO_FLT_6CH 0
|
||||
%if ARCH_X86_64
|
||||
cglobal conv_s16p_to_flt_6ch, 3,8,8, dst, src, len, src1, src2, src3, src4, src5
|
||||
%else
|
||||
cglobal conv_s16p_to_flt_6ch, 2,7,8, dst, src, src1, src2, src3, src4, src5
|
||||
%define lend dword r2m
|
||||
%endif
|
||||
mov src1q, [srcq+1*gprsize]
|
||||
mov src2q, [srcq+2*gprsize]
|
||||
mov src3q, [srcq+3*gprsize]
|
||||
mov src4q, [srcq+4*gprsize]
|
||||
mov src5q, [srcq+5*gprsize]
|
||||
mov srcq, [srcq]
|
||||
sub src1q, srcq
|
||||
sub src2q, srcq
|
||||
sub src3q, srcq
|
||||
sub src4q, srcq
|
||||
sub src5q, srcq
|
||||
mova m7, [pf_s32_inv_scale]
|
||||
%if cpuflag(ssse3)
|
||||
%define unpack_even m6
|
||||
mova m6, [pb_shuf_unpack_even]
|
||||
%if ARCH_X86_64
|
||||
%define unpack_odd m8
|
||||
mova m8, [pb_shuf_unpack_odd]
|
||||
%else
|
||||
%define unpack_odd [pb_shuf_unpack_odd]
|
||||
%endif
|
||||
%endif
|
||||
.loop:
|
||||
movq m0, [srcq ] ; m0 = 0, 6, 12, 18, x, x, x, x
|
||||
movq m1, [srcq+src1q] ; m1 = 1, 7, 13, 19, x, x, x, x
|
||||
movq m2, [srcq+src2q] ; m2 = 2, 8, 14, 20, x, x, x, x
|
||||
movq m3, [srcq+src3q] ; m3 = 3, 9, 15, 21, x, x, x, x
|
||||
movq m4, [srcq+src4q] ; m4 = 4, 10, 16, 22, x, x, x, x
|
||||
movq m5, [srcq+src5q] ; m5 = 5, 11, 17, 23, x, x, x, x
|
||||
; unpack words:
|
||||
punpcklwd m0, m1 ; m0 = 0, 1, 6, 7, 12, 13, 18, 19
|
||||
punpcklwd m2, m3 ; m2 = 2, 3, 8, 9, 14, 15, 20, 21
|
||||
punpcklwd m4, m5 ; m4 = 4, 5, 10, 11, 16, 17, 22, 23
|
||||
; blend dwords
|
||||
shufps m1, m4, m0, q3120 ; m1 = 4, 5, 16, 17, 6, 7, 18, 19
|
||||
shufps m0, m2, q2020 ; m0 = 0, 1, 12, 13, 2, 3, 14, 15
|
||||
shufps m2, m4, q3131 ; m2 = 8, 9, 20, 21, 10, 11, 22, 23
|
||||
%if cpuflag(ssse3)
|
||||
pshufb m3, m0, unpack_odd ; m3 = 12, 13, 14, 15
|
||||
pshufb m0, unpack_even ; m0 = 0, 1, 2, 3
|
||||
pshufb m4, m1, unpack_odd ; m4 = 16, 17, 18, 19
|
||||
pshufb m1, unpack_even ; m1 = 4, 5, 6, 7
|
||||
pshufb m5, m2, unpack_odd ; m5 = 20, 21, 22, 23
|
||||
pshufb m2, unpack_even ; m2 = 8, 9, 10, 11
|
||||
%else
|
||||
; shuffle dwords
|
||||
pshufd m0, m0, q3120 ; m0 = 0, 1, 2, 3, 12, 13, 14, 15
|
||||
pshufd m1, m1, q3120 ; m1 = 4, 5, 6, 7, 16, 17, 18, 19
|
||||
pshufd m2, m2, q3120 ; m2 = 8, 9, 10, 11, 20, 21, 22, 23
|
||||
pxor m6, m6 ; convert s16 in m0-m2 to s32 in m0-m5
|
||||
punpcklwd m3, m6, m0 ; m3 = 0, 1, 2, 3
|
||||
punpckhwd m4, m6, m0 ; m4 = 12, 13, 14, 15
|
||||
punpcklwd m0, m6, m1 ; m0 = 4, 5, 6, 7
|
||||
punpckhwd m5, m6, m1 ; m5 = 16, 17, 18, 19
|
||||
punpcklwd m1, m6, m2 ; m1 = 8, 9, 10, 11
|
||||
punpckhwd m6, m2 ; m6 = 20, 21, 22, 23
|
||||
SWAP 6,2,1,0,3,4,5 ; swap registers 3,0,1,4,5,6 to 0,1,2,3,4,5
|
||||
%endif
|
||||
cvtdq2ps m0, m0 ; convert s32 to float
|
||||
cvtdq2ps m1, m1
|
||||
cvtdq2ps m2, m2
|
||||
cvtdq2ps m3, m3
|
||||
cvtdq2ps m4, m4
|
||||
cvtdq2ps m5, m5
|
||||
mulps m0, m7 ; scale float from s32 range to [-1.0,1.0]
|
||||
mulps m1, m7
|
||||
mulps m2, m7
|
||||
mulps m3, m7
|
||||
mulps m4, m7
|
||||
mulps m5, m7
|
||||
mova [dstq ], m0
|
||||
mova [dstq+ mmsize], m1
|
||||
mova [dstq+2*mmsize], m2
|
||||
mova [dstq+3*mmsize], m3
|
||||
mova [dstq+4*mmsize], m4
|
||||
mova [dstq+5*mmsize], m5
|
||||
add srcq, mmsize/2
|
||||
add dstq, mmsize*6
|
||||
sub lend, mmsize/4
|
||||
jg .loop
|
||||
REP_RET
|
||||
%endmacro
|
||||
|
||||
INIT_XMM sse2
|
||||
CONV_S16P_TO_FLT_6CH
|
||||
INIT_XMM ssse3
|
||||
CONV_S16P_TO_FLT_6CH
|
||||
%if HAVE_AVX
|
||||
INIT_XMM avx
|
||||
CONV_S16P_TO_FLT_6CH
|
||||
%endif
|
||||
|
||||
;------------------------------------------------------------------------------
|
||||
; void ff_conv_fltp_to_s16_2ch(int16_t *dst, float *const *src, int len,
|
||||
; int channels);
|
||||
;------------------------------------------------------------------------------
|
||||
|
||||
%macro CONV_FLTP_TO_S16_2CH 0
|
||||
cglobal conv_fltp_to_s16_2ch, 3,4,3, dst, src0, len, src1
|
||||
lea lenq, [4*lend]
|
||||
mov src1q, [src0q+gprsize]
|
||||
mov src0q, [src0q ]
|
||||
add dstq, lenq
|
||||
add src0q, lenq
|
||||
add src1q, lenq
|
||||
neg lenq
|
||||
mova m2, [pf_s16_scale]
|
||||
%if cpuflag(ssse3)
|
||||
mova m3, [pb_interleave_words]
|
||||
%endif
|
||||
.loop:
|
||||
mulps m0, m2, [src0q+lenq] ; m0 = 0, 2, 4, 6
|
||||
mulps m1, m2, [src1q+lenq] ; m1 = 1, 3, 5, 7
|
||||
cvtps2dq m0, m0
|
||||
cvtps2dq m1, m1
|
||||
%if cpuflag(ssse3)
|
||||
packssdw m0, m1 ; m0 = 0, 2, 4, 6, 1, 3, 5, 7
|
||||
pshufb m0, m3 ; m0 = 0, 1, 2, 3, 4, 5, 6, 7
|
||||
%else
|
||||
packssdw m0, m0 ; m0 = 0, 2, 4, 6, x, x, x, x
|
||||
packssdw m1, m1 ; m1 = 1, 3, 5, 7, x, x, x, x
|
||||
punpcklwd m0, m1 ; m0 = 0, 1, 2, 3, 4, 5, 6, 7
|
||||
%endif
|
||||
mova [dstq+lenq], m0
|
||||
add lenq, mmsize
|
||||
jl .loop
|
||||
REP_RET
|
||||
%endmacro
|
||||
|
||||
INIT_XMM sse2
|
||||
CONV_FLTP_TO_S16_2CH
|
||||
INIT_XMM ssse3
|
||||
CONV_FLTP_TO_S16_2CH
|
||||
|
||||
;------------------------------------------------------------------------------
|
||||
; void ff_conv_fltp_to_s16_6ch(int16_t *dst, float *const *src, int len,
|
||||
; int channels);
|
||||
;------------------------------------------------------------------------------
|
||||
|
||||
%macro CONV_FLTP_TO_S16_6CH 0
|
||||
%if ARCH_X86_64
|
||||
cglobal conv_fltp_to_s16_6ch, 3,8,7, dst, src, len, src1, src2, src3, src4, src5
|
||||
%else
|
||||
cglobal conv_fltp_to_s16_6ch, 2,7,7, dst, src, src1, src2, src3, src4, src5
|
||||
%define lend dword r2m
|
||||
%endif
|
||||
mov src1q, [srcq+1*gprsize]
|
||||
mov src2q, [srcq+2*gprsize]
|
||||
mov src3q, [srcq+3*gprsize]
|
||||
mov src4q, [srcq+4*gprsize]
|
||||
mov src5q, [srcq+5*gprsize]
|
||||
mov srcq, [srcq]
|
||||
sub src1q, srcq
|
||||
sub src2q, srcq
|
||||
sub src3q, srcq
|
||||
sub src4q, srcq
|
||||
sub src5q, srcq
|
||||
movaps xmm6, [pf_s16_scale]
|
||||
.loop:
|
||||
%if cpuflag(sse2)
|
||||
mulps m0, m6, [srcq ]
|
||||
mulps m1, m6, [srcq+src1q]
|
||||
mulps m2, m6, [srcq+src2q]
|
||||
mulps m3, m6, [srcq+src3q]
|
||||
mulps m4, m6, [srcq+src4q]
|
||||
mulps m5, m6, [srcq+src5q]
|
||||
cvtps2dq m0, m0
|
||||
cvtps2dq m1, m1
|
||||
cvtps2dq m2, m2
|
||||
cvtps2dq m3, m3
|
||||
cvtps2dq m4, m4
|
||||
cvtps2dq m5, m5
|
||||
packssdw m0, m3 ; m0 = 0, 6, 12, 18, 3, 9, 15, 21
|
||||
packssdw m1, m4 ; m1 = 1, 7, 13, 19, 4, 10, 16, 22
|
||||
packssdw m2, m5 ; m2 = 2, 8, 14, 20, 5, 11, 17, 23
|
||||
; unpack words:
|
||||
movhlps m3, m0 ; m3 = 3, 9, 15, 21, x, x, x, x
|
||||
punpcklwd m0, m1 ; m0 = 0, 1, 6, 7, 12, 13, 18, 19
|
||||
punpckhwd m1, m2 ; m1 = 4, 5, 10, 11, 16, 17, 22, 23
|
||||
punpcklwd m2, m3 ; m2 = 2, 3, 8, 9, 14, 15, 20, 21
|
||||
; blend dwords:
|
||||
shufps m3, m0, m2, q2020 ; m3 = 0, 1, 12, 13, 2, 3, 14, 15
|
||||
shufps m0, m1, q2031 ; m0 = 6, 7, 18, 19, 4, 5, 16, 17
|
||||
shufps m2, m1, q3131 ; m2 = 8, 9, 20, 21, 10, 11, 22, 23
|
||||
; shuffle dwords:
|
||||
shufps m1, m2, m3, q3120 ; m1 = 8, 9, 10, 11, 12, 13, 14, 15
|
||||
shufps m3, m0, q0220 ; m3 = 0, 1, 2, 3, 4, 5, 6, 7
|
||||
shufps m0, m2, q3113 ; m0 = 16, 17, 18, 19, 20, 21, 22, 23
|
||||
mova [dstq+0*mmsize], m3
|
||||
mova [dstq+1*mmsize], m1
|
||||
mova [dstq+2*mmsize], m0
|
||||
%else ; sse
|
||||
movlps xmm0, [srcq ]
|
||||
movlps xmm1, [srcq+src1q]
|
||||
movlps xmm2, [srcq+src2q]
|
||||
movlps xmm3, [srcq+src3q]
|
||||
movlps xmm4, [srcq+src4q]
|
||||
movlps xmm5, [srcq+src5q]
|
||||
mulps xmm0, xmm6
|
||||
mulps xmm1, xmm6
|
||||
mulps xmm2, xmm6
|
||||
mulps xmm3, xmm6
|
||||
mulps xmm4, xmm6
|
||||
mulps xmm5, xmm6
|
||||
cvtps2pi mm0, xmm0
|
||||
cvtps2pi mm1, xmm1
|
||||
cvtps2pi mm2, xmm2
|
||||
cvtps2pi mm3, xmm3
|
||||
cvtps2pi mm4, xmm4
|
||||
cvtps2pi mm5, xmm5
|
||||
packssdw mm0, mm3 ; m0 = 0, 6, 3, 9
|
||||
packssdw mm1, mm4 ; m1 = 1, 7, 4, 10
|
||||
packssdw mm2, mm5 ; m2 = 2, 8, 5, 11
|
||||
; unpack words
|
||||
pshufw mm3, mm0, q1032 ; m3 = 3, 9, 0, 6
|
||||
punpcklwd mm0, mm1 ; m0 = 0, 1, 6, 7
|
||||
punpckhwd mm1, mm2 ; m1 = 4, 5, 10, 11
|
||||
punpcklwd mm2, mm3 ; m2 = 2, 3, 8, 9
|
||||
; unpack dwords
|
||||
pshufw mm3, mm0, q1032 ; m3 = 6, 7, 0, 1
|
||||
punpckldq mm0, mm2 ; m0 = 0, 1, 2, 3 (final)
|
||||
punpckhdq mm2, mm1 ; m2 = 8, 9, 10, 11 (final)
|
||||
punpckldq mm1, mm3 ; m1 = 4, 5, 6, 7 (final)
|
||||
mova [dstq+0*mmsize], mm0
|
||||
mova [dstq+1*mmsize], mm1
|
||||
mova [dstq+2*mmsize], mm2
|
||||
%endif
|
||||
add srcq, mmsize
|
||||
add dstq, mmsize*3
|
||||
sub lend, mmsize/4
|
||||
jg .loop
|
||||
%if mmsize == 8
|
||||
emms
|
||||
RET
|
||||
%else
|
||||
REP_RET
|
||||
%endif
|
||||
%endmacro
|
||||
|
||||
INIT_MMX sse
|
||||
CONV_FLTP_TO_S16_6CH
|
||||
INIT_XMM sse2
|
||||
CONV_FLTP_TO_S16_6CH
|
||||
%if HAVE_AVX
|
||||
INIT_XMM avx
|
||||
CONV_FLTP_TO_S16_6CH
|
||||
%endif
|
||||
|
||||
;------------------------------------------------------------------------------
|
||||
; void ff_conv_fltp_to_flt_2ch(float *dst, float *const *src, int len,
|
||||
; int channels);
|
||||
;------------------------------------------------------------------------------
|
||||
|
||||
%macro CONV_FLTP_TO_FLT_2CH 0
|
||||
cglobal conv_fltp_to_flt_2ch, 3,4,5, dst, src0, len, src1
|
||||
mov src1q, [src0q+gprsize]
|
||||
mov src0q, [src0q]
|
||||
lea lenq, [4*lend]
|
||||
add src0q, lenq
|
||||
add src1q, lenq
|
||||
lea dstq, [dstq+2*lenq]
|
||||
neg lenq
|
||||
.loop
|
||||
mova m0, [src0q+lenq ]
|
||||
mova m1, [src1q+lenq ]
|
||||
mova m2, [src0q+lenq+mmsize]
|
||||
mova m3, [src1q+lenq+mmsize]
|
||||
SBUTTERFLYPS 0, 1, 4
|
||||
SBUTTERFLYPS 2, 3, 4
|
||||
mova [dstq+2*lenq+0*mmsize], m0
|
||||
mova [dstq+2*lenq+1*mmsize], m1
|
||||
mova [dstq+2*lenq+2*mmsize], m2
|
||||
mova [dstq+2*lenq+3*mmsize], m3
|
||||
add lenq, 2*mmsize
|
||||
jl .loop
|
||||
REP_RET
|
||||
%endmacro
|
||||
|
||||
INIT_XMM sse
|
||||
CONV_FLTP_TO_FLT_2CH
|
||||
%if HAVE_AVX
|
||||
INIT_XMM avx
|
||||
CONV_FLTP_TO_FLT_2CH
|
||||
%endif
|
||||
|
||||
;-----------------------------------------------------------------------------
|
||||
; void ff_conv_fltp_to_flt_6ch(float *dst, float *const *src, int len,
|
||||
; int channels);
|
||||
@ -303,3 +814,449 @@ CONV_FLTP_TO_FLT_6CH
|
||||
INIT_XMM avx
|
||||
CONV_FLTP_TO_FLT_6CH
|
||||
%endif
|
||||
|
||||
;------------------------------------------------------------------------------
|
||||
; void ff_conv_s16_to_s16p_2ch(int16_t *const *dst, int16_t *src, int len,
|
||||
; int channels);
|
||||
;------------------------------------------------------------------------------
|
||||
|
||||
%macro CONV_S16_TO_S16P_2CH 0
|
||||
cglobal conv_s16_to_s16p_2ch, 3,4,4, dst0, src, len, dst1
|
||||
lea lenq, [2*lend]
|
||||
mov dst1q, [dst0q+gprsize]
|
||||
mov dst0q, [dst0q ]
|
||||
lea srcq, [srcq+2*lenq]
|
||||
add dst0q, lenq
|
||||
add dst1q, lenq
|
||||
neg lenq
|
||||
%if cpuflag(ssse3)
|
||||
mova m3, [pb_deinterleave_words]
|
||||
%endif
|
||||
.loop:
|
||||
mova m0, [srcq+2*lenq ] ; m0 = 0, 1, 2, 3, 4, 5, 6, 7
|
||||
mova m1, [srcq+2*lenq+mmsize] ; m1 = 8, 9, 10, 11, 12, 13, 14, 15
|
||||
%if cpuflag(ssse3)
|
||||
pshufb m0, m3 ; m0 = 0, 2, 4, 6, 1, 3, 5, 7
|
||||
pshufb m1, m3 ; m1 = 8, 10, 12, 14, 9, 11, 13, 15
|
||||
SBUTTERFLY2 qdq, 0, 1, 2 ; m0 = 0, 2, 4, 6, 8, 10, 12, 14
|
||||
; m1 = 1, 3, 5, 7, 9, 11, 13, 15
|
||||
%else ; sse2
|
||||
pshuflw m0, m0, q3120 ; m0 = 0, 2, 1, 3, 4, 5, 6, 7
|
||||
pshufhw m0, m0, q3120 ; m0 = 0, 2, 1, 3, 4, 6, 5, 7
|
||||
pshuflw m1, m1, q3120 ; m1 = 8, 10, 9, 11, 12, 13, 14, 15
|
||||
pshufhw m1, m1, q3120 ; m1 = 8, 10, 9, 11, 12, 14, 13, 15
|
||||
DEINT2_PS 0, 1, 2 ; m0 = 0, 2, 4, 6, 8, 10, 12, 14
|
||||
; m1 = 1, 3, 5, 7, 9, 11, 13, 15
|
||||
%endif
|
||||
mova [dst0q+lenq], m0
|
||||
mova [dst1q+lenq], m1
|
||||
add lenq, mmsize
|
||||
jl .loop
|
||||
REP_RET
|
||||
%endmacro
|
||||
|
||||
INIT_XMM sse2
|
||||
CONV_S16_TO_S16P_2CH
|
||||
INIT_XMM ssse3
|
||||
CONV_S16_TO_S16P_2CH
|
||||
%if HAVE_AVX
|
||||
INIT_XMM avx
|
||||
CONV_S16_TO_S16P_2CH
|
||||
%endif
|
||||
|
||||
;------------------------------------------------------------------------------
|
||||
; void ff_conv_s16_to_s16p_6ch(int16_t *const *dst, int16_t *src, int len,
|
||||
; int channels);
|
||||
;------------------------------------------------------------------------------
|
||||
|
||||
%macro CONV_S16_TO_S16P_6CH 0
|
||||
%if ARCH_X86_64
|
||||
cglobal conv_s16_to_s16p_6ch, 3,8,5, dst, src, len, dst1, dst2, dst3, dst4, dst5
|
||||
%else
|
||||
cglobal conv_s16_to_s16p_6ch, 2,7,5, dst, src, dst1, dst2, dst3, dst4, dst5
|
||||
%define lend dword r2m
|
||||
%endif
|
||||
mov dst1q, [dstq+ gprsize]
|
||||
mov dst2q, [dstq+2*gprsize]
|
||||
mov dst3q, [dstq+3*gprsize]
|
||||
mov dst4q, [dstq+4*gprsize]
|
||||
mov dst5q, [dstq+5*gprsize]
|
||||
mov dstq, [dstq ]
|
||||
sub dst1q, dstq
|
||||
sub dst2q, dstq
|
||||
sub dst3q, dstq
|
||||
sub dst4q, dstq
|
||||
sub dst5q, dstq
|
||||
.loop:
|
||||
mova m0, [srcq+0*mmsize] ; m0 = 0, 1, 2, 3, 4, 5, 6, 7
|
||||
mova m3, [srcq+1*mmsize] ; m3 = 8, 9, 10, 11, 12, 13, 14, 15
|
||||
mova m2, [srcq+2*mmsize] ; m2 = 16, 17, 18, 19, 20, 21, 22, 23
|
||||
PALIGNR m1, m3, m0, 12, m4 ; m1 = 6, 7, 8, 9, 10, 11, x, x
|
||||
shufps m3, m2, q1032 ; m3 = 12, 13, 14, 15, 16, 17, 18, 19
|
||||
psrldq m2, 4 ; m2 = 18, 19, 20, 21, 22, 23, x, x
|
||||
SBUTTERFLY2 wd, 0, 1, 4 ; m0 = 0, 6, 1, 7, 2, 8, 3, 9
|
||||
; m1 = 4, 10, 5, 11, x, x, x, x
|
||||
SBUTTERFLY2 wd, 3, 2, 4 ; m3 = 12, 18, 13, 19, 14, 20, 15, 21
|
||||
; m2 = 16, 22, 17, 23, x, x, x, x
|
||||
SBUTTERFLY2 dq, 0, 3, 4 ; m0 = 0, 6, 12, 18, 1, 7, 13, 19
|
||||
; m3 = 2, 8, 14, 20, 3, 9, 15, 21
|
||||
punpckldq m1, m2 ; m1 = 4, 10, 16, 22, 5, 11, 17, 23
|
||||
movq [dstq ], m0
|
||||
movhps [dstq+dst1q], m0
|
||||
movq [dstq+dst2q], m3
|
||||
movhps [dstq+dst3q], m3
|
||||
movq [dstq+dst4q], m1
|
||||
movhps [dstq+dst5q], m1
|
||||
add srcq, mmsize*3
|
||||
add dstq, mmsize/2
|
||||
sub lend, mmsize/4
|
||||
jg .loop
|
||||
REP_RET
|
||||
%endmacro
|
||||
|
||||
%define PALIGNR PALIGNR_MMX
|
||||
INIT_XMM sse2
|
||||
CONV_S16_TO_S16P_6CH
|
||||
%define PALIGNR PALIGNR_SSSE3
|
||||
INIT_XMM ssse3
|
||||
CONV_S16_TO_S16P_6CH
|
||||
%if HAVE_AVX
|
||||
INIT_XMM avx
|
||||
CONV_S16_TO_S16P_6CH
|
||||
%endif
|
||||
|
||||
;------------------------------------------------------------------------------
|
||||
; void ff_conv_s16_to_fltp_2ch(float *const *dst, int16_t *src, int len,
|
||||
; int channels);
|
||||
;------------------------------------------------------------------------------
|
||||
|
||||
%macro CONV_S16_TO_FLTP_2CH 0
|
||||
cglobal conv_s16_to_fltp_2ch, 3,4,5, dst0, src, len, dst1
|
||||
lea lenq, [4*lend]
|
||||
mov dst1q, [dst0q+gprsize]
|
||||
mov dst0q, [dst0q ]
|
||||
add srcq, lenq
|
||||
add dst0q, lenq
|
||||
add dst1q, lenq
|
||||
neg lenq
|
||||
mova m3, [pf_s32_inv_scale]
|
||||
mova m4, [pw_zero_even]
|
||||
.loop:
|
||||
mova m1, [srcq+lenq]
|
||||
pslld m0, m1, 16
|
||||
pand m1, m4
|
||||
cvtdq2ps m0, m0
|
||||
cvtdq2ps m1, m1
|
||||
mulps m0, m0, m3
|
||||
mulps m1, m1, m3
|
||||
mova [dst0q+lenq], m0
|
||||
mova [dst1q+lenq], m1
|
||||
add lenq, mmsize
|
||||
jl .loop
|
||||
REP_RET
|
||||
%endmacro
|
||||
|
||||
INIT_XMM sse2
|
||||
CONV_S16_TO_FLTP_2CH
|
||||
%if HAVE_AVX
|
||||
INIT_XMM avx
|
||||
CONV_S16_TO_FLTP_2CH
|
||||
%endif
|
||||
|
||||
;------------------------------------------------------------------------------
|
||||
; void ff_conv_s16_to_fltp_6ch(float *const *dst, int16_t *src, int len,
|
||||
; int channels);
|
||||
;------------------------------------------------------------------------------
|
||||
|
||||
%macro CONV_S16_TO_FLTP_6CH 0
|
||||
%if ARCH_X86_64
|
||||
cglobal conv_s16_to_fltp_6ch, 3,8,7, dst, src, len, dst1, dst2, dst3, dst4, dst5
|
||||
%else
|
||||
cglobal conv_s16_to_fltp_6ch, 2,7,7, dst, src, dst1, dst2, dst3, dst4, dst5
|
||||
%define lend dword r2m
|
||||
%endif
|
||||
mov dst1q, [dstq+ gprsize]
|
||||
mov dst2q, [dstq+2*gprsize]
|
||||
mov dst3q, [dstq+3*gprsize]
|
||||
mov dst4q, [dstq+4*gprsize]
|
||||
mov dst5q, [dstq+5*gprsize]
|
||||
mov dstq, [dstq ]
|
||||
sub dst1q, dstq
|
||||
sub dst2q, dstq
|
||||
sub dst3q, dstq
|
||||
sub dst4q, dstq
|
||||
sub dst5q, dstq
|
||||
mova m6, [pf_s16_inv_scale]
|
||||
.loop:
|
||||
mova m0, [srcq+0*mmsize] ; m0 = 0, 1, 2, 3, 4, 5, 6, 7
|
||||
mova m3, [srcq+1*mmsize] ; m3 = 8, 9, 10, 11, 12, 13, 14, 15
|
||||
mova m2, [srcq+2*mmsize] ; m2 = 16, 17, 18, 19, 20, 21, 22, 23
|
||||
PALIGNR m1, m3, m0, 12, m4 ; m1 = 6, 7, 8, 9, 10, 11, x, x
|
||||
shufps m3, m2, q1032 ; m3 = 12, 13, 14, 15, 16, 17, 18, 19
|
||||
psrldq m2, 4 ; m2 = 18, 19, 20, 21, 22, 23, x, x
|
||||
SBUTTERFLY2 wd, 0, 1, 4 ; m0 = 0, 6, 1, 7, 2, 8, 3, 9
|
||||
; m1 = 4, 10, 5, 11, x, x, x, x
|
||||
SBUTTERFLY2 wd, 3, 2, 4 ; m3 = 12, 18, 13, 19, 14, 20, 15, 21
|
||||
; m2 = 16, 22, 17, 23, x, x, x, x
|
||||
SBUTTERFLY2 dq, 0, 3, 4 ; m0 = 0, 6, 12, 18, 1, 7, 13, 19
|
||||
; m3 = 2, 8, 14, 20, 3, 9, 15, 21
|
||||
punpckldq m1, m2 ; m1 = 4, 10, 16, 22, 5, 11, 17, 23
|
||||
S16_TO_S32_SX 0, 2 ; m0 = 0, 6, 12, 18
|
||||
; m2 = 1, 7, 13, 19
|
||||
S16_TO_S32_SX 3, 4 ; m3 = 2, 8, 14, 20
|
||||
; m4 = 3, 9, 15, 21
|
||||
S16_TO_S32_SX 1, 5 ; m1 = 4, 10, 16, 22
|
||||
; m5 = 5, 11, 17, 23
|
||||
SWAP 1,2,3,4
|
||||
cvtdq2ps m0, m0
|
||||
cvtdq2ps m1, m1
|
||||
cvtdq2ps m2, m2
|
||||
cvtdq2ps m3, m3
|
||||
cvtdq2ps m4, m4
|
||||
cvtdq2ps m5, m5
|
||||
mulps m0, m6
|
||||
mulps m1, m6
|
||||
mulps m2, m6
|
||||
mulps m3, m6
|
||||
mulps m4, m6
|
||||
mulps m5, m6
|
||||
mova [dstq ], m0
|
||||
mova [dstq+dst1q], m1
|
||||
mova [dstq+dst2q], m2
|
||||
mova [dstq+dst3q], m3
|
||||
mova [dstq+dst4q], m4
|
||||
mova [dstq+dst5q], m5
|
||||
add srcq, mmsize*3
|
||||
add dstq, mmsize
|
||||
sub lend, mmsize/4
|
||||
jg .loop
|
||||
REP_RET
|
||||
%endmacro
|
||||
|
||||
%define PALIGNR PALIGNR_MMX
|
||||
INIT_XMM sse2
|
||||
CONV_S16_TO_FLTP_6CH
|
||||
%define PALIGNR PALIGNR_SSSE3
|
||||
INIT_XMM ssse3
|
||||
CONV_S16_TO_FLTP_6CH
|
||||
INIT_XMM sse4
|
||||
CONV_S16_TO_FLTP_6CH
|
||||
%if HAVE_AVX
|
||||
INIT_XMM avx
|
||||
CONV_S16_TO_FLTP_6CH
|
||||
%endif
|
||||
|
||||
;------------------------------------------------------------------------------
|
||||
; void ff_conv_flt_to_s16p_2ch(int16_t *const *dst, float *src, int len,
|
||||
; int channels);
|
||||
;------------------------------------------------------------------------------
|
||||
|
||||
%macro CONV_FLT_TO_S16P_2CH 0
|
||||
cglobal conv_flt_to_s16p_2ch, 3,4,6, dst0, src, len, dst1
|
||||
lea lenq, [2*lend]
|
||||
mov dst1q, [dst0q+gprsize]
|
||||
mov dst0q, [dst0q ]
|
||||
lea srcq, [srcq+4*lenq]
|
||||
add dst0q, lenq
|
||||
add dst1q, lenq
|
||||
neg lenq
|
||||
mova m5, [pf_s16_scale]
|
||||
.loop:
|
||||
mova m0, [srcq+4*lenq ]
|
||||
mova m1, [srcq+4*lenq+ mmsize]
|
||||
mova m2, [srcq+4*lenq+2*mmsize]
|
||||
mova m3, [srcq+4*lenq+3*mmsize]
|
||||
DEINT2_PS 0, 1, 4
|
||||
DEINT2_PS 2, 3, 4
|
||||
mulps m0, m0, m5
|
||||
mulps m1, m1, m5
|
||||
mulps m2, m2, m5
|
||||
mulps m3, m3, m5
|
||||
cvtps2dq m0, m0
|
||||
cvtps2dq m1, m1
|
||||
cvtps2dq m2, m2
|
||||
cvtps2dq m3, m3
|
||||
packssdw m0, m2
|
||||
packssdw m1, m3
|
||||
mova [dst0q+lenq], m0
|
||||
mova [dst1q+lenq], m1
|
||||
add lenq, mmsize
|
||||
jl .loop
|
||||
REP_RET
|
||||
%endmacro
|
||||
|
||||
INIT_XMM sse2
|
||||
CONV_FLT_TO_S16P_2CH
|
||||
%if HAVE_AVX
|
||||
INIT_XMM avx
|
||||
CONV_FLT_TO_S16P_2CH
|
||||
%endif
|
||||
|
||||
;------------------------------------------------------------------------------
|
||||
; void ff_conv_flt_to_s16p_6ch(int16_t *const *dst, float *src, int len,
|
||||
; int channels);
|
||||
;------------------------------------------------------------------------------
|
||||
|
||||
%macro CONV_FLT_TO_S16P_6CH 0
|
||||
%if ARCH_X86_64
|
||||
cglobal conv_flt_to_s16p_6ch, 3,8,7, dst, src, len, dst1, dst2, dst3, dst4, dst5
|
||||
%else
|
||||
cglobal conv_flt_to_s16p_6ch, 2,7,7, dst, src, dst1, dst2, dst3, dst4, dst5
|
||||
%define lend dword r2m
|
||||
%endif
|
||||
mov dst1q, [dstq+ gprsize]
|
||||
mov dst2q, [dstq+2*gprsize]
|
||||
mov dst3q, [dstq+3*gprsize]
|
||||
mov dst4q, [dstq+4*gprsize]
|
||||
mov dst5q, [dstq+5*gprsize]
|
||||
mov dstq, [dstq ]
|
||||
sub dst1q, dstq
|
||||
sub dst2q, dstq
|
||||
sub dst3q, dstq
|
||||
sub dst4q, dstq
|
||||
sub dst5q, dstq
|
||||
mova m6, [pf_s16_scale]
|
||||
.loop:
|
||||
mulps m0, m6, [srcq+0*mmsize]
|
||||
mulps m3, m6, [srcq+1*mmsize]
|
||||
mulps m1, m6, [srcq+2*mmsize]
|
||||
mulps m4, m6, [srcq+3*mmsize]
|
||||
mulps m2, m6, [srcq+4*mmsize]
|
||||
mulps m5, m6, [srcq+5*mmsize]
|
||||
cvtps2dq m0, m0
|
||||
cvtps2dq m1, m1
|
||||
cvtps2dq m2, m2
|
||||
cvtps2dq m3, m3
|
||||
cvtps2dq m4, m4
|
||||
cvtps2dq m5, m5
|
||||
packssdw m0, m3 ; m0 = 0, 1, 2, 3, 4, 5, 6, 7
|
||||
packssdw m1, m4 ; m1 = 8, 9, 10, 11, 12, 13, 14, 15
|
||||
packssdw m2, m5 ; m2 = 16, 17, 18, 19, 20, 21, 22, 23
|
||||
PALIGNR m3, m1, m0, 12, m4 ; m3 = 6, 7, 8, 9, 10, 11, x, x
|
||||
shufps m1, m2, q1032 ; m1 = 12, 13, 14, 15, 16, 17, 18, 19
|
||||
psrldq m2, 4 ; m2 = 18, 19, 20, 21, 22, 23, x, x
|
||||
SBUTTERFLY2 wd, 0, 3, 4 ; m0 = 0, 6, 1, 7, 2, 8, 3, 9
|
||||
; m3 = 4, 10, 5, 11, x, x, x, x
|
||||
SBUTTERFLY2 wd, 1, 2, 4 ; m1 = 12, 18, 13, 19, 14, 20, 15, 21
|
||||
; m2 = 16, 22, 17, 23, x, x, x, x
|
||||
SBUTTERFLY2 dq, 0, 1, 4 ; m0 = 0, 6, 12, 18, 1, 7, 13, 19
|
||||
; m1 = 2, 8, 14, 20, 3, 9, 15, 21
|
||||
punpckldq m3, m2 ; m3 = 4, 10, 16, 22, 5, 11, 17, 23
|
||||
movq [dstq ], m0
|
||||
movhps [dstq+dst1q], m0
|
||||
movq [dstq+dst2q], m1
|
||||
movhps [dstq+dst3q], m1
|
||||
movq [dstq+dst4q], m3
|
||||
movhps [dstq+dst5q], m3
|
||||
add srcq, mmsize*6
|
||||
add dstq, mmsize/2
|
||||
sub lend, mmsize/4
|
||||
jg .loop
|
||||
REP_RET
|
||||
%endmacro
|
||||
|
||||
%define PALIGNR PALIGNR_MMX
|
||||
INIT_XMM sse2
|
||||
CONV_FLT_TO_S16P_6CH
|
||||
%define PALIGNR PALIGNR_SSSE3
|
||||
INIT_XMM ssse3
|
||||
CONV_FLT_TO_S16P_6CH
|
||||
%if HAVE_AVX
|
||||
INIT_XMM avx
|
||||
CONV_FLT_TO_S16P_6CH
|
||||
%endif
|
||||
|
||||
;------------------------------------------------------------------------------
|
||||
; void ff_conv_flt_to_fltp_2ch(float *const *dst, float *src, int len,
|
||||
; int channels);
|
||||
;------------------------------------------------------------------------------
|
||||
|
||||
%macro CONV_FLT_TO_FLTP_2CH 0
|
||||
cglobal conv_flt_to_fltp_2ch, 3,4,3, dst0, src, len, dst1
|
||||
lea lenq, [4*lend]
|
||||
mov dst1q, [dst0q+gprsize]
|
||||
mov dst0q, [dst0q ]
|
||||
lea srcq, [srcq+2*lenq]
|
||||
add dst0q, lenq
|
||||
add dst1q, lenq
|
||||
neg lenq
|
||||
.loop:
|
||||
mova m0, [srcq+2*lenq ]
|
||||
mova m1, [srcq+2*lenq+mmsize]
|
||||
DEINT2_PS 0, 1, 2
|
||||
mova [dst0q+lenq], m0
|
||||
mova [dst1q+lenq], m1
|
||||
add lenq, mmsize
|
||||
jl .loop
|
||||
REP_RET
|
||||
%endmacro
|
||||
|
||||
INIT_XMM sse
|
||||
CONV_FLT_TO_FLTP_2CH
|
||||
%if HAVE_AVX
|
||||
INIT_XMM avx
|
||||
CONV_FLT_TO_FLTP_2CH
|
||||
%endif
|
||||
|
||||
;------------------------------------------------------------------------------
|
||||
; void ff_conv_flt_to_fltp_6ch(float *const *dst, float *src, int len,
|
||||
; int channels);
|
||||
;------------------------------------------------------------------------------
|
||||
|
||||
%macro CONV_FLT_TO_FLTP_6CH 0
|
||||
%if ARCH_X86_64
|
||||
cglobal conv_flt_to_fltp_6ch, 3,8,7, dst, src, len, dst1, dst2, dst3, dst4, dst5
|
||||
%else
|
||||
cglobal conv_flt_to_fltp_6ch, 2,7,7, dst, src, dst1, dst2, dst3, dst4, dst5
|
||||
%define lend dword r2m
|
||||
%endif
|
||||
mov dst1q, [dstq+ gprsize]
|
||||
mov dst2q, [dstq+2*gprsize]
|
||||
mov dst3q, [dstq+3*gprsize]
|
||||
mov dst4q, [dstq+4*gprsize]
|
||||
mov dst5q, [dstq+5*gprsize]
|
||||
mov dstq, [dstq ]
|
||||
sub dst1q, dstq
|
||||
sub dst2q, dstq
|
||||
sub dst3q, dstq
|
||||
sub dst4q, dstq
|
||||
sub dst5q, dstq
|
||||
.loop:
|
||||
mova m0, [srcq+0*mmsize] ; m0 = 0, 1, 2, 3
|
||||
mova m1, [srcq+1*mmsize] ; m1 = 4, 5, 6, 7
|
||||
mova m2, [srcq+2*mmsize] ; m2 = 8, 9, 10, 11
|
||||
mova m3, [srcq+3*mmsize] ; m3 = 12, 13, 14, 15
|
||||
mova m4, [srcq+4*mmsize] ; m4 = 16, 17, 18, 19
|
||||
mova m5, [srcq+5*mmsize] ; m5 = 20, 21, 22, 23
|
||||
|
||||
SBUTTERFLY2 dq, 0, 3, 6 ; m0 = 0, 12, 1, 13
|
||||
; m3 = 2, 14, 3, 15
|
||||
SBUTTERFLY2 dq, 1, 4, 6 ; m1 = 4, 16, 5, 17
|
||||
; m4 = 6, 18, 7, 19
|
||||
SBUTTERFLY2 dq, 2, 5, 6 ; m2 = 8, 20, 9, 21
|
||||
; m5 = 10, 22, 11, 23
|
||||
SBUTTERFLY2 dq, 0, 4, 6 ; m0 = 0, 6, 12, 18
|
||||
; m4 = 1, 7, 13, 19
|
||||
SBUTTERFLY2 dq, 3, 2, 6 ; m3 = 2, 8, 14, 20
|
||||
; m2 = 3, 9, 15, 21
|
||||
SBUTTERFLY2 dq, 1, 5, 6 ; m1 = 4, 10, 16, 22
|
||||
; m5 = 5, 11, 17, 23
|
||||
mova [dstq ], m0
|
||||
mova [dstq+dst1q], m4
|
||||
mova [dstq+dst2q], m3
|
||||
mova [dstq+dst3q], m2
|
||||
mova [dstq+dst4q], m1
|
||||
mova [dstq+dst5q], m5
|
||||
add srcq, mmsize*6
|
||||
add dstq, mmsize
|
||||
sub lend, mmsize/4
|
||||
jg .loop
|
||||
REP_RET
|
||||
%endmacro
|
||||
|
||||
INIT_XMM sse2
|
||||
CONV_FLT_TO_FLTP_6CH
|
||||
%if HAVE_AVX
|
||||
INIT_XMM avx
|
||||
CONV_FLT_TO_FLTP_6CH
|
||||
%endif
|
||||
|
@ -22,6 +22,8 @@
|
||||
#include "libavutil/cpu.h"
|
||||
#include "libavresample/audio_convert.h"
|
||||
|
||||
/* flat conversions */
|
||||
|
||||
extern void ff_conv_s16_to_s32_sse2(int16_t *dst, const int32_t *src, int len);
|
||||
|
||||
extern void ff_conv_s16_to_flt_sse2(float *dst, const int16_t *src, int len);
|
||||
@ -38,6 +40,49 @@ extern void ff_conv_flt_to_s16_sse2(int16_t *dst, const float *src, int len);
|
||||
extern void ff_conv_flt_to_s32_sse2(int32_t *dst, const float *src, int len);
|
||||
extern void ff_conv_flt_to_s32_avx (int32_t *dst, const float *src, int len);
|
||||
|
||||
/* interleave conversions */
|
||||
|
||||
extern void ff_conv_s16p_to_s16_2ch_sse2(int16_t *dst, int16_t *const *src,
|
||||
int len, int channels);
|
||||
extern void ff_conv_s16p_to_s16_2ch_avx (int16_t *dst, int16_t *const *src,
|
||||
int len, int channels);
|
||||
|
||||
extern void ff_conv_s16p_to_s16_6ch_sse2(int16_t *dst, int16_t *const *src,
|
||||
int len, int channels);
|
||||
extern void ff_conv_s16p_to_s16_6ch_sse2slow(int16_t *dst, int16_t *const *src,
|
||||
int len, int channels);
|
||||
extern void ff_conv_s16p_to_s16_6ch_avx (int16_t *dst, int16_t *const *src,
|
||||
int len, int channels);
|
||||
|
||||
extern void ff_conv_s16p_to_flt_2ch_sse2(float *dst, int16_t *const *src,
|
||||
int len, int channels);
|
||||
extern void ff_conv_s16p_to_flt_2ch_avx (float *dst, int16_t *const *src,
|
||||
int len, int channels);
|
||||
|
||||
extern void ff_conv_s16p_to_flt_6ch_sse2 (float *dst, int16_t *const *src,
|
||||
int len, int channels);
|
||||
extern void ff_conv_s16p_to_flt_6ch_ssse3(float *dst, int16_t *const *src,
|
||||
int len, int channels);
|
||||
extern void ff_conv_s16p_to_flt_6ch_avx (float *dst, int16_t *const *src,
|
||||
int len, int channels);
|
||||
|
||||
extern void ff_conv_fltp_to_s16_2ch_sse2 (int16_t *dst, float *const *src,
|
||||
int len, int channels);
|
||||
extern void ff_conv_fltp_to_s16_2ch_ssse3(int16_t *dst, float *const *src,
|
||||
int len, int channels);
|
||||
|
||||
extern void ff_conv_fltp_to_s16_6ch_sse (int16_t *dst, float *const *src,
|
||||
int len, int channels);
|
||||
extern void ff_conv_fltp_to_s16_6ch_sse2(int16_t *dst, float *const *src,
|
||||
int len, int channels);
|
||||
extern void ff_conv_fltp_to_s16_6ch_avx (int16_t *dst, float *const *src,
|
||||
int len, int channels);
|
||||
|
||||
extern void ff_conv_fltp_to_flt_2ch_sse(float *dst, float *const *src, int len,
|
||||
int channels);
|
||||
extern void ff_conv_fltp_to_flt_2ch_avx(float *dst, float *const *src, int len,
|
||||
int channels);
|
||||
|
||||
extern void ff_conv_fltp_to_flt_6ch_mmx (float *dst, float *const *src, int len,
|
||||
int channels);
|
||||
extern void ff_conv_fltp_to_flt_6ch_sse4(float *dst, float *const *src, int len,
|
||||
@ -45,6 +90,58 @@ extern void ff_conv_fltp_to_flt_6ch_sse4(float *dst, float *const *src, int len,
|
||||
extern void ff_conv_fltp_to_flt_6ch_avx (float *dst, float *const *src, int len,
|
||||
int channels);
|
||||
|
||||
/* deinterleave conversions */
|
||||
|
||||
extern void ff_conv_s16_to_s16p_2ch_sse2(int16_t *const *dst, int16_t *src,
|
||||
int len, int channels);
|
||||
extern void ff_conv_s16_to_s16p_2ch_ssse3(int16_t *const *dst, int16_t *src,
|
||||
int len, int channels);
|
||||
extern void ff_conv_s16_to_s16p_2ch_avx (int16_t *const *dst, int16_t *src,
|
||||
int len, int channels);
|
||||
|
||||
extern void ff_conv_s16_to_s16p_6ch_sse2 (int16_t *const *dst, int16_t *src,
|
||||
int len, int channels);
|
||||
extern void ff_conv_s16_to_s16p_6ch_ssse3(int16_t *const *dst, int16_t *src,
|
||||
int len, int channels);
|
||||
extern void ff_conv_s16_to_s16p_6ch_avx (int16_t *const *dst, int16_t *src,
|
||||
int len, int channels);
|
||||
|
||||
extern void ff_conv_s16_to_fltp_2ch_sse2(float *const *dst, int16_t *src,
|
||||
int len, int channels);
|
||||
extern void ff_conv_s16_to_fltp_2ch_avx (float *const *dst, int16_t *src,
|
||||
int len, int channels);
|
||||
|
||||
extern void ff_conv_s16_to_fltp_6ch_sse2 (float *const *dst, int16_t *src,
|
||||
int len, int channels);
|
||||
extern void ff_conv_s16_to_fltp_6ch_ssse3(float *const *dst, int16_t *src,
|
||||
int len, int channels);
|
||||
extern void ff_conv_s16_to_fltp_6ch_sse4 (float *const *dst, int16_t *src,
|
||||
int len, int channels);
|
||||
extern void ff_conv_s16_to_fltp_6ch_avx (float *const *dst, int16_t *src,
|
||||
int len, int channels);
|
||||
|
||||
extern void ff_conv_flt_to_s16p_2ch_sse2(int16_t *const *dst, float *src,
|
||||
int len, int channels);
|
||||
extern void ff_conv_flt_to_s16p_2ch_avx (int16_t *const *dst, float *src,
|
||||
int len, int channels);
|
||||
|
||||
extern void ff_conv_flt_to_s16p_6ch_sse2 (int16_t *const *dst, float *src,
|
||||
int len, int channels);
|
||||
extern void ff_conv_flt_to_s16p_6ch_ssse3(int16_t *const *dst, float *src,
|
||||
int len, int channels);
|
||||
extern void ff_conv_flt_to_s16p_6ch_avx (int16_t *const *dst, float *src,
|
||||
int len, int channels);
|
||||
|
||||
extern void ff_conv_flt_to_fltp_2ch_sse(float *const *dst, float *src, int len,
|
||||
int channels);
|
||||
extern void ff_conv_flt_to_fltp_2ch_avx(float *const *dst, float *src, int len,
|
||||
int channels);
|
||||
|
||||
extern void ff_conv_flt_to_fltp_6ch_sse2(float *const *dst, float *src, int len,
|
||||
int channels);
|
||||
extern void ff_conv_flt_to_fltp_6ch_avx (float *const *dst, float *src, int len,
|
||||
int channels);
|
||||
|
||||
av_cold void ff_audio_convert_init_x86(AudioConvert *ac)
|
||||
{
|
||||
#if HAVE_YASM
|
||||
@ -56,10 +153,25 @@ av_cold void ff_audio_convert_init_x86(AudioConvert *ac)
|
||||
ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_FLTP,
|
||||
6, 1, 4, "MMX", ff_conv_fltp_to_flt_6ch_mmx);
|
||||
}
|
||||
if (mm_flags & AV_CPU_FLAG_SSE && HAVE_SSE) {
|
||||
ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_FLTP,
|
||||
6, 1, 2, "SSE", ff_conv_fltp_to_s16_6ch_sse);
|
||||
ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_FLTP,
|
||||
2, 16, 8, "SSE", ff_conv_fltp_to_flt_2ch_sse);
|
||||
ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_FLTP, AV_SAMPLE_FMT_FLT,
|
||||
2, 16, 4, "SSE", ff_conv_flt_to_fltp_2ch_sse);
|
||||
}
|
||||
if (mm_flags & AV_CPU_FLAG_SSE2 && HAVE_SSE) {
|
||||
if (!(mm_flags & AV_CPU_FLAG_SSE2SLOW)) {
|
||||
ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S32,
|
||||
0, 16, 16, "SSE2", ff_conv_s32_to_s16_sse2);
|
||||
ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S16P,
|
||||
6, 16, 8, "SSE2", ff_conv_s16p_to_s16_6ch_sse2);
|
||||
ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_FLTP,
|
||||
6, 16, 4, "SSE2", ff_conv_fltp_to_s16_6ch_sse2);
|
||||
} else {
|
||||
ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S16P,
|
||||
6, 1, 4, "SSE2SLOW", ff_conv_s16p_to_s16_6ch_sse2slow);
|
||||
}
|
||||
ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_S16,
|
||||
0, 16, 8, "SSE2", ff_conv_s16_to_s32_sse2);
|
||||
@ -71,6 +183,42 @@ av_cold void ff_audio_convert_init_x86(AudioConvert *ac)
|
||||
0, 16, 16, "SSE2", ff_conv_flt_to_s16_sse2);
|
||||
ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_FLT,
|
||||
0, 16, 16, "SSE2", ff_conv_flt_to_s32_sse2);
|
||||
ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S16P,
|
||||
2, 16, 16, "SSE2", ff_conv_s16p_to_s16_2ch_sse2);
|
||||
ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_S16P,
|
||||
2, 16, 8, "SSE2", ff_conv_s16p_to_flt_2ch_sse2);
|
||||
ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_S16P,
|
||||
6, 16, 4, "SSE2", ff_conv_s16p_to_flt_6ch_sse2);
|
||||
ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_FLTP,
|
||||
2, 16, 4, "SSE2", ff_conv_fltp_to_s16_2ch_sse2);
|
||||
ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_S16P, AV_SAMPLE_FMT_S16,
|
||||
2, 16, 8, "SSE2", ff_conv_s16_to_s16p_2ch_sse2);
|
||||
ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_S16P, AV_SAMPLE_FMT_S16,
|
||||
6, 16, 4, "SSE2", ff_conv_s16_to_s16p_6ch_sse2);
|
||||
ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_FLTP, AV_SAMPLE_FMT_S16,
|
||||
2, 16, 8, "SSE2", ff_conv_s16_to_fltp_2ch_sse2);
|
||||
ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_FLTP, AV_SAMPLE_FMT_S16,
|
||||
6, 16, 4, "SSE2", ff_conv_s16_to_fltp_6ch_sse2);
|
||||
ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_S16P, AV_SAMPLE_FMT_FLT,
|
||||
2, 16, 8, "SSE2", ff_conv_flt_to_s16p_2ch_sse2);
|
||||
ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_S16P, AV_SAMPLE_FMT_FLT,
|
||||
6, 16, 4, "SSE2", ff_conv_flt_to_s16p_6ch_sse2);
|
||||
ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_FLTP, AV_SAMPLE_FMT_FLT,
|
||||
6, 16, 4, "SSE2", ff_conv_flt_to_fltp_6ch_sse2);
|
||||
}
|
||||
if (mm_flags & AV_CPU_FLAG_SSSE3 && HAVE_SSE) {
|
||||
ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_S16P,
|
||||
6, 16, 4, "SSSE3", ff_conv_s16p_to_flt_6ch_ssse3);
|
||||
ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_FLTP,
|
||||
2, 16, 4, "SSSE3", ff_conv_fltp_to_s16_2ch_ssse3);
|
||||
ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_S16P, AV_SAMPLE_FMT_S16,
|
||||
2, 16, 8, "SSSE3", ff_conv_s16_to_s16p_2ch_ssse3);
|
||||
ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_S16P, AV_SAMPLE_FMT_S16,
|
||||
6, 16, 4, "SSSE3", ff_conv_s16_to_s16p_6ch_ssse3);
|
||||
ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_FLTP, AV_SAMPLE_FMT_S16,
|
||||
6, 16, 4, "SSSE3", ff_conv_s16_to_fltp_6ch_ssse3);
|
||||
ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_S16P, AV_SAMPLE_FMT_FLT,
|
||||
6, 16, 4, "SSSE3", ff_conv_flt_to_s16p_6ch_ssse3);
|
||||
}
|
||||
if (mm_flags & AV_CPU_FLAG_SSE4 && HAVE_SSE) {
|
||||
ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_S16,
|
||||
@ -83,8 +231,34 @@ av_cold void ff_audio_convert_init_x86(AudioConvert *ac)
|
||||
0, 32, 16, "AVX", ff_conv_s32_to_flt_avx);
|
||||
ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_FLT,
|
||||
0, 32, 32, "AVX", ff_conv_flt_to_s32_avx);
|
||||
ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S16P,
|
||||
2, 16, 16, "AVX", ff_conv_s16p_to_s16_2ch_avx);
|
||||
ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S16P,
|
||||
6, 16, 8, "AVX", ff_conv_s16p_to_s16_6ch_avx);
|
||||
ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_S16P,
|
||||
2, 16, 8, "AVX", ff_conv_s16p_to_flt_2ch_avx);
|
||||
ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_S16P,
|
||||
6, 16, 4, "AVX", ff_conv_s16p_to_flt_6ch_avx);
|
||||
ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_FLTP,
|
||||
6, 16, 4, "AVX", ff_conv_fltp_to_s16_6ch_avx);
|
||||
ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_FLTP,
|
||||
6, 16, 4, "AVX", ff_conv_fltp_to_flt_6ch_avx);
|
||||
ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_S16P, AV_SAMPLE_FMT_S16,
|
||||
2, 16, 8, "AVX", ff_conv_s16_to_s16p_2ch_avx);
|
||||
ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_S16P, AV_SAMPLE_FMT_S16,
|
||||
6, 16, 4, "AVX", ff_conv_s16_to_s16p_6ch_avx);
|
||||
ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_FLTP, AV_SAMPLE_FMT_S16,
|
||||
2, 16, 8, "AVX", ff_conv_s16_to_fltp_2ch_avx);
|
||||
ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_FLTP, AV_SAMPLE_FMT_S16,
|
||||
6, 16, 4, "AVX", ff_conv_s16_to_fltp_6ch_avx);
|
||||
ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_S16P, AV_SAMPLE_FMT_FLT,
|
||||
2, 16, 8, "AVX", ff_conv_flt_to_s16p_2ch_avx);
|
||||
ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_S16P, AV_SAMPLE_FMT_FLT,
|
||||
6, 16, 4, "AVX", ff_conv_flt_to_s16p_6ch_avx);
|
||||
ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_FLTP, AV_SAMPLE_FMT_FLT,
|
||||
2, 16, 4, "AVX", ff_conv_flt_to_fltp_2ch_avx);
|
||||
ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_FLTP, AV_SAMPLE_FMT_FLT,
|
||||
6, 16, 4, "AVX", ff_conv_flt_to_fltp_6ch_avx);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
@ -33,3 +33,9 @@
|
||||
psrad m%1, 16
|
||||
%endif
|
||||
%endmacro
|
||||
|
||||
%macro DEINT2_PS 3 ; src0/even dst, src1/odd dst, temp
|
||||
shufps m%3, m%1, m%2, q3131
|
||||
shufps m%1, m%2, q2020
|
||||
SWAP %2,%3
|
||||
%endmacro
|
||||
|
@ -637,3 +637,15 @@
|
||||
%rotate 1
|
||||
%endrep
|
||||
%endmacro
|
||||
|
||||
%macro PMOVSXWD 2; dst, src
|
||||
%if cpuflag(sse4)
|
||||
pmovsxwd %1, %2
|
||||
%else
|
||||
%ifnidn %1, %2
|
||||
mova %1, %2
|
||||
%endif
|
||||
punpcklwd %1, %1
|
||||
psrad %1, 16
|
||||
%endif
|
||||
%endmacro
|
||||
|
Loading…
Reference in New Issue
Block a user