summaryrefslogtreecommitdiff
path: root/chromium/third_party/ffmpeg/libavcodec/v210dec.c
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/third_party/ffmpeg/libavcodec/v210dec.c')
-rw-r--r--chromium/third_party/ffmpeg/libavcodec/v210dec.c28
1 files changed, 20 insertions, 8 deletions
diff --git a/chromium/third_party/ffmpeg/libavcodec/v210dec.c b/chromium/third_party/ffmpeg/libavcodec/v210dec.c
index ddc5dbe8be6..5a33d8c0899 100644
--- a/chromium/third_party/ffmpeg/libavcodec/v210dec.c
+++ b/chromium/third_party/ffmpeg/libavcodec/v210dec.c
@@ -50,6 +50,13 @@ static void v210_planar_unpack_c(const uint32_t *src, uint16_t *y, uint16_t *u,
}
}
+av_cold void ff_v210dec_init(V210DecContext *s)
+{
+ s->unpack_frame = v210_planar_unpack_c;
+ if (ARCH_X86)
+ ff_v210_x86_init(s);
+}
+
static av_cold int decode_init(AVCodecContext *avctx)
{
V210DecContext *s = avctx->priv_data;
@@ -57,10 +64,8 @@ static av_cold int decode_init(AVCodecContext *avctx)
avctx->pix_fmt = AV_PIX_FMT_YUV422P10;
avctx->bits_per_raw_sample = 10;
- s->unpack_frame = v210_planar_unpack_c;
-
- if (HAVE_MMX)
- ff_v210_x86_init(s);
+ s->aligned_input = 0;
+ ff_v210dec_init(s);
return 0;
}
@@ -99,11 +104,10 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
&& avpkt->size - 64 >= stride * avctx->height)
psrc += 64;
- aligned_input = !((uintptr_t)psrc & 0xf) && !(stride & 0xf);
+ aligned_input = !((uintptr_t)psrc & 0x1f) && !(stride & 0x1f);
if (aligned_input != s->aligned_input) {
s->aligned_input = aligned_input;
- if (HAVE_MMX)
- ff_v210_x86_init(s);
+ ff_v210dec_init(s);
}
if ((ret = ff_get_buffer(avctx, pic, 0)) < 0)
@@ -119,7 +123,7 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
const uint32_t *src = (const uint32_t*)psrc;
uint32_t val;
- w = (avctx->width / 6) * 6;
+ w = (avctx->width / 12) * 12;
s->unpack_frame(src, y, u, v, w);
y += w;
@@ -127,6 +131,14 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
v += w >> 1;
src += (w << 1) / 3;
+ if (w < avctx->width - 5) {
+ READ_PIXELS(u, y, v);
+ READ_PIXELS(y, u, y);
+ READ_PIXELS(v, y, u);
+ READ_PIXELS(y, v, y);
+ w += 6;
+ }
+
if (w < avctx->width - 1) {
READ_PIXELS(u, y, v);