Commit c137fdd7 authored by Michael Niedermayer's avatar Michael Niedermayer

Merge remote-tracking branch 'qatar/master'

* qatar/master:
  swscale: remove misplaced comment.
  ffmpeg: fix streaming to ffserver.
  swscale: split out RGB48 output functions from yuv2packed[12X]_c().
  build: move vpath directives to main Makefile
  swscale: fix JPEG-range YUV scaling artifacts.
  build: move ALLFFLIBS to a more logical place
  ARM: factor some repetitive code into macros
  Fix SVQ3 after adding 4:4:4 H.264 support
  H.264: fix CODEC_FLAG_GRAY
  4:4:4 H.264 decoding support
  ac3enc: fix allocation of floating point samples.

Conflicts:
	ffmpeg.c
	libavcodec/dsputil_template.c
	libavcodec/h264.c
	libavcodec/mpegvideo.c
	libavcodec/snow.c
	libswscale/swscale.c
	libswscale/swscale_internal.h
Merged-by: 's avatarMichael Niedermayer <michaelni@gmx.at>
parents 9e2f448d 4e058302
...@@ -2,6 +2,11 @@ include config.mak ...@@ -2,6 +2,11 @@ include config.mak
SRC_DIR = $(SRC_PATH_BARE) SRC_DIR = $(SRC_PATH_BARE)
vpath %.c $(SRC_DIR)
vpath %.h $(SRC_DIR)
vpath %.S $(SRC_DIR)
vpath %.asm $(SRC_DIR)
vpath %.v $(SRC_DIR)
vpath %.texi $(SRC_PATH_BARE) vpath %.texi $(SRC_PATH_BARE)
PROGS-$(CONFIG_FFMPEG) += ffmpeg PROGS-$(CONFIG_FFMPEG) += ffmpeg
...@@ -24,6 +29,8 @@ ALLPROGS = $(BASENAMES:%=%$(EXESUF)) ...@@ -24,6 +29,8 @@ ALLPROGS = $(BASENAMES:%=%$(EXESUF))
ALLPROGS_G = $(BASENAMES:%=%_g$(EXESUF)) ALLPROGS_G = $(BASENAMES:%=%_g$(EXESUF))
ALLMANPAGES = $(BASENAMES:%=%.1) ALLMANPAGES = $(BASENAMES:%=%.1)
ALLFFLIBS = avcodec avdevice avfilter avformat avutil postproc swscale
FFLIBS-$(CONFIG_AVDEVICE) += avdevice FFLIBS-$(CONFIG_AVDEVICE) += avdevice
FFLIBS-$(CONFIG_AVFILTER) += avfilter FFLIBS-$(CONFIG_AVFILTER) += avfilter
FFLIBS-$(CONFIG_AVFORMAT) += avformat FFLIBS-$(CONFIG_AVFORMAT) += avformat
......
...@@ -6,11 +6,6 @@ ...@@ -6,11 +6,6 @@
all: all-yes all: all-yes
ifndef SUBDIR ifndef SUBDIR
vpath %.c $(SRC_DIR)
vpath %.h $(SRC_DIR)
vpath %.S $(SRC_DIR)
vpath %.asm $(SRC_DIR)
vpath %.v $(SRC_DIR)
ifndef V ifndef V
Q = @ Q = @
...@@ -25,8 +20,6 @@ $(foreach VAR,$(SILENT),$(eval override $(VAR) = @$($(VAR)))) ...@@ -25,8 +20,6 @@ $(foreach VAR,$(SILENT),$(eval override $(VAR) = @$($(VAR))))
$(eval INSTALL = @$(call ECHO,INSTALL,$$(^:$(SRC_DIR)/%=%)); $(INSTALL)) $(eval INSTALL = @$(call ECHO,INSTALL,$$(^:$(SRC_DIR)/%=%)); $(INSTALL))
endif endif
ALLFFLIBS = avcodec avdevice avfilter avformat avutil postproc swscale
IFLAGS := -I. -I$(SRC_PATH) IFLAGS := -I. -I$(SRC_PATH)
CPPFLAGS := $(IFLAGS) $(CPPFLAGS) CPPFLAGS := $(IFLAGS) $(CPPFLAGS)
CFLAGS += $(ECFLAGS) CFLAGS += $(ECFLAGS)
......
...@@ -2215,15 +2215,9 @@ static av_cold int allocate_buffers(AVCodecContext *avctx) ...@@ -2215,15 +2215,9 @@ static av_cold int allocate_buffers(AVCodecContext *avctx)
AC3EncodeContext *s = avctx->priv_data; AC3EncodeContext *s = avctx->priv_data;
int channels = s->channels + 1; /* includes coupling channel */ int channels = s->channels + 1; /* includes coupling channel */
FF_ALLOC_OR_GOTO(avctx, s->windowed_samples, AC3_WINDOW_SIZE * if (s->allocate_sample_buffers(s))
sizeof(*s->windowed_samples), alloc_fail); goto alloc_fail;
FF_ALLOC_OR_GOTO(avctx, s->planar_samples, s->channels * sizeof(*s->planar_samples),
alloc_fail);
for (ch = 0; ch < s->channels; ch++) {
FF_ALLOCZ_OR_GOTO(avctx, s->planar_samples[ch],
(AC3_FRAME_SIZE+AC3_BLOCK_SIZE) * sizeof(**s->planar_samples),
alloc_fail);
}
FF_ALLOC_OR_GOTO(avctx, s->bap_buffer, AC3_MAX_BLOCKS * channels * FF_ALLOC_OR_GOTO(avctx, s->bap_buffer, AC3_MAX_BLOCKS * channels *
AC3_MAX_COEFS * sizeof(*s->bap_buffer), alloc_fail); AC3_MAX_COEFS * sizeof(*s->bap_buffer), alloc_fail);
FF_ALLOC_OR_GOTO(avctx, s->bap1_buffer, AC3_MAX_BLOCKS * channels * FF_ALLOC_OR_GOTO(avctx, s->bap1_buffer, AC3_MAX_BLOCKS * channels *
...@@ -2323,6 +2317,8 @@ av_cold int ff_ac3_encode_init(AVCodecContext *avctx) ...@@ -2323,6 +2317,8 @@ av_cold int ff_ac3_encode_init(AVCodecContext *avctx)
AC3EncodeContext *s = avctx->priv_data; AC3EncodeContext *s = avctx->priv_data;
int ret, frame_size_58; int ret, frame_size_58;
s->avctx = avctx;
s->eac3 = avctx->codec_id == CODEC_ID_EAC3; s->eac3 = avctx->codec_id == CODEC_ID_EAC3;
avctx->frame_size = AC3_FRAME_SIZE; avctx->frame_size = AC3_FRAME_SIZE;
...@@ -2355,6 +2351,7 @@ av_cold int ff_ac3_encode_init(AVCodecContext *avctx) ...@@ -2355,6 +2351,7 @@ av_cold int ff_ac3_encode_init(AVCodecContext *avctx)
s->apply_window = ff_ac3_fixed_apply_window; s->apply_window = ff_ac3_fixed_apply_window;
s->normalize_samples = ff_ac3_fixed_normalize_samples; s->normalize_samples = ff_ac3_fixed_normalize_samples;
s->scale_coefficients = ff_ac3_fixed_scale_coefficients; s->scale_coefficients = ff_ac3_fixed_scale_coefficients;
s->allocate_sample_buffers = ff_ac3_fixed_allocate_sample_buffers;
s->deinterleave_input_samples = ff_ac3_fixed_deinterleave_input_samples; s->deinterleave_input_samples = ff_ac3_fixed_deinterleave_input_samples;
s->apply_mdct = ff_ac3_fixed_apply_mdct; s->apply_mdct = ff_ac3_fixed_apply_mdct;
s->apply_channel_coupling = ff_ac3_fixed_apply_channel_coupling; s->apply_channel_coupling = ff_ac3_fixed_apply_channel_coupling;
...@@ -2364,6 +2361,7 @@ av_cold int ff_ac3_encode_init(AVCodecContext *avctx) ...@@ -2364,6 +2361,7 @@ av_cold int ff_ac3_encode_init(AVCodecContext *avctx)
s->mdct_init = ff_ac3_float_mdct_init; s->mdct_init = ff_ac3_float_mdct_init;
s->apply_window = ff_ac3_float_apply_window; s->apply_window = ff_ac3_float_apply_window;
s->scale_coefficients = ff_ac3_float_scale_coefficients; s->scale_coefficients = ff_ac3_float_scale_coefficients;
s->allocate_sample_buffers = ff_ac3_float_allocate_sample_buffers;
s->deinterleave_input_samples = ff_ac3_float_deinterleave_input_samples; s->deinterleave_input_samples = ff_ac3_float_deinterleave_input_samples;
s->apply_mdct = ff_ac3_float_apply_mdct; s->apply_mdct = ff_ac3_float_apply_mdct;
s->apply_channel_coupling = ff_ac3_float_apply_channel_coupling; s->apply_channel_coupling = ff_ac3_float_apply_channel_coupling;
......
...@@ -135,6 +135,7 @@ typedef struct AC3Block { ...@@ -135,6 +135,7 @@ typedef struct AC3Block {
typedef struct AC3EncodeContext { typedef struct AC3EncodeContext {
AVClass *av_class; ///< AVClass used for AVOption AVClass *av_class; ///< AVClass used for AVOption
AC3EncOptions options; ///< encoding options AC3EncOptions options; ///< encoding options
AVCodecContext *avctx; ///< parent AVCodecContext
PutBitContext pb; ///< bitstream writer context PutBitContext pb; ///< bitstream writer context
DSPContext dsp; DSPContext dsp;
AC3DSPContext ac3dsp; ///< AC-3 optimized functions AC3DSPContext ac3dsp; ///< AC-3 optimized functions
...@@ -230,6 +231,7 @@ typedef struct AC3EncodeContext { ...@@ -230,6 +231,7 @@ typedef struct AC3EncodeContext {
void (*scale_coefficients)(struct AC3EncodeContext *s); void (*scale_coefficients)(struct AC3EncodeContext *s);
/* fixed vs. float templated function pointers */ /* fixed vs. float templated function pointers */
int (*allocate_sample_buffers)(struct AC3EncodeContext *s);
void (*deinterleave_input_samples)(struct AC3EncodeContext *s, void (*deinterleave_input_samples)(struct AC3EncodeContext *s,
const SampleType *samples); const SampleType *samples);
void (*apply_mdct)(struct AC3EncodeContext *s); void (*apply_mdct)(struct AC3EncodeContext *s);
...@@ -276,6 +278,9 @@ void ff_ac3_float_scale_coefficients(AC3EncodeContext *s); ...@@ -276,6 +278,9 @@ void ff_ac3_float_scale_coefficients(AC3EncodeContext *s);
/* prototypes for functions in ac3enc_template.c */ /* prototypes for functions in ac3enc_template.c */
int ff_ac3_fixed_allocate_sample_buffers(AC3EncodeContext *s);
int ff_ac3_float_allocate_sample_buffers(AC3EncodeContext *s);
void ff_ac3_fixed_deinterleave_input_samples(AC3EncodeContext *s, void ff_ac3_fixed_deinterleave_input_samples(AC3EncodeContext *s,
const SampleType *samples); const SampleType *samples);
void ff_ac3_float_deinterleave_input_samples(AC3EncodeContext *s, void ff_ac3_float_deinterleave_input_samples(AC3EncodeContext *s,
......
...@@ -31,6 +31,26 @@ ...@@ -31,6 +31,26 @@
#include "ac3enc.h" #include "ac3enc.h"
int AC3_NAME(allocate_sample_buffers)(AC3EncodeContext *s)
{
int ch;
FF_ALLOC_OR_GOTO(s->avctx, s->windowed_samples, AC3_WINDOW_SIZE *
sizeof(*s->windowed_samples), alloc_fail);
FF_ALLOC_OR_GOTO(s->avctx, s->planar_samples, s->channels * sizeof(*s->planar_samples),
alloc_fail);
for (ch = 0; ch < s->channels; ch++) {
FF_ALLOCZ_OR_GOTO(s->avctx, s->planar_samples[ch],
(AC3_FRAME_SIZE+AC3_BLOCK_SIZE) * sizeof(**s->planar_samples),
alloc_fail);
}
return 0;
alloc_fail:
return AVERROR(ENOMEM);
}
/** /**
* Deinterleave input samples. * Deinterleave input samples.
* Channels are reordered from Libav's default order to AC-3 order. * Channels are reordered from Libav's default order to AC-3 order.
......
...@@ -122,7 +122,8 @@ static void ff_h264dsp_init_neon(H264DSPContext *c, const int bit_depth) ...@@ -122,7 +122,8 @@ static void ff_h264dsp_init_neon(H264DSPContext *c, const int bit_depth)
c->h264_idct_dc_add = ff_h264_idct_dc_add_neon; c->h264_idct_dc_add = ff_h264_idct_dc_add_neon;
c->h264_idct_add16 = ff_h264_idct_add16_neon; c->h264_idct_add16 = ff_h264_idct_add16_neon;
c->h264_idct_add16intra = ff_h264_idct_add16intra_neon; c->h264_idct_add16intra = ff_h264_idct_add16intra_neon;
c->h264_idct_add8 = ff_h264_idct_add8_neon; //FIXME: reenable when asm is updated.
//c->h264_idct_add8 = ff_h264_idct_add8_neon;
c->h264_idct8_add = ff_h264_idct8_add_neon; c->h264_idct8_add = ff_h264_idct8_add_neon;
c->h264_idct8_dc_add = ff_h264_idct8_dc_add_neon; c->h264_idct8_dc_add = ff_h264_idct8_dc_add_neon;
c->h264_idct8_add4 = ff_h264_idct8_add4_neon; c->h264_idct8_add4 = ff_h264_idct8_add4_neon;
......
...@@ -35,6 +35,21 @@ ...@@ -35,6 +35,21 @@
* *
* Inner loop should take 6 cycles per element on arm926ej-s (Nokia 770) * Inner loop should take 6 cycles per element on arm926ej-s (Nokia 770)
*/ */
.macro dequant_t dst, src, mul, add, tmp
rsbs \tmp, ip, \src, asr #16
addgt \tmp, \add, #0
rsblt \tmp, \add, #0
smlatbne \dst, \src, \mul, \tmp
.endm
.macro dequant_b dst, src, mul, add, tmp
rsbs \tmp, ip, \src, lsl #16
addgt \tmp, \add, #0
rsblt \tmp, \add, #0
smlabbne \dst, \src, \mul, \tmp
.endm
function ff_dct_unquantize_h263_armv5te, export=1 function ff_dct_unquantize_h263_armv5te, export=1
push {r4-r9,lr} push {r4-r9,lr}
mov ip, #0 mov ip, #0
...@@ -44,50 +59,20 @@ function ff_dct_unquantize_h263_armv5te, export=1 ...@@ -44,50 +59,20 @@ function ff_dct_unquantize_h263_armv5te, export=1
1: 1:
ldrd r6, [r0, #8] ldrd r6, [r0, #8]
rsbs r9, ip, r4, asr #16 dequant_t r9, r4, r1, r2, r9
addgt r9, r2, #0 dequant_t lr, r5, r1, r2, lr
rsblt r9, r2, #0 dequant_b r4, r4, r1, r2, r8
smlatbne r9, r4, r1, r9 dequant_b r5, r5, r1, r2, r8
rsbs lr, ip, r5, asr #16
addgt lr, r2, #0
rsblt lr, r2, #0
smlatbne lr, r5, r1, lr
rsbs r8, ip, r4, asl #16
addgt r8, r2, #0
rsblt r8, r2, #0
smlabbne r4, r4, r1, r8
rsbs r8, ip, r5, asl #16
addgt r8, r2, #0
rsblt r8, r2, #0
smlabbne r5, r5, r1, r8
strh r4, [r0], #2 strh r4, [r0], #2
strh r9, [r0], #2 strh r9, [r0], #2
strh r5, [r0], #2 strh r5, [r0], #2
strh lr, [r0], #2 strh lr, [r0], #2
rsbs r9, ip, r6, asr #16 dequant_t r9, r6, r1, r2, r9
addgt r9, r2, #0 dequant_t lr, r7, r1, r2, lr
rsblt r9, r2, #0 dequant_b r6, r6, r1, r2, r8
smlatbne r9, r6, r1, r9 dequant_b r7, r7, r1, r2, r8
rsbs lr, ip, r7, asr #16
addgt lr, r2, #0
rsblt lr, r2, #0
smlatbne lr, r7, r1, lr
rsbs r8, ip, r6, asl #16
addgt r8, r2, #0
rsblt r8, r2, #0
smlabbne r6, r6, r1, r8
rsbs r8, ip, r7, asl #16
addgt r8, r2, #0
rsblt r8, r2, #0
smlabbne r7, r7, r1, r8
strh r6, [r0], #2 strh r6, [r0], #2
strh r9, [r0], #2 strh r9, [r0], #2
......
...@@ -333,6 +333,20 @@ function idct_col_armv5te ...@@ -333,6 +333,20 @@ function idct_col_armv5te
ldr pc, [sp], #4 ldr pc, [sp], #4
endfunc endfunc
.macro clip dst, src:vararg
movs \dst, \src
movmi \dst, #0
cmp \dst, #255
movgt \dst, #255
.endm
.macro aclip dst, src:vararg
adds \dst, \src
movmi \dst, #0
cmp \dst, #255
movgt \dst, #255
.endm
function idct_col_put_armv5te function idct_col_put_armv5te
str lr, [sp, #-4]! str lr, [sp, #-4]!
...@@ -341,27 +355,15 @@ function idct_col_put_armv5te ...@@ -341,27 +355,15 @@ function idct_col_put_armv5te
ldmfd sp!, {a3, a4} ldmfd sp!, {a3, a4}
ldr lr, [sp, #32] ldr lr, [sp, #32]
add a2, a3, v1 add a2, a3, v1
movs a2, a2, asr #20 clip a2, a2, asr #20
movmi a2, #0
cmp a2, #255
movgt a2, #255
add ip, a4, v2 add ip, a4, v2
movs ip, ip, asr #20 clip ip, ip, asr #20
movmi ip, #0
cmp ip, #255
movgt ip, #255
orr a2, a2, ip, lsl #8 orr a2, a2, ip, lsl #8
sub a3, a3, v1 sub a3, a3, v1
movs a3, a3, asr #20 clip a3, a3, asr #20
movmi a3, #0
cmp a3, #255
movgt a3, #255
sub a4, a4, v2 sub a4, a4, v2
movs a4, a4, asr #20 clip a4, a4, asr #20
movmi a4, #0
cmp a4, #255
ldr v1, [sp, #28] ldr v1, [sp, #28]
movgt a4, #255
strh a2, [v1] strh a2, [v1]
add a2, v1, #2 add a2, v1, #2
str a2, [sp, #28] str a2, [sp, #28]
...@@ -371,79 +373,43 @@ function idct_col_put_armv5te ...@@ -371,79 +373,43 @@ function idct_col_put_armv5te
strh a2, [v2, v1]! strh a2, [v2, v1]!
sub a2, a3, v3 sub a2, a3, v3
movs a2, a2, asr #20 clip a2, a2, asr #20
movmi a2, #0
cmp a2, #255
movgt a2, #255
sub ip, a4, v4 sub ip, a4, v4
movs ip, ip, asr #20 clip ip, ip, asr #20
movmi ip, #0
cmp ip, #255
movgt ip, #255
orr a2, a2, ip, lsl #8 orr a2, a2, ip, lsl #8
strh a2, [v1, lr]! strh a2, [v1, lr]!
add a3, a3, v3 add a3, a3, v3
movs a2, a3, asr #20 clip a2, a3, asr #20
movmi a2, #0
cmp a2, #255
movgt a2, #255
add a4, a4, v4 add a4, a4, v4
movs a4, a4, asr #20 clip a4, a4, asr #20
movmi a4, #0
cmp a4, #255
movgt a4, #255
orr a2, a2, a4, lsl #8 orr a2, a2, a4, lsl #8
ldmfd sp!, {a3, a4} ldmfd sp!, {a3, a4}
strh a2, [v2, -lr]! strh a2, [v2, -lr]!
add a2, a3, v5 add a2, a3, v5
movs a2, a2, asr #20 clip a2, a2, asr #20
movmi a2, #0
cmp a2, #255
movgt a2, #255
add ip, a4, v6 add ip, a4, v6
movs ip, ip, asr #20 clip ip, ip, asr #20
movmi ip, #0
cmp ip, #255
movgt ip, #255
orr a2, a2, ip, lsl #8 orr a2, a2, ip, lsl #8
strh a2, [v1, lr]! strh a2, [v1, lr]!
sub a3, a3, v5 sub a3, a3, v5
movs a2, a3, asr #20 clip a2, a3, asr #20
movmi a2, #0
cmp a2, #255
movgt a2, #255
sub a4, a4, v6 sub a4, a4, v6
movs a4, a4, asr #20 clip a4, a4, asr #20
movmi a4, #0
cmp a4, #255
movgt a4, #255
orr a2, a2, a4, lsl #8 orr a2, a2, a4, lsl #8
ldmfd sp!, {a3, a4} ldmfd sp!, {a3, a4}
strh a2, [v2, -lr]! strh a2, [v2, -lr]!
add a2, a3, v7 add a2, a3, v7
movs a2, a2, asr #20 clip a2, a2, asr #20
movmi a2, #0
cmp a2, #255
movgt a2, #255
add ip, a4, fp add ip, a4, fp
movs ip, ip, asr #20 clip ip, ip, asr #20
movmi ip, #0
cmp ip, #255
movgt ip, #255
orr a2, a2, ip, lsl #8 orr a2, a2, ip, lsl #8
strh a2, [v1, lr] strh a2, [v1, lr]
sub a3, a3, v7 sub a3, a3, v7
movs a2, a3, asr #20 clip a2, a3, asr #20
movmi a2, #0
cmp a2, #255
movgt a2, #255
sub a4, a4, fp sub a4, a4, fp
movs a4, a4, asr #20 clip a4, a4, asr #20
movmi a4, #0
cmp a4, #255
movgt a4, #255
orr a2, a2, a4, lsl #8 orr a2, a2, a4, lsl #8
strh a2, [v2, -lr] strh a2, [v2, -lr]
...@@ -460,36 +426,22 @@ function idct_col_add_armv5te ...@@ -460,36 +426,22 @@ function idct_col_add_armv5te
ldmfd sp!, {a3, a4} ldmfd sp!, {a3, a4}
ldrh ip, [lr] ldrh ip, [lr]
add a2, a3, v1 add a2, a3, v1
mov a2, a2, asr #20
sub a3, a3, v1 sub a3, a3, v1
and v1, ip, #255 and v1, ip, #255
adds a2, a2, v1 aclip a2, v1, a2, asr #20
movmi a2, #0
cmp a2, #255
movgt a2, #255
add v1, a4, v2 add v1, a4, v2
mov v1, v1, asr #20 mov v1, v1, asr #20
adds v1, v1, ip, lsr #8 aclip v1, v1, ip, lsr #8
movmi v1, #0
cmp v1, #255
movgt v1, #255
orr a2, a2, v1, lsl #8 orr a2, a2, v1, lsl #8
ldr v1, [sp, #32] ldr v1, [sp, #32]
sub a4, a4, v2 sub a4, a4, v2
rsb v2, v1, v1, lsl #3 rsb v2, v1, v1, lsl #3
ldrh ip, [v2, lr]! ldrh ip, [v2, lr]!
strh a2, [lr] strh a2, [lr]
mov a3, a3, asr #20
and a2, ip, #255 and a2, ip, #255
adds a3, a3, a2 aclip a3, a2, a3, asr #20
movmi a3, #0
cmp a3, #255
movgt a3, #255
mov a4, a4, asr #20 mov a4, a4, asr #20
adds a4, a4, ip, lsr #8 aclip a4, a4, ip, lsr #8
movmi a4, #0
cmp a4, #255
movgt a4, #255
add a2, lr, #2 add a2, lr, #2
str a2, [sp, #28] str a2, [sp, #28]
orr a2, a3, a4, lsl #8 orr a2, a3, a4, lsl #8
...@@ -498,102 +450,60 @@ function idct_col_add_armv5te ...@@ -498,102 +450,60 @@ function idct_col_add_armv5te
ldmfd sp!, {a3, a4} ldmfd sp!, {a3, a4}
ldrh ip, [lr, v1]! ldrh ip, [lr, v1]!
sub a2, a3, v3 sub a2, a3, v3
mov a2, a2, asr #20
add a3, a3, v3 add a3, a3, v3
and v3, ip, #255 and v3, ip, #255
adds a2, a2, v3 aclip a2, v3, a2, asr #20
movmi a2, #0
cmp a2, #255
movgt a2, #255
sub v3, a4, v4 sub v3, a4, v4
mov v3, v3, asr #20 mov v3, v3, asr #20
adds v3, v3, ip, lsr #8 aclip v3, v3, ip, lsr #8
movmi v3, #0
cmp v3, #255
movgt v3, #255
orr a2, a2, v3, lsl #8 orr a2, a2, v3, lsl #8
add a4, a4, v4 add a4, a4, v4
ldrh ip, [v2, -v1]! ldrh ip, [v2, -v1]!
strh a2, [lr] strh a2, [lr]
mov a3, a3, asr #20
and a2, ip, #255 and a2, ip, #255
adds a3, a3, a2 aclip a3, a2, a3, asr #20
movmi a3, #0
cmp a3, #255
movgt a3, #255
mov a4, a4, asr #20 mov a4, a4, asr #20
adds a4, a4, ip, lsr #8 aclip a4, a4, ip, lsr #8
movmi a4, #0
cmp a4, #255
movgt a4, #255
orr a2, a3, a4, lsl #8 orr a2, a3, a4, lsl #8
strh a2, [v2] strh a2, [v2]
ldmfd sp!, {a3, a4} ldmfd sp!, {a3, a4}
ldrh ip, [lr, v1]! ldrh ip, [lr, v1]!
add a2, a3, v5 add a2, a3, v5
mov a2, a2, asr #20
sub a3, a3, v5 sub a3, a3, v5
and v3, ip, #255 and v3, ip, #255
adds a2, a2, v3 aclip a2, v3, a2, asr #20
movmi a2, #0
cmp a2, #255
movgt a2, #255
add v3, a4, v6 add v3, a4, v6
mov v3, v3, asr #20 mov v3, v3, asr #20
adds v3, v3, ip, lsr #8 aclip v3, v3, ip, lsr #8
movmi v3, #0
cmp v3, #255
movgt v3, #255
orr a2, a2, v3, lsl #8 orr a2, a2, v3, lsl #8
sub a4, a4, v6 sub a4, a4, v6
ldrh ip, [v2, -v1]! ldrh ip, [v2, -v1]!
strh a2, [lr] strh a2, [lr]
mov a3, a3, asr #20
and a2, ip, #255 and a2, ip, #255
adds a3, a3, a2 aclip a3, a2, a3, asr #20
movmi a3, #0
cmp a3, #255
movgt a3, #255
mov a4, a4, asr #20 mov a4, a4, asr #20
adds a4, a4, ip, lsr #8 aclip a4, a4, ip, lsr #8
movmi a4, #0
cmp a4, #255
movgt a4, #255
orr a2, a3, a4, lsl #8 orr a2, a3, a4, lsl #8
strh a2, [v2] strh a2, [v2]
ldmfd sp!, {a3, a4} ldmfd sp!, {a3, a4}
ldrh ip, [lr, v1]! ldrh ip, [lr, v1]!
add a2, a3, v7 add a2, a3, v7
mov a2, a2, asr #20
sub a3, a3, v7 sub a3, a3, v7
and v3, ip, #255 and v3, ip, #255
adds a2, a2, v3 aclip a2, v3, a2, asr #20
movmi a2, #0
cmp a2, #255
movgt a2, #255
add v3, a4, fp add v3, a4, fp
mov v3, v3, asr #20 mov v3, v3, asr #20
adds v3, v3, ip, lsr #8 aclip v3, v3, ip, lsr #8
movmi v3, #0
cmp v3, #255
movgt v3, #255
orr a2, a2, v3, lsl #8 orr a2, a2, v3, lsl #8
sub a4, a4, fp sub a4, a4, fp
ldrh ip, [v2, -v1]! ldrh ip, [v2, -v1]!
strh a2, [lr] strh a2, [lr]
mov a3, a3, asr #20
and a2, ip, #255 and a2, ip, #255
adds a3, a3, a2 aclip a3, a2, a3, asr #20
movmi a3, #0
cmp a3, #255
movgt a3, #255
mov a4, a4, asr #20 mov a4, a4, asr #20
adds a4, a4, ip, lsr #8 aclip a4, a4, ip, lsr #8
movmi a4, #0
cmp a4, #255
movgt a4, #255
orr a2, a3, a4, lsl #8 orr a2, a3, a4, lsl #8
strh a2, [v2] strh a2, [v2]
......
...@@ -505,7 +505,7 @@ typedef struct DSPContext { ...@@ -505,7 +505,7 @@ typedef struct DSPContext {
#define BASIS_SHIFT 16 #define BASIS_SHIFT 16
#define RECON_SHIFT 6 #define RECON_SHIFT 6
void (*draw_edges)(uint8_t *buf, int wrap, int width, int height, int w, int sides); void (*draw_edges)(uint8_t *buf, int wrap, int width, int height, int w, int h, int sides);
#define EDGE_WIDTH 16 #define EDGE_WIDTH 16
#define EDGE_TOP 1 #define EDGE_TOP 1
#define EDGE_BOTTOM 2 #define EDGE_BOTTOM 2
......
...@@ -79,7 +79,7 @@ static inline void FUNC(copy_block16)(uint8_t *dst, const uint8_t *src, int dstS ...@@ -79,7 +79,7 @@ static inline void FUNC(copy_block16)(uint8_t *dst, const uint8_t *src, int dstS
/* draw the edges of width 'w' of an image of size width, height */ /* draw the edges of width 'w' of an image of size width, height */
//FIXME check that this is ok for mpeg4 interlaced //FIXME check that this is ok for mpeg4 interlaced
static void FUNCC(draw_edges)(uint8_t *p_buf, int p_wrap, int width, int height, int w, int sides) static void FUNCC(draw_edges)(uint8_t *p_buf, int p_wrap, int width, int height, int w, int h, int sides)
{ {
pixel *buf = (pixel*)p_buf; pixel *buf = (pixel*)p_buf;
int wrap = p_wrap / sizeof(pixel); int wrap = p_wrap / sizeof(pixel);
...@@ -106,10 +106,10 @@ static void FUNCC(draw_edges)(uint8_t *p_buf, int p_wrap, int width, int height, ...@@ -106,10 +106,10 @@ static void FUNCC(draw_edges)(uint8_t *p_buf, int p_wrap, int width, int height,
buf -= w; buf -= w;
last_line = buf + (height - 1) * wrap; last_line = buf + (height - 1) * wrap;
if (sides & EDGE_TOP) if (sides & EDGE_TOP)
for(i = 0; i < w; i++) for(i = 0; i < h; i++)
memcpy(buf - (i + 1) * wrap, buf, (width + w + w) * sizeof(pixel)); // top memcpy(buf - (i + 1) * wrap, buf, (width + w + w) * sizeof(pixel)); // top
if (sides & EDGE_BOTTOM) if (sides & EDGE_BOTTOM)
for (i = 0; i < w; i++) for (i = 0; i < h; i++)
memcpy(last_line + (i + 1) * wrap, last_line, (width + w + w) * sizeof(pixel)); // bottom memcpy(last_line + (i + 1) * wrap, last_line, (width + w + w) * sizeof(pixel)); // bottom
} }
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -269,7 +269,7 @@ static void decode_scaling_matrices(H264Context *h, SPS *sps, PPS *pps, int is_s ...@@ -269,7 +269,7 @@ static void decode_scaling_matrices(H264Context *h, SPS *sps, PPS *pps, int is_s
fallback_sps ? sps->scaling_matrix4[0] : default_scaling4[0], fallback_sps ? sps->scaling_matrix4[0] : default_scaling4[0],
fallback_sps ? sps->scaling_matrix4[3] : default_scaling4[1], fallback_sps ? sps->scaling_matrix4[3] : default_scaling4[1],
fallback_sps ? sps->scaling_matrix8[0] : default_scaling8[0], fallback_sps ? sps->scaling_matrix8[0] : default_scaling8[0],
fallback_sps ? sps->scaling_matrix8[1] : default_scaling8[1] fallback_sps ? sps->scaling_matrix8[3] : default_scaling8[1]
}; };
if(get_bits1(&s->gb)){ if(get_bits1(&s->gb)){
sps->scaling_matrix_present |= is_sps; sps->scaling_matrix_present |= is_sps;
...@@ -281,7 +281,15 @@ static void decode_scaling_matrices(H264Context *h, SPS *sps, PPS *pps, int is_s ...@@ -281,7 +281,15 @@ static void decode_scaling_matrices(H264Context *h, SPS *sps, PPS *pps, int is_s
decode_scaling_list(h,scaling_matrix4[5],16,default_scaling4[1],scaling_matrix4[4]); // Inter, Cb decode_scaling_list(h,scaling_matrix4[5],16,default_scaling4[1],scaling_matrix4[4]); // Inter, Cb
if(is_sps || pps->transform_8x8_mode){ if(is_sps || pps->transform_8x8_mode){
decode_scaling_list(h,scaling_matrix8[0],64,default_scaling8[0],fallback[2]); // Intra, Y decode_scaling_list(h,scaling_matrix8[0],64,default_scaling8[0],fallback[2]); // Intra, Y
decode_scaling_list(h,scaling_matrix8[1],64,default_scaling8[1],fallback[3]); // Inter, Y if(h->sps.chroma_format_idc == 3){
decode_scaling_list(h,scaling_matrix8[1],64,default_scaling8[0],scaling_matrix8[0]); // Intra, Cr
decode_scaling_list(h,scaling_matrix8[2],64,default_scaling8[0],scaling_matrix8[1]); // Intra, Cb
}
decode_scaling_list(h,scaling_matrix8[3],64,default_scaling8[1],fallback[3]); // Inter, Y
if(h->sps.chroma_format_idc == 3){
decode_scaling_list(h,scaling_matrix8[4],64,default_scaling8[1],scaling_matrix8[3]); // Inter, Cr
decode_scaling_list(h,scaling_matrix8[5],64,default_scaling8[1],scaling_matrix8[4]); // Inter, Cb
}
} }
} }
} }
...@@ -395,7 +403,7 @@ int ff_h264_decode_seq_parameter_set(H264Context *h){ ...@@ -395,7 +403,7 @@ int ff_h264_decode_seq_parameter_set(H264Context *h){
if(sps->crop_left || sps->crop_top){ if(sps->crop_left || sps->crop_top){
av_log(h->s.avctx, AV_LOG_ERROR, "insane cropping not completely supported, this could look slightly wrong ...\n"); av_log(h->s.avctx, AV_LOG_ERROR, "insane cropping not completely supported, this could look slightly wrong ...\n");
} }
if(sps->crop_right >= 8 || sps->crop_bottom >= 8){ if(sps->crop_right >= (8<<CHROMA444) || sps->crop_bottom >= (8<<CHROMA444)){
av_log(h->s.avctx, AV_LOG_ERROR, "brainfart cropping not supported, this could look slightly wrong ...\n"); av_log(h->s.avctx, AV_LOG_ERROR, "brainfart cropping not supported, this could look slightly wrong ...\n");
} }
}else{ }else{
......
...@@ -66,10 +66,10 @@ typedef struct H264DSPContext{ ...@@ -66,10 +66,10 @@ typedef struct H264DSPContext{
void (*h264_idct_dc_add)(uint8_t *dst/*align 4*/, DCTELEM *block/*align 16*/, int stride); void (*h264_idct_dc_add)(uint8_t *dst/*align 4*/, DCTELEM *block/*align 16*/, int stride);
void (*h264_idct8_dc_add)(uint8_t *dst/*align 8*/, DCTELEM *block/*align 16*/, int stride); void (*h264_idct8_dc_add)(uint8_t *dst/*align 8*/, DCTELEM *block/*align 16*/, int stride);
void (*h264_idct_add16)(uint8_t *dst/*align 16*/, const int *blockoffset, DCTELEM *block/*align 16*/, int stride, const uint8_t nnzc[6*8]); void (*h264_idct_add16)(uint8_t *dst/*align 16*/, const int *blockoffset, DCTELEM *block/*align 16*/, int stride, const uint8_t nnzc[15*8]);
void (*h264_idct8_add4)(uint8_t *dst/*align 16*/, const int *blockoffset, DCTELEM *block/*align 16*/, int stride, const uint8_t nnzc[6*8]); void (*h264_idct8_add4)(uint8_t *dst/*align 16*/, const int *blockoffset, DCTELEM *block/*align 16*/, int stride, const uint8_t nnzc[15*8]);
void (*h264_idct_add8)(uint8_t **dst/*align 16*/, const int *blockoffset, DCTELEM *block/*align 16*/, int stride, const uint8_t nnzc[6*8]); void (*h264_idct_add8)(uint8_t **dst/*align 16*/, const int *blockoffset, DCTELEM *block/*align 16*/, int stride, const uint8_t nnzc[15*8]);
void (*h264_idct_add16intra)(uint8_t *dst/*align 16*/, const int *blockoffset, DCTELEM *block/*align 16*/, int stride, const uint8_t nnzc[6*8]); void (*h264_idct_add16intra)(uint8_t *dst/*align 16*/, const int *blockoffset, DCTELEM *block/*align 16*/, int stride, const uint8_t nnzc[15*8]);
void (*h264_luma_dc_dequant_idct)(DCTELEM *output, DCTELEM *input/*align 16*/, int qmul); void (*h264_luma_dc_dequant_idct)(DCTELEM *output, DCTELEM *input/*align 16*/, int qmul);
void (*h264_chroma_dc_dequant_idct)(DCTELEM *block, int qmul); void (*h264_chroma_dc_dequant_idct)(DCTELEM *block, int qmul);
}H264DSPContext; }H264DSPContext;
......
...@@ -30,15 +30,19 @@ ...@@ -30,15 +30,19 @@
#ifndef AVCODEC_H264IDCT_INTERNAL_H #ifndef AVCODEC_H264IDCT_INTERNAL_H
#define AVCODEC_H264IDCT_INTERNAL_H #define AVCODEC_H264IDCT_INTERNAL_H
//FIXME this table is a duplicate from h264data.h, and will be removed once the tables from, h264 have been split //FIXME this table is a duplicate from h264data.h, and will be removed once the tables from, h264 have been split
static const uint8_t scan8[16 + 2*4]={ static const uint8_t scan8[16*3]={
4+1*8, 5+1*8, 4+2*8, 5+2*8, 4+ 1*8, 5+ 1*8, 4+ 2*8, 5+ 2*8,
6+1*8, 7+1*8, 6+2*8, 7+2*8, 6+ 1*8, 7+ 1*8, 6+ 2*8, 7+ 2*8,
4+3*8, 5+3*8, 4+4*8, 5+4*8, 4+ 3*8, 5+ 3*8, 4+ 4*8, 5+ 4*8,
6+3*8, 7+3*8, 6+4*8, 7+4*8, 6+ 3*8, 7+ 3*8, 6+ 4*8, 7+ 4*8,
1+1*8, 2+1*8, 4+ 6*8, 5+ 6*8, 4+ 7*8, 5+ 7*8,
1+2*8, 2+2*8, 6+ 6*8, 7+ 6*8, 6+ 7*8, 7+ 7*8,
1+4*8, 2+4*8, 4+ 8*8, 5+ 8*8, 4+ 9*8, 5+ 9*8,
1+5*8, 2+5*8, 6+ 8*8, 7+ 8*8, 6+ 9*8, 7+ 9*8,
4+11*8, 5+11*8, 4+12*8, 5+12*8,
6+11*8, 7+11*8, 6+12*8, 7+12*8,
4+13*8, 5+13*8, 4+14*8, 5+14*8,
6+13*8, 7+13*8, 6+14*8, 7+14*8
}; };
#endif #endif
...@@ -190,7 +194,7 @@ void FUNCC(ff_h264_idct8_dc_add)(uint8_t *p_dst, DCTELEM *block, int stride){ ...@@ -190,7 +194,7 @@ void FUNCC(ff_h264_idct8_dc_add)(uint8_t *p_dst, DCTELEM *block, int stride){
} }
} }
void FUNCC(ff_h264_idct_add16)(uint8_t *dst, const int *block_offset, DCTELEM *block, int stride, const uint8_t nnzc[6*8]){ void FUNCC(ff_h264_idct_add16)(uint8_t *dst, const int *block_offset, DCTELEM *block, int stride, const uint8_t nnzc[15*8]){
int i; int i;
for(i=0; i<16; i++){ for(i=0; i<16; i++){
int nnz = nnzc[ scan8[i] ]; int nnz = nnzc[ scan8[i] ];
...@@ -201,7 +205,7 @@ void FUNCC(ff_h264_idct_add16)(uint8_t *dst, const int *block_offset, DCTELEM *b ...@@ -201,7 +205,7 @@ void FUNCC(ff_h264_idct_add16)(uint8_t *dst, const int *block_offset, DCTELEM *b
} }
} }
void FUNCC(ff_h264_idct_add16intra)(uint8_t *dst, const int *block_offset, DCTELEM *block, int stride, const uint8_t nnzc[6*8]){ void FUNCC(ff_h264_idct_add16intra)(uint8_t *dst, const int *block_offset, DCTELEM *block, int stride, const uint8_t nnzc[15*8]){
int i; int i;
for(i=0; i<16; i++){ for(i=0; i<16; i++){
if(nnzc[ scan8[i] ]) FUNCC(idct_internal )(dst + block_offset[i], block + i*16*sizeof(pixel), stride, 4, 6, 1); if(nnzc[ scan8[i] ]) FUNCC(idct_internal )(dst + block_offset[i], block + i*16*sizeof(pixel), stride, 4, 6, 1);
...@@ -209,7 +213,7 @@ void FUNCC(ff_h264_idct_add16intra)(uint8_t *dst, const int *block_offset, DCTEL ...@@ -209,7 +213,7 @@ void FUNCC(ff_h264_idct_add16intra)(uint8_t *dst, const int *block_offset, DCTEL
} }
} }
void FUNCC(ff_h264_idct8_add4)(uint8_t *dst, const int *block_offset, DCTELEM *block, int stride, const uint8_t nnzc[6*8]){ void FUNCC(ff_h264_idct8_add4)(uint8_t *dst, const int *block_offset, DCTELEM *block, int stride, const uint8_t nnzc[15*8]){
int i; int i;
for(i=0; i<16; i+=4){ for(i=0; i<16; i+=4){
int nnz = nnzc[ scan8[i] ]; int nnz = nnzc[ scan8[i] ];
...@@ -220,13 +224,15 @@ void FUNCC(ff_h264_idct8_add4)(uint8_t *dst, const int *block_offset, DCTELEM *b ...@@ -220,13 +224,15 @@ void FUNCC(ff_h264_idct8_add4)(uint8_t *dst, const int *block_offset, DCTELEM *b
} }
} }
void FUNCC(ff_h264_idct_add8)(uint8_t **dest, const int *block_offset, DCTELEM *block, int stride, const uint8_t nnzc[6*8]){ void FUNCC(ff_h264_idct_add8)(uint8_t **dest, const int *block_offset, DCTELEM *block, int stride, const uint8_t nnzc[15*8]){
int i; int i, j;
for(i=16; i<16+8; i++){ for(j=1; j<3; j++){
if(nnzc[ scan8[i] ]) for(i=j*16; i<j*16+4; i++){
FUNCC(ff_h264_idct_add )(dest[(i&4)>>2] + block_offset[i], block + i*16*sizeof(pixel), stride); if(nnzc[ scan8[i] ])
else if(((dctcoef*)block)[i*16]) FUNCC(ff_h264_idct_add )(dest[j-1] + block_offset[i], block + i*16*sizeof(pixel), stride);
FUNCC(ff_h264_idct_dc_add)(dest[(i&4)>>2] + block_offset[i], block + i*16*sizeof(pixel), stride); else if(((dctcoef*)block)[i*16])
FUNCC(ff_h264_idct_dc_add)(dest[j-1] + block_offset[i], block + i*16*sizeof(pixel), stride);
}
} }
} }
/** /**
......
...@@ -1180,12 +1180,17 @@ void MPV_frame_end(MpegEncContext *s) ...@@ -1180,12 +1180,17 @@ void MPV_frame_end(MpegEncContext *s)
&& s->current_picture.reference && s->current_picture.reference
&& !s->intra_only && !s->intra_only
&& !(s->flags&CODEC_FLAG_EMU_EDGE)) { && !(s->flags&CODEC_FLAG_EMU_EDGE)) {
int edges = EDGE_BOTTOM | EDGE_TOP, h = s->v_edge_pos; int hshift = av_pix_fmt_descriptors[s->avctx->pix_fmt].log2_chroma_w;
int vshift = av_pix_fmt_descriptors[s->avctx->pix_fmt].log2_chroma_h;
s->dsp.draw_edges(s->current_picture.data[0], s->linesize , s->h_edge_pos , h , EDGE_WIDTH , edges); s->dsp.draw_edges(s->current_picture.data[0], s->linesize ,
s->dsp.draw_edges(s->current_picture.data[1], s->uvlinesize, s->h_edge_pos>>1, h>>1, EDGE_WIDTH/2, edges); s->h_edge_pos , s->v_edge_pos,
s->dsp.draw_edges(s->current_picture.data[2], s->uvlinesize, s->h_edge_pos>>1, h>>1, EDGE_WIDTH/2, edges); EDGE_WIDTH , EDGE_WIDTH , EDGE_TOP | EDGE_BOTTOM);
s->dsp.draw_edges(s->current_picture.data[1], s->uvlinesize,
s->h_edge_pos>>hshift, s->v_edge_pos>>vshift,
EDGE_WIDTH>>hshift, EDGE_WIDTH>>vshift, EDGE_TOP | EDGE_BOTTOM);
s->dsp.draw_edges(s->current_picture.data[2], s->uvlinesize,
s->h_edge_pos>>hshift, s->v_edge_pos>>vshift,
EDGE_WIDTH>>hshift, EDGE_WIDTH>>vshift, EDGE_TOP | EDGE_BOTTOM);
} }
emms_c(); emms_c();
...@@ -2289,14 +2294,19 @@ void ff_draw_horiz_band(MpegEncContext *s, int y, int h){ ...@@ -2289,14 +2294,19 @@ void ff_draw_horiz_band(MpegEncContext *s, int y, int h){
&& !s->intra_only && !s->intra_only
&& !(s->flags&CODEC_FLAG_EMU_EDGE)) { && !(s->flags&CODEC_FLAG_EMU_EDGE)) {
int sides = 0, edge_h; int sides = 0, edge_h;
int hshift = av_pix_fmt_descriptors[s->avctx->pix_fmt].log2_chroma_w;
int vshift = av_pix_fmt_descriptors[s->avctx->pix_fmt].log2_chroma_h;
if (y==0) sides |= EDGE_TOP; if (y==0) sides |= EDGE_TOP;
if (y + h >= s->v_edge_pos) sides |= EDGE_BOTTOM; if (y + h >= s->v_edge_pos) sides |= EDGE_BOTTOM;
edge_h= FFMIN(h, s->v_edge_pos - y); edge_h= FFMIN(h, s->v_edge_pos - y);
s->dsp.draw_edges(s->current_picture_ptr->data[0] + y *s->linesize , s->linesize , s->h_edge_pos , edge_h , EDGE_WIDTH , sides); s->dsp.draw_edges(s->current_picture_ptr->data[0] + y *s->linesize , s->linesize,
s->dsp.draw_edges(s->current_picture_ptr->data[1] + (y>>1)*s->uvlinesize, s->uvlinesize, s->h_edge_pos>>1, edge_h>>1, EDGE_WIDTH/2, sides); s->h_edge_pos , edge_h , EDGE_WIDTH , EDGE_WIDTH , sides);
s->dsp.draw_edges(s->current_picture_ptr->data[2] + (y>>1)*s->uvlinesize, s->uvlinesize, s->h_edge_pos>>1, edge_h>>1, EDGE_WIDTH/2, sides); s->dsp.draw_edges(s->current_picture_ptr->data[1] + (y>>vshift)*s->uvlinesize, s->uvlinesize,
s->h_edge_pos>>hshift, edge_h>>hshift, EDGE_WIDTH>>hshift, EDGE_WIDTH>>vshift, sides);
s->dsp.draw_edges(s->current_picture_ptr->data[2] + (y>>vshift)*s->uvlinesize, s->uvlinesize,
s->h_edge_pos>>hshift, edge_h>>hshift, EDGE_WIDTH>>hshift, EDGE_WIDTH>>vshift, sides);
} }
h= FFMIN(h, s->avctx->height - y); h= FFMIN(h, s->avctx->height - y);
......
...@@ -527,7 +527,7 @@ static void ff_h264_idct8_dc_add_altivec(uint8_t *dst, DCTELEM *block, int strid ...@@ -527,7 +527,7 @@ static void ff_h264_idct8_dc_add_altivec(uint8_t *dst, DCTELEM *block, int strid
h264_idct_dc_add_internal(dst, block, stride, 8); h264_idct_dc_add_internal(dst, block, stride, 8);
} }
static void ff_h264_idct_add16_altivec(uint8_t *dst, const int *block_offset, DCTELEM *block, int stride, const uint8_t nnzc[6*8]){ static void ff_h264_idct_add16_altivec(uint8_t *dst, const int *block_offset, DCTELEM *block, int stride, const uint8_t nnzc[15*8]){
int i; int i;
for(i=0; i<16; i++){ for(i=0; i<16; i++){
int nnz = nnzc[ scan8[i] ]; int nnz = nnzc[ scan8[i] ];
...@@ -538,7 +538,7 @@ static void ff_h264_idct_add16_altivec(uint8_t *dst, const int *block_offset, DC ...@@ -538,7 +538,7 @@ static void ff_h264_idct_add16_altivec(uint8_t *dst, const int *block_offset, DC
} }
} }
static void ff_h264_idct_add16intra_altivec(uint8_t *dst, const int *block_offset, DCTELEM *block, int stride, const uint8_t nnzc[6*8]){ static void ff_h264_idct_add16intra_altivec(uint8_t *dst, const int *block_offset, DCTELEM *block, int stride, const uint8_t nnzc[15*8]){
int i; int i;
for(i=0; i<16; i++){ for(i=0; i<16; i++){
if(nnzc[ scan8[i] ]) ff_h264_idct_add_altivec(dst + block_offset[i], block + i*16, stride); if(nnzc[ scan8[i] ]) ff_h264_idct_add_altivec(dst + block_offset[i], block + i*16, stride);
...@@ -546,7 +546,7 @@ static void ff_h264_idct_add16intra_altivec(uint8_t *dst, const int *block_offse ...@@ -546,7 +546,7 @@ static void ff_h264_idct_add16intra_altivec(uint8_t *dst, const int *block_offse
} }
} }
static void ff_h264_idct8_add4_altivec(uint8_t *dst, const int *block_offset, DCTELEM *block, int stride, const uint8_t nnzc[6*8]){ static void ff_h264_idct8_add4_altivec(uint8_t *dst, const int *block_offset, DCTELEM *block, int stride, const uint8_t nnzc[15*8]){
int i; int i;
for(i=0; i<16; i+=4){ for(i=0; i<16; i+=4){
int nnz = nnzc[ scan8[i] ]; int nnz = nnzc[ scan8[i] ];
...@@ -557,13 +557,15 @@ static void ff_h264_idct8_add4_altivec(uint8_t *dst, const int *block_offset, DC ...@@ -557,13 +557,15 @@ static void ff_h264_idct8_add4_altivec(uint8_t *dst, const int *block_offset, DC
} }
} }
static void ff_h264_idct_add8_altivec(uint8_t **dest, const int *block_offset, DCTELEM *block, int stride, const uint8_t nnzc[6*8]){ static void ff_h264_idct_add8_altivec(uint8_t **dest, const int *block_offset, DCTELEM *block, int stride, const uint8_t nnzc[15*8]){
int i; int i, j;
for(i=16; i<16+8; i++){ for (j = 1; j < 3; j++) {
if(nnzc[ scan8[i] ]) for(i = j * 16; i < j * 16 + 4; i++){
ff_h264_idct_add_altivec(dest[(i&4)>>2] + block_offset[i], block + i*16, stride); if(nnzc[ scan8[i] ])
else if(block[i*16]) ff_h264_idct_add_altivec(dest[j-1] + block_offset[i], block + i*16, stride);
h264_idct_dc_add_altivec(dest[(i&4)>>2] + block_offset[i], block + i*16, stride); else if(block[i*16])
h264_idct_dc_add_altivec(dest[j-1] + block_offset[i], block + i*16, stride);
}
} }
} }
......
...@@ -1976,9 +1976,15 @@ static int frame_start(SnowContext *s){ ...@@ -1976,9 +1976,15 @@ static int frame_start(SnowContext *s){
int h= s->avctx->height; int h= s->avctx->height;
if(s->current_picture.data[0]){ if(s->current_picture.data[0]){
s->dsp.draw_edges(s->current_picture.data[0], s->current_picture.linesize[0], w , h , EDGE_WIDTH , EDGE_TOP|EDGE_BOTTOM); s->dsp.draw_edges(s->current_picture.data[0],
s->dsp.draw_edges(s->current_picture.data[1], s->current_picture.linesize[1], w>>1, h>>1, EDGE_WIDTH/2, EDGE_TOP|EDGE_BOTTOM); s->current_picture.linesize[0], w , h ,
s->dsp.draw_edges(s->current_picture.data[2], s->current_picture.linesize[2], w>>1, h>>1, EDGE_WIDTH/2, EDGE_TOP|EDGE_BOTTOM); EDGE_WIDTH , EDGE_WIDTH , EDGE_TOP | EDGE_BOTTOM);
s->dsp.draw_edges(s->current_picture.data[1],
s->current_picture.linesize[1], w>>1, h>>1,
EDGE_WIDTH/2, EDGE_WIDTH/2, EDGE_TOP | EDGE_BOTTOM);
s->dsp.draw_edges(s->current_picture.data[2],
s->current_picture.linesize[2], w>>1, h>>1,
EDGE_WIDTH/2, EDGE_WIDTH/2, EDGE_TOP | EDGE_BOTTOM);
} }
release_buffer(s->avctx); release_buffer(s->avctx);
......
...@@ -635,8 +635,9 @@ static int svq3_decode_mb(SVQ3Context *svq3, unsigned int mb_type) ...@@ -635,8 +635,9 @@ static int svq3_decode_mb(SVQ3Context *svq3, unsigned int mb_type)
memset(h->intra4x4_pred_mode+h->mb2br_xy[mb_xy], DC_PRED, 8); memset(h->intra4x4_pred_mode+h->mb2br_xy[mb_xy], DC_PRED, 8);
} }
if (!IS_SKIP(mb_type) || s->pict_type == AV_PICTURE_TYPE_B) { if (!IS_SKIP(mb_type) || s->pict_type == AV_PICTURE_TYPE_B) {
memset(h->non_zero_count_cache + 8, 0, 4*9*sizeof(uint8_t)); memset(h->non_zero_count_cache + 8, 0, 14*8*sizeof(uint8_t));
s->dsp.clear_blocks(h->mb); s->dsp.clear_blocks(h->mb+ 0);
s->dsp.clear_blocks(h->mb+384);
} }
if (!IS_INTRA16x16(mb_type) && (!IS_SKIP(mb_type) || s->pict_type == AV_PICTURE_TYPE_B)) { if (!IS_INTRA16x16(mb_type) && (!IS_SKIP(mb_type) || s->pict_type == AV_PICTURE_TYPE_B)) {
...@@ -656,8 +657,8 @@ static int svq3_decode_mb(SVQ3Context *svq3, unsigned int mb_type) ...@@ -656,8 +657,8 @@ static int svq3_decode_mb(SVQ3Context *svq3, unsigned int mb_type)
} }
} }
if (IS_INTRA16x16(mb_type)) { if (IS_INTRA16x16(mb_type)) {
AV_ZERO128(h->mb_luma_dc+0); AV_ZERO128(h->mb_luma_dc[0]+0);
AV_ZERO128(h->mb_luma_dc+8); AV_ZERO128(h->mb_luma_dc[0]+8);
if (svq3_decode_block(&s->gb, h->mb_luma_dc, 0, 1)){ if (svq3_decode_block(&s->gb, h->mb_luma_dc, 0, 1)){
av_log(h->s.avctx, AV_LOG_ERROR, "error while decoding intra luma dc\n"); av_log(h->s.avctx, AV_LOG_ERROR, "error while decoding intra luma dc\n");
return -1; return -1;
...@@ -683,20 +684,23 @@ static int svq3_decode_mb(SVQ3Context *svq3, unsigned int mb_type) ...@@ -683,20 +684,23 @@ static int svq3_decode_mb(SVQ3Context *svq3, unsigned int mb_type)
} }
if ((cbp & 0x30)) { if ((cbp & 0x30)) {
for (i = 0; i < 2; ++i) { for (i = 1; i < 3; ++i) {
if (svq3_decode_block(&s->gb, &h->mb[16*(16 + 4*i)], 0, 3)){ if (svq3_decode_block(&s->gb, &h->mb[16*16*i], 0, 3)){
av_log(h->s.avctx, AV_LOG_ERROR, "error while decoding chroma dc block\n"); av_log(h->s.avctx, AV_LOG_ERROR, "error while decoding chroma dc block\n");
return -1; return -1;
} }
} }
if ((cbp & 0x20)) { if ((cbp & 0x20)) {
for (i = 0; i < 8; i++) { for (i = 1; i < 3; i++) {
h->non_zero_count_cache[ scan8[16+i] ] = 1; for (j = 0; j < 4; j++) {
k = 16*i + j;
if (svq3_decode_block(&s->gb, &h->mb[16*(16 + i)], 1, 1)){ h->non_zero_count_cache[ scan8[k] ] = 1;
av_log(h->s.avctx, AV_LOG_ERROR, "error while decoding chroma ac block\n");
return -1; if (svq3_decode_block(&s->gb, &h->mb[16*k], 1, 1)){
av_log(h->s.avctx, AV_LOG_ERROR, "error while decoding chroma ac block\n");
return -1;
}
} }
} }
} }
......
...@@ -762,7 +762,7 @@ static void h263_h_loop_filter_mmx(uint8_t *src, int stride, int qscale){ ...@@ -762,7 +762,7 @@ static void h263_h_loop_filter_mmx(uint8_t *src, int stride, int qscale){
/* draw the edges of width 'w' of an image of size width, height /* draw the edges of width 'w' of an image of size width, height
this mmx version can only handle w==8 || w==16 */ this mmx version can only handle w==8 || w==16 */
static void draw_edges_mmx(uint8_t *buf, int wrap, int width, int height, int w, int sides) static void draw_edges_mmx(uint8_t *buf, int wrap, int width, int height, int w, int h, int sides)
{ {
uint8_t *ptr, *last_line; uint8_t *ptr, *last_line;
int i; int i;
...@@ -817,7 +817,7 @@ static void draw_edges_mmx(uint8_t *buf, int wrap, int width, int height, int w, ...@@ -817,7 +817,7 @@ static void draw_edges_mmx(uint8_t *buf, int wrap, int width, int height, int w,
/* top and bottom (and hopefully also the corners) */ /* top and bottom (and hopefully also the corners) */
if (sides&EDGE_TOP) { if (sides&EDGE_TOP) {
for(i = 0; i < w; i += 4) { for(i = 0; i < h; i += 4) {
ptr= buf - (i + 1) * wrap - w; ptr= buf - (i + 1) * wrap - w;
__asm__ volatile( __asm__ volatile(
"1: \n\t" "1: \n\t"
......
...@@ -36,7 +36,7 @@ ...@@ -36,7 +36,7 @@
#if ARCH_X86 && HAVE_7REGS && HAVE_EBX_AVAILABLE && !defined(BROKEN_RELOCATIONS) #if ARCH_X86 && HAVE_7REGS && HAVE_EBX_AVAILABLE && !defined(BROKEN_RELOCATIONS)
static int decode_significance_x86(CABACContext *c, int max_coeff, static int decode_significance_x86(CABACContext *c, int max_coeff,
uint8_t *significant_coeff_ctx_base, uint8_t *significant_coeff_ctx_base,
int *index){ int *index, x86_reg last_off){
void *end= significant_coeff_ctx_base + max_coeff - 1; void *end= significant_coeff_ctx_base + max_coeff - 1;
int minusstart= -(int)significant_coeff_ctx_base; int minusstart= -(int)significant_coeff_ctx_base;
int minusindex= 4-(int)index; int minusindex= 4-(int)index;
...@@ -52,10 +52,12 @@ static int decode_significance_x86(CABACContext *c, int max_coeff, ...@@ -52,10 +52,12 @@ static int decode_significance_x86(CABACContext *c, int max_coeff,
"test $1, %%edx \n\t" "test $1, %%edx \n\t"
" jz 3f \n\t" " jz 3f \n\t"
"add %7, %1 \n\t"
BRANCHLESS_GET_CABAC("%%edx", "%3", "61(%1)", "%%ebx", BRANCHLESS_GET_CABAC("%%edx", "%3", "(%1)", "%%ebx",
"%%bx", "%%esi", "%%eax", "%%al") "%%bx", "%%esi", "%%eax", "%%al")
"sub %7, %1 \n\t"
"mov %2, %%"REG_a" \n\t" "mov %2, %%"REG_a" \n\t"
"movl %4, %%ecx \n\t" "movl %4, %%ecx \n\t"
"add %1, %%"REG_c" \n\t" "add %1, %%"REG_c" \n\t"
...@@ -82,7 +84,7 @@ static int decode_significance_x86(CABACContext *c, int max_coeff, ...@@ -82,7 +84,7 @@ static int decode_significance_x86(CABACContext *c, int max_coeff,
"movl %%esi, "RANGE "(%3) \n\t" "movl %%esi, "RANGE "(%3) \n\t"
"movl %%ebx, "LOW "(%3) \n\t" "movl %%ebx, "LOW "(%3) \n\t"
:"=&a"(coeff_count), "+r"(significant_coeff_ctx_base), "+m"(index) :"=&a"(coeff_count), "+r"(significant_coeff_ctx_base), "+m"(index)
:"r"(c), "m"(minusstart), "m"(end), "m"(minusindex) :"r"(c), "m"(minusstart), "m"(end), "m"(minusindex), "m"(last_off)
: "%"REG_c, "%ebx", "%edx", "%esi", "memory" : "%"REG_c, "%ebx", "%edx", "%esi", "memory"
); );
return coeff_count; return coeff_count;
...@@ -90,7 +92,7 @@ static int decode_significance_x86(CABACContext *c, int max_coeff, ...@@ -90,7 +92,7 @@ static int decode_significance_x86(CABACContext *c, int max_coeff,
static int decode_significance_8x8_x86(CABACContext *c, static int decode_significance_8x8_x86(CABACContext *c,
uint8_t *significant_coeff_ctx_base, uint8_t *significant_coeff_ctx_base,
int *index, const uint8_t *sig_off){ int *index, x86_reg last_off, const uint8_t *sig_off){
int minusindex= 4-(int)index; int minusindex= 4-(int)index;
int coeff_count; int coeff_count;
x86_reg last=0; x86_reg last=0;
...@@ -114,8 +116,9 @@ static int decode_significance_8x8_x86(CABACContext *c, ...@@ -114,8 +116,9 @@ static int decode_significance_8x8_x86(CABACContext *c,
"movzbl "MANGLE(last_coeff_flag_offset_8x8)"(%%edi), %%edi\n\t" "movzbl "MANGLE(last_coeff_flag_offset_8x8)"(%%edi), %%edi\n\t"
"add %5, %%"REG_D" \n\t" "add %5, %%"REG_D" \n\t"
"add %7, %%"REG_D" \n\t"
BRANCHLESS_GET_CABAC("%%edx", "%3", "15(%%"REG_D")", "%%ebx", BRANCHLESS_GET_CABAC("%%edx", "%3", "(%%"REG_D")", "%%ebx",
"%%bx", "%%esi", "%%eax", "%%al") "%%bx", "%%esi", "%%eax", "%%al")
"mov %2, %%"REG_a" \n\t" "mov %2, %%"REG_a" \n\t"
...@@ -142,7 +145,7 @@ static int decode_significance_8x8_x86(CABACContext *c, ...@@ -142,7 +145,7 @@ static int decode_significance_8x8_x86(CABACContext *c,
"movl %%esi, "RANGE "(%3) \n\t" "movl %%esi, "RANGE "(%3) \n\t"
"movl %%ebx, "LOW "(%3) \n\t" "movl %%ebx, "LOW "(%3) \n\t"
:"=&a"(coeff_count),"+m"(last), "+m"(index) :"=&a"(coeff_count),"+m"(last), "+m"(index)
:"r"(c), "m"(minusindex), "m"(significant_coeff_ctx_base), "m"(sig_off) :"r"(c), "m"(minusindex), "m"(significant_coeff_ctx_base), "m"(sig_off), "m"(last_off)
: "%"REG_c, "%ebx", "%edx", "%esi", "%"REG_D, "memory" : "%"REG_c, "%ebx", "%edx", "%esi", "%"REG_D, "memory"
); );
return coeff_count; return coeff_count;
......
...@@ -32,14 +32,18 @@ ...@@ -32,14 +32,18 @@
SECTION_RODATA SECTION_RODATA
; FIXME this table is a duplicate from h264data.h, and will be removed once the tables from, h264 have been split ; FIXME this table is a duplicate from h264data.h, and will be removed once the tables from, h264 have been split
scan8_mem: db 4+1*8, 5+1*8, 4+2*8, 5+2*8 scan8_mem: db 4+ 1*8, 5+ 1*8, 4+ 2*8, 5+ 2*8
db 6+1*8, 7+1*8, 6+2*8, 7+2*8 db 6+ 1*8, 7+ 1*8, 6+ 2*8, 7+ 2*8
db 4+3*8, 5+3*8, 4+4*8, 5+4*8 db 4+ 3*8, 5+ 3*8, 4+ 4*8, 5+ 4*8
db 6+3*8, 7+3*8, 6+4*8, 7+4*8 db 6+ 3*8, 7+ 3*8, 6+ 4*8, 7+ 4*8
db 1+1*8, 2+1*8 db 4+ 6*8, 5+ 6*8, 4+ 7*8, 5+ 7*8
db 1+2*8, 2+2*8 db 6+ 6*8, 7+ 6*8, 6+ 7*8, 7+ 7*8
db 1+4*8, 2+4*8 db 4+ 8*8, 5+ 8*8, 4+ 9*8, 5+ 9*8
db 1+5*8, 2+5*8 db 6+ 8*8, 7+ 8*8, 6+ 9*8, 7+ 9*8
db 4+11*8, 5+11*8, 4+12*8, 5+12*8
db 6+11*8, 7+11*8, 6+12*8, 7+12*8
db 4+13*8, 5+13*8, 4+14*8, 5+14*8
db 6+13*8, 7+13*8, 6+14*8, 7+14*8
%ifdef PIC %ifdef PIC
%define scan8 r11 %define scan8 r11
%else %else
...@@ -617,6 +621,8 @@ cglobal h264_idct_add8_8_mmx, 5, 7, 0 ...@@ -617,6 +621,8 @@ cglobal h264_idct_add8_8_mmx, 5, 7, 0
mov r10, r0 mov r10, r0
%endif %endif
call h264_idct_add8_mmx_plane call h264_idct_add8_mmx_plane
mov r5, 32
add r2, 384
%ifdef ARCH_X86_64 %ifdef ARCH_X86_64
add r10, gprsize add r10, gprsize
%else %else
...@@ -678,6 +684,8 @@ cglobal h264_idct_add8_8_mmx2, 5, 7, 0 ...@@ -678,6 +684,8 @@ cglobal h264_idct_add8_8_mmx2, 5, 7, 0
lea r11, [scan8_mem] lea r11, [scan8_mem]
%endif %endif
call h264_idct_add8_mmx2_plane call h264_idct_add8_mmx2_plane
mov r5, 32
add r2, 384
%ifdef ARCH_X86_64 %ifdef ARCH_X86_64
add r10, gprsize add r10, gprsize
%else %else
...@@ -810,12 +818,12 @@ cglobal h264_idct_add16intra_8_sse2, 5, 7, 8 ...@@ -810,12 +818,12 @@ cglobal h264_idct_add16intra_8_sse2, 5, 7, 8
test r0, r0 test r0, r0
jz .try%1dc jz .try%1dc
%ifdef ARCH_X86_64 %ifdef ARCH_X86_64
mov r0d, dword [r1+%1*8+64] mov r0d, dword [r1+(%1&1)*8+64*(1+(%1>>1))]
add r0, [r10] add r0, [r10]
%else %else
mov r0, r0m mov r0, r0m
mov r0, [r0] mov r0, [r0]
add r0, dword [r1+%1*8+64] add r0, dword [r1+(%1&1)*8+64*(1+(%1>>1))]
%endif %endif
call x264_add8x4_idct_sse2 call x264_add8x4_idct_sse2
jmp .cycle%1end jmp .cycle%1end
...@@ -824,16 +832,18 @@ cglobal h264_idct_add16intra_8_sse2, 5, 7, 8 ...@@ -824,16 +832,18 @@ cglobal h264_idct_add16intra_8_sse2, 5, 7, 8
or r0w, word [r2+32] or r0w, word [r2+32]
jz .cycle%1end jz .cycle%1end
%ifdef ARCH_X86_64 %ifdef ARCH_X86_64
mov r0d, dword [r1+%1*8+64] mov r0d, dword [r1+(%1&1)*8+64*(1+(%1>>1))]
add r0, [r10] add r0, [r10]
%else %else
mov r0, r0m mov r0, r0m
mov r0, [r0] mov r0, [r0]
add r0, dword [r1+%1*8+64] add r0, dword [r1+(%1&1)*8+64*(1+(%1>>1))]
%endif %endif
call h264_idct_dc_add8_mmx2 call h264_idct_dc_add8_mmx2
.cycle%1end .cycle%1end
%if %1 < 3 %if %1 == 1
add r2, 384+64
%elif %1 < 3
add r2, 64 add r2, 64
%endif %endif
%endmacro %endmacro
...@@ -845,15 +855,15 @@ cglobal h264_idct_add8_8_sse2, 5, 7, 8 ...@@ -845,15 +855,15 @@ cglobal h264_idct_add8_8_sse2, 5, 7, 8
%ifdef ARCH_X86_64 %ifdef ARCH_X86_64
mov r10, r0 mov r10, r0
%endif %endif
add8_sse2_cycle 0, 0x09 add8_sse2_cycle 0, 0x34
add8_sse2_cycle 1, 0x11 add8_sse2_cycle 1, 0x3c
%ifdef ARCH_X86_64 %ifdef ARCH_X86_64
add r10, gprsize add r10, gprsize
%else %else
add r0mp, gprsize add r0mp, gprsize
%endif %endif
add8_sse2_cycle 2, 0x21 add8_sse2_cycle 2, 0x5c
add8_sse2_cycle 3, 0x29 add8_sse2_cycle 3, 0x64
RET RET
;void ff_h264_luma_dc_dequant_idct_mmx(DCTELEM *output, DCTELEM *input, int qmul) ;void ff_h264_luma_dc_dequant_idct_mmx(DCTELEM *output, DCTELEM *input, int qmul)
......
...@@ -29,14 +29,18 @@ SECTION_RODATA ...@@ -29,14 +29,18 @@ SECTION_RODATA
pw_pixel_max: times 8 dw ((1 << 10)-1) pw_pixel_max: times 8 dw ((1 << 10)-1)
pd_32: times 4 dd 32 pd_32: times 4 dd 32
scan8_mem: db 4+1*8, 5+1*8, 4+2*8, 5+2*8 scan8_mem: db 4+ 1*8, 5+ 1*8, 4+ 2*8, 5+ 2*8
db 6+1*8, 7+1*8, 6+2*8, 7+2*8 db 6+ 1*8, 7+ 1*8, 6+ 2*8, 7+ 2*8
db 4+3*8, 5+3*8, 4+4*8, 5+4*8 db 4+ 3*8, 5+ 3*8, 4+ 4*8, 5+ 4*8
db 6+3*8, 7+3*8, 6+4*8, 7+4*8 db 6+ 3*8, 7+ 3*8, 6+ 4*8, 7+ 4*8
db 1+1*8, 2+1*8 db 4+ 6*8, 5+ 6*8, 4+ 7*8, 5+ 7*8
db 1+2*8, 2+2*8 db 6+ 6*8, 7+ 6*8, 6+ 7*8, 7+ 7*8
db 1+4*8, 2+4*8 db 4+ 8*8, 5+ 8*8, 4+ 9*8, 5+ 9*8
db 1+5*8, 2+5*8 db 6+ 8*8, 7+ 8*8, 6+ 9*8, 7+ 9*8
db 4+11*8, 5+11*8, 4+12*8, 5+12*8
db 6+11*8, 7+11*8, 6+12*8, 7+12*8
db 4+13*8, 5+13*8, 4+14*8, 5+14*8
db 6+13*8, 7+13*8, 6+14*8, 7+14*8
%ifdef PIC %ifdef PIC
%define scan8 r11 %define scan8 r11
...@@ -306,7 +310,7 @@ INIT_AVX ...@@ -306,7 +310,7 @@ INIT_AVX
IDCT_ADD16INTRA_10 avx IDCT_ADD16INTRA_10 avx
%endif %endif
%assign last_block 24 %assign last_block 36
;----------------------------------------------------------------------------- ;-----------------------------------------------------------------------------
; h264_idct_add8(pixel **dst, const int *block_offset, dctcoef *block, int stride, const uint8_t nnzc[6*8]) ; h264_idct_add8(pixel **dst, const int *block_offset, dctcoef *block, int stride, const uint8_t nnzc[6*8])
;----------------------------------------------------------------------------- ;-----------------------------------------------------------------------------
...@@ -317,21 +321,22 @@ cglobal h264_idct_add8_10_%1,5,7 ...@@ -317,21 +321,22 @@ cglobal h264_idct_add8_10_%1,5,7
%endif %endif
add r2, 1024 add r2, 1024
mov r0, [r0] mov r0, [r0]
ADD16_OP_INTRA %1, 16, 1+1*8 ADD16_OP_INTRA %1, 16, 4+ 6*8
ADD16_OP_INTRA %1, 18, 1+2*8 ADD16_OP_INTRA %1, 18, 4+ 7*8
add r2, 1024-128*2
%ifdef ARCH_X86_64 %ifdef ARCH_X86_64
mov r0, [r10+gprsize] mov r0, [r10+gprsize]
%else %else
mov r0, r0m mov r0, r0m
mov r0, [r0+gprsize] mov r0, [r0+gprsize]
%endif %endif
ADD16_OP_INTRA %1, 20, 1+4*8 ADD16_OP_INTRA %1, 32, 4+11*8
ADD16_OP_INTRA %1, 22, 1+5*8 ADD16_OP_INTRA %1, 34, 4+12*8
REP_RET REP_RET
AC %1, 16 AC %1, 16
AC %1, 18 AC %1, 18
AC %1, 20 AC %1, 32
AC %1, 22 AC %1, 34
%endmacro ; IDCT_ADD8 %endmacro ; IDCT_ADD8
......
This diff is collapsed.
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