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
628628
629629 av_assert2(h == 8);
630630
631− s->pdsp.diff_pixels(temp, src1, src2, stride);
631+ s->pdsp.diff_pixels_unaligned(temp, src1, src2, stride);
632632 s->fdsp.fdct(temp);
633633 return s->mecc.sum_abs_dctelem(temp);
634634 }
@@ -668,7 +668,7 @@ static int dct264_sad8x8_c(MpegEncContext *s, uint8_t *src1, · 33 unmodified lines
668668 int16_t dct[8][8];
669669 int i, sum = 0;
670670
671− s->pdsp.diff_pixels(dct[0], src1, src2, stride);
671+ s->pdsp.diff_pixels_unaligned(dct[0], src1, src2, stride);
672672
673673 #define SRC(x) dct[i][x]
674674 #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
695695
696696 av_assert2(h == 8);
697697
698− s->pdsp.diff_pixels(temp, src1, src2, stride);
698+ s->pdsp.diff_pixels_unaligned(temp, src1, src2, stride);
699699 s->fdsp.fdct(temp);
700700
701701 for (i = 0; i < 64; i++)
@@ -714,7 +714,7 @@ static int quant_psnr8x8_c(MpegEncContext *s, uint8_t *src1, · 12 unmodified lines
714714 av_assert2(h == 8);
715715 s->mb_intra = 0;
716716
717− s->pdsp.diff_pixels(temp, src1, src2, stride);
717+ s->pdsp.diff_pixels_unaligned(temp, src1, src2, stride);
718718
719719 memcpy(bak, temp, 64 * sizeof(int16_t));
720720
@@ -817,7 +817,7 @@ static int bit8x8_c(MpegEncContext *s, uint8_t *src1, uint8_t *src2, · 96 unmodified lines
817817
818818 av_assert2(h == 8);
819819
820− s->pdsp.diff_pixels(temp, src1, src2, stride);
820+ s->pdsp.diff_pixels_unaligned(temp, src1, src2, stride);
821821
822822 s->block_last_index[0 /* FIXME */] =
823823 last =
libavcodec/pixblockdsp.c+1−0
@@ -82,6 +82,7 @@ av_cold void ff_pixblockdsp_init(PixblockDSPContext *c, AVCodecContext *avctx) · 81 unmodified lines
8282 {
8383 const unsigned high_bit_depth = avctx->bits_per_raw_sample > 8;
8484
85+ c->diff_pixels_unaligned =
8586 c->diff_pixels = diff_pixels_c;
8687
8788 switch (avctx->bits_per_raw_sample) {
libavcodec/pixblockdsp.h+5−0
@@ -33,6 +33,11 @@ typedef struct PixblockDSPContext { · 32 unmodified lines
3333 const uint8_t *s1 /* align 8 */,
3434 const uint8_t *s2 /* align 8 */,
3535 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+
3641 } PixblockDSPContext;
3742
3843 void 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
3939 if (EXTERNAL_MMX(cpu_flags)) {
4040 if (!high_bit_depth)
4141 c->get_pixels = ff_get_pixels_mmx;
42+ c->diff_pixels_unaligned =
4243 c->diff_pixels = ff_diff_pixels_mmx;
4344 }
4445
4546 if (EXTERNAL_SSE2(cpu_flags)) {
4647 if (!high_bit_depth)
4748 c->get_pixels = ff_get_pixels_sse2;
49+ c->diff_pixels_unaligned =
4850 c->diff_pixels = ff_diff_pixels_sse2;
4951 }
5052 }

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