[FFmpeg-devel] [PATCH 2/4] lavc/mpegvideo: use H263DSP dequant function
Rémi Denis-Courmont
remi at remlab.net
Fri Jun 14 17:45:50 EEST 2024
Le 14 juin 2024 17:33:16 GMT+03:00, James Almer <jamrial at gmail.com> a écrit :
>On 6/12/2024 1:47 AM, Rémi Denis-Courmont wrote:
>> ---
>> configure | 4 ++--
>> libavcodec/mpegvideo.c | 46 +++++++++++-------------------------------
>> 2 files changed, 14 insertions(+), 36 deletions(-)
>>
>> diff --git a/configure b/configure
>> index 6baa9b0646..eb9d1b1f5d 100755
>> --- a/configure
>> +++ b/configure
>> @@ -2957,8 +2957,8 @@ ftr_decoder_select="adts_header"
>> g2m_decoder_deps="zlib"
>> g2m_decoder_select="blockdsp idctdsp jpegtables"
>> g729_decoder_select="audiodsp"
>> -h261_decoder_select="mpegvideodec"
>> -h261_encoder_select="mpegvideoenc"
>> +h261_decoder_select="h263dsp mpegvideodec"
>> +h261_encoder_select="h263dsp mpegvideoenc"
>> h263_decoder_select="h263_parser h263dsp mpegvideodec qpeldsp"
>> h263_encoder_select="h263dsp mpegvideoenc"
>> h263i_decoder_select="h263_decoder"
>> diff --git a/libavcodec/mpegvideo.c b/libavcodec/mpegvideo.c
>> index 7af823b8bd..b35fd37083 100644
>> --- a/libavcodec/mpegvideo.c
>> +++ b/libavcodec/mpegvideo.c
>> @@ -201,13 +201,11 @@ static void dct_unquantize_mpeg2_inter_c(MpegEncContext *s,
>> static void dct_unquantize_h263_intra_c(MpegEncContext *s,
>> int16_t *block, int n, int qscale)
>> {
>> - int i, level, qmul, qadd;
>> - int nCoeffs;
>> + int qmul = qscale << 1;
>> + int qadd, nCoeffs;
>> av_assert2(s->block_last_index[n]>=0 || s->h263_aic);
>> - qmul = qscale << 1;
>> -
>> if (!s->h263_aic) {
>> block[0] *= n < 4 ? s->y_dc_scale : s->c_dc_scale;
>> qadd = (qscale - 1) | 1;
>> @@ -215,47 +213,24 @@ static void dct_unquantize_h263_intra_c(MpegEncContext *s,
>> qadd = 0;
>> }
>> if(s->ac_pred)
>> - nCoeffs=63;
>> + nCoeffs = 64;
>> else
>> - nCoeffs= s->intra_scantable.raster_end[ s->block_last_index[n] ];
>> + nCoeffs = s->intra_scantable.raster_end[s->block_last_index[n]] + 1;
>> - for(i=1; i<=nCoeffs; i++) {
>> - level = block[i];
>> - if (level) {
>> - if (level < 0) {
>> - level = level * qmul - qadd;
>> - } else {
>> - level = level * qmul + qadd;
>> - }
>> - block[i] = level;
>> - }
>> - }
>> + s->h263dsp.h263_dct_unquantize_intra(block, nCoeffs, qmul, qadd);
>
>Looking further into this, you're adding a function pointer call in a function that's already called from a function pointer. And both x86 and arm have asm optimized versions of this entire method, which includes all the setup before the loop.
I am not interested in copying existing bad design. Note that the Arm code uses intrinsics. I don't want to use RVV intrinsics especially just for this. And x86 only has MMX.
>Can't you do the same for riscv?
Sure, RV can address fixed offsets up to +/-2 KiB. If someone *else* adds a assembler-friendly header file that defines the offsets to the relevant context fields, and rewrites the checkasm code to match, that is.
> Is there anything preventing you from accessing fields at specific offsets within MpegEncContext?
My strong belief that that would be technically wrong, yes.
More information about the ffmpeg-devel
mailing list