History

avcodec/me_cmp: Fix crashes on ARM due to misalignment

Adds a diff_pixels_unaligned() Fixes: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=872503

Michael Niedermayer committed 9 years ago

Commit bc488ec1 parent 898ea654 files · +13 −5Browse files

Showing the changes to libavcodec (4 of 4 files). Show all

Unified · Split

4 files
  1. libavcodec/me_cmp.c +5 −5
  2. libavcodec/pixblockdsp.c +1 −0
  3. libavcodec/pixblockdsp.h +5 −0
  4. libavcodec/x86/pixblockdsp_init.c +2 −0
libavcodec/me_cmp.c+5−5
@@ -628,7 +628,7 @@ static int dct_sad8x8_c(MpegEncContext *s, uint8_t *src1, · 627 unmodified lines
628 628
629 av_assert2(h == 8);629 av_assert2(h == 8);
630 630
631 s->pdsp.diff_pixels(temp, src1, src2, stride);631 s->pdsp.diff_pixels_unaligned(temp, src1, src2, stride);
632 s->fdsp.fdct(temp);632 s->fdsp.fdct(temp);
633 return s->mecc.sum_abs_dctelem(temp);633 return s->mecc.sum_abs_dctelem(temp);
634}634}
@@ -668,7 +668,7 @@ static int dct264_sad8x8_c(MpegEncContext *s, uint8_t *src1, · 33 unmodified lines
668 int16_t dct[8][8];668 int16_t dct[8][8];
669 int i, sum = 0;669 int i, sum = 0;
670 670
671 s->pdsp.diff_pixels(dct[0], src1, src2, stride);671 s->pdsp.diff_pixels_unaligned(dct[0], src1, src2, stride);
672 672
673#define SRC(x) dct[i][x]673#define SRC(x) dct[i][x]
674#define DST(x, v) dct[i][x] = v674#define DST(x, v) dct[i][x] = v
@@ -695,7 +695,7 @@ static int dct_max8x8_c(MpegEncContext *s, uint8_t *src1, · 20 unmodified lines
695 695
696 av_assert2(h == 8);696 av_assert2(h == 8);
697 697
698 s->pdsp.diff_pixels(temp, src1, src2, stride);698 s->pdsp.diff_pixels_unaligned(temp, src1, src2, stride);
699 s->fdsp.fdct(temp);699 s->fdsp.fdct(temp);
700 700
701 for (i = 0; i < 64; i++)701 for (i = 0; i < 64; i++)
@@ -714,7 +714,7 @@ static int quant_psnr8x8_c(MpegEncContext *s, uint8_t *src1, · 12 unmodified lines
714 av_assert2(h == 8);714 av_assert2(h == 8);
715 s->mb_intra = 0;715 s->mb_intra = 0;
716 716
717 s->pdsp.diff_pixels(temp, src1, src2, stride);717 s->pdsp.diff_pixels_unaligned(temp, src1, src2, stride);
718 718
719 memcpy(bak, temp, 64 * sizeof(int16_t));719 memcpy(bak, temp, 64 * sizeof(int16_t));
720 720
@@ -817,7 +817,7 @@ static int bit8x8_c(MpegEncContext *s, uint8_t *src1, uint8_t *src2, · 96 unmodified lines
817 817
818 av_assert2(h == 8);818 av_assert2(h == 8);
819 819
820 s->pdsp.diff_pixels(temp, src1, src2, stride);820 s->pdsp.diff_pixels_unaligned(temp, src1, src2, stride);
821 821
822 s->block_last_index[0 /* FIXME */] =822 s->block_last_index[0 /* FIXME */] =
823 last =823 last =
libavcodec/pixblockdsp.c+1−0
@@ -82,6 +82,7 @@ av_cold void ff_pixblockdsp_init(PixblockDSPContext *c, AVCodecContext *avctx) · 81 unmodified lines
82{82{
83 const unsigned high_bit_depth = avctx->bits_per_raw_sample > 8;83 const unsigned high_bit_depth = avctx->bits_per_raw_sample > 8;
84 84
85 c->diff_pixels_unaligned =
85 c->diff_pixels = diff_pixels_c;86 c->diff_pixels = diff_pixels_c;
86 87
87 switch (avctx->bits_per_raw_sample) {88 switch (avctx->bits_per_raw_sample) {
libavcodec/pixblockdsp.h+5−0
@@ -33,6 +33,11 @@ typedef struct PixblockDSPContext { · 32 unmodified lines
33 const uint8_t *s1 /* align 8 */,33 const uint8_t *s1 /* align 8 */,
34 const uint8_t *s2 /* align 8 */,34 const uint8_t *s2 /* align 8 */,
35 ptrdiff_t stride);35 ptrdiff_t stride);
36 void (*diff_pixels_unaligned)(int16_t *av_restrict block /* align 16 */,
37 const uint8_t *s1,
38 const uint8_t *s2,
39 ptrdiff_t stride);
40
36} PixblockDSPContext;41} PixblockDSPContext;
37 42
38void ff_pixblockdsp_init(PixblockDSPContext *c, AVCodecContext *avctx);43void ff_pixblockdsp_init(PixblockDSPContext *c, AVCodecContext *avctx);
libavcodec/x86/pixblockdsp_init.c+2−0
@@ -39,12 +39,14 @@ av_cold void ff_pixblockdsp_init_x86(PixblockDSPContext *c, · 38 unmodified lines
39 if (EXTERNAL_MMX(cpu_flags)) {39 if (EXTERNAL_MMX(cpu_flags)) {
40 if (!high_bit_depth)40 if (!high_bit_depth)
41 c->get_pixels = ff_get_pixels_mmx;41 c->get_pixels = ff_get_pixels_mmx;
42 c->diff_pixels_unaligned =
42 c->diff_pixels = ff_diff_pixels_mmx;43 c->diff_pixels = ff_diff_pixels_mmx;
43 }44 }
44 45
45 if (EXTERNAL_SSE2(cpu_flags)) {46 if (EXTERNAL_SSE2(cpu_flags)) {
46 if (!high_bit_depth)47 if (!high_bit_depth)
47 c->get_pixels = ff_get_pixels_sse2;48 c->get_pixels = ff_get_pixels_sse2;
49 c->diff_pixels_unaligned =
48 c->diff_pixels = ff_diff_pixels_sse2;50 c->diff_pixels = ff_diff_pixels_sse2;
49 }51 }
50}52}

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t