[FFmpeg-devel] [PATCH] avcodec/dnxhdenc: DNxHR 444 and HQX support

Paul B Mahol onemda at gmail.com
Mon Mar 27 21:54:10 EEST 2017


On 3/27/17, Rostislav Pehlivanov <atomnuker at gmail.com> wrote:
> On 27 March 2017 at 19:08, Paul B Mahol <onemda at gmail.com> wrote:
>
>> Signed-off-by: Paul B Mahol <onemda at gmail.com>
>> ---
>>  libavcodec/dnxhdenc.c | 227 ++++++++++++++++++++++++++++++
>> +++++---------------
>>  libavcodec/dnxhdenc.h |   6 +-
>>  2 files changed, 163 insertions(+), 70 deletions(-)
>>
>> diff --git a/libavcodec/dnxhdenc.c b/libavcodec/dnxhdenc.c
>> index 33f25fb..6716b74 100644
>> --- a/libavcodec/dnxhdenc.c
>> +++ b/libavcodec/dnxhdenc.c
>> @@ -23,6 +23,8 @@
>>   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
>> 02110-1301 USA
>>   */
>>
>> +#define ASSERT_LEVEL 10
>>
>
> Debug code?

Yes, will remove.

>
>
>> +
>>  #include "libavutil/attributes.h"
>>  #include "libavutil/internal.h"
>>  #include "libavutil/opt.h"
>> @@ -112,6 +114,37 @@ void dnxhd_10bit_get_pixels_8x4_sym(int16_t
>> *av_restrict block,
>>      memcpy(block + 4 * 8, pixels + 3 * line_size, 8 * sizeof(*block));
>>  }
>>
>> +static int dnxhd_10bit_dct_quantize_444(MpegEncContext *ctx, int16_t
>> *block,
>> +                                        int n, int qscale, int *overflow)
>> +{
>> +    const uint8_t *scantable= ctx->intra_scantable.scantable;
>> +    const int *qmat = n<4 ? ctx->q_intra_matrix[qscale] :
>> ctx->q_chroma_intra_matrix[qscale];
>> +    int last_non_zero = 0;
>> +    int i;
>> +
>> +    ctx->fdsp.fdct(block);
>> +
>> +    // Divide by 4 with rounding, to compensate scaling of DCT
>> coefficients
>> +    block[0] = (block[0] + 2) >> 2;
>> +
>> +    for (i = 1; i < 64; ++i) {
>> +        int j = scantable[i];
>> +        int sign = FF_SIGNBIT(block[j]);
>> +        int level = (block[j] ^ sign) - sign;
>>
>
> Wait, what? This just makes level == block[j].
>
>
>> +        level = level * qmat[j] >> 16;
>> +        block[j] = (level ^ sign) - sign;
>>
>
> Don't use this to sign-ify something, compilers have long been smart enough
> to optimize sign * value.
>
> Just do
> block[j] = (block[j] * qmat[j] >> 16);
> Right shifting signed stuff is defined

I just copy pasted existing function and changed shift value :-)


More information about the ffmpeg-devel mailing list