Files
Marcos Ashton Iglesias 278eeeb16e avcodec/x86/hevc: add SSSE3 pred_planar
Implements planar intra prediction for 8 bit. x86 has no HEVC intra
prediction at all; aarch64 NEON already covers planar, DC and angular.

Every term except (size-1-x)*left[y] is linear in y, so for a group of
eight columns they collapse into one running accumulator whose increment
left[size]-top[x] is loop invariant. Running columns outermost keeps that
accumulator and its delta in registers, so a row costs one pmullw and two
paddw with no reload of top[]. 16x16 and 32x32 run two groups together,
sharing the left[y] broadcast and writing a row with one 16 byte store.
Words suffice throughout: each coefficient pair sums to size, so the
largest value is 2*32*255 + 32 = 16352. SSSE3 rather than SSE2 since
pshufb does the broadcasts and the byte to word widening.

checkasm --bench on a Core Ultra 7 155H:
hevc_pred_planar_4x4_8_c:            18.4
hevc_pred_planar_4x4_8_ssse3:         5.5 ( 3.35x)
hevc_pred_planar_8x8_8_c:            83.1
hevc_pred_planar_8x8_8_ssse3:        16.3 ( 5.10x)
hevc_pred_planar_16x16_8_c:         224.8
hevc_pred_planar_16x16_8_ssse3:      47.3 ( 4.75x)
hevc_pred_planar_32x32_8_c:         629.5
hevc_pred_planar_32x32_8_ssse3:     196.5 ( 3.20x)

Part of #23022.
2026-08-27 11:45:46 +00:00

79 lines
3.4 KiB
C

/*
* HEVC video Decoder
*
* Copyright (C) 2012 - 2013 Guillaume Martres
*
* 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
*/
#ifndef AVCODEC_HEVC_PRED_H
#define AVCODEC_HEVC_PRED_H
#include <stddef.h>
#include <stdint.h>
struct HEVCLocalContext;
struct HEVCPPS;
typedef struct HEVCPredContext {
void (*intra_pred[4])(struct HEVCLocalContext *lc,
const struct HEVCPPS *pps, int x0, int y0, int c_idx);
void (*pred_planar[4])(uint8_t *src, const uint8_t *top,
const uint8_t *left, ptrdiff_t stride);
void (*pred_dc)(uint8_t *src, const uint8_t *top, const uint8_t *left,
ptrdiff_t stride, int log2_size, int c_idx);
void (*pred_angular[4])(uint8_t *src, const uint8_t *top,
const uint8_t *left, ptrdiff_t stride,
int c_idx, int mode);
void (*ref_filter_3tap[3])(uint8_t *filtered_left, uint8_t *filtered_top,
const uint8_t *left, const uint8_t *top,
int size);
void (*ref_filter_strong)(uint8_t *filtered_top, uint8_t *left,
const uint8_t *top);
} HEVCPredContext;
void ff_hevc_pred_init(HEVCPredContext *hpc, int bit_depth);
void ff_hevc_pred_init_mips(HEVCPredContext *hpc, int bit_depth);
void ff_hevc_pred_init_aarch64(HEVCPredContext *hpc, int bit_depth);
void ff_hevc_pred_init_x86(HEVCPredContext *hpc, int bit_depth);
/* C angular prediction fallbacks (non-static for arch-specific partial override) */
#define HEVC_PRED_ANGULAR_DECL(depth) \
void ff_hevc_pred_angular_0_ ## depth(uint8_t *src, const uint8_t *top, \
const uint8_t *left, ptrdiff_t stride, \
int c_idx, int mode); \
void ff_hevc_pred_angular_1_ ## depth(uint8_t *src, const uint8_t *top, \
const uint8_t *left, ptrdiff_t stride, \
int c_idx, int mode); \
void ff_hevc_pred_angular_2_ ## depth(uint8_t *src, const uint8_t *top, \
const uint8_t *left, ptrdiff_t stride, \
int c_idx, int mode); \
void ff_hevc_pred_angular_3_ ## depth(uint8_t *src, const uint8_t *top, \
const uint8_t *left, ptrdiff_t stride, \
int c_idx, int mode);
HEVC_PRED_ANGULAR_DECL(8)
HEVC_PRED_ANGULAR_DECL(9)
HEVC_PRED_ANGULAR_DECL(10)
HEVC_PRED_ANGULAR_DECL(12)
#undef HEVC_PRED_ANGULAR_DECL
#endif /* AVCODEC_HEVC_PRED_H */