diff mbox

[FFmpeg-devel] fixed luma quantizing when q >= MAX_STORED_Q

Message ID 20181227192806.8152-1-alex@mogurenko.com
State Accepted
Commit e4788ae31b2e9af45d11f4bf4498c075dcc25a6c
Headers show

Commit Message

Alex Mogurenko Dec. 27, 2018, 7:28 p.m. UTC
---
 libavcodec/proresenc_kostya.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

Comments

Derek Buitenhuis Dec. 28, 2018, 4:43 p.m. UTC | #1
On 27/12/2018 19:28, Alex Mogurenko wrote:
> ---
>  libavcodec/proresenc_kostya.c | 6 ++++--
>  1 file changed, 4 insertions(+), 2 deletions(-)

Can you give a little more detail about what's changed and why,
in the commit message?

It looks like custom_chroma_q is zero initialized and never set to anything?

- Derek
Alex Mogurenko Dec. 28, 2018, 5:04 p.m. UTC | #2
problem occurs in slice quant estimation and slice encoding.

if slice quant >= MAX_STORED_Q we dont use pre-calculated quant matrices
but generate new:

qmat = ctx->custom_q;

        qmat_chroma = ctx->custom_q;

        for (i = 0; i < 64; i++) {

            qmat[i] = ctx->quant_mat[i] * quant;

            qmat_chroma[i] = ctx->quant_chroma_mat[i] * quant;

        }


as you see both qmat and qmat_chroma both point to same ctx -> custom_q

as result they will contain chroma qunatizers as


qmat_chroma[i] = ctx->quant_chroma_mat[i] * quant;


last in loop, after all we pass qmat/qmat_chroma to function where we
estimate encoded slice size or encode slice:

estimate_slice_plane / encode_slice_plane


I will make new patch with detailed description


пт, 28 дек. 2018 г. в 18:43, Derek Buitenhuis <derek.buitenhuis@gmail.com>:

> On 27/12/2018 19:28, Alex Mogurenko wrote:
> > ---
> >  libavcodec/proresenc_kostya.c | 6 ++++--
> >  1 file changed, 4 insertions(+), 2 deletions(-)
>
> Can you give a little more detail about what's changed and why,
> in the commit message?
>
> It looks like custom_chroma_q is zero initialized and never set to
> anything?
>
> - Derek
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
Derek Buitenhuis Dec. 28, 2018, 5:30 p.m. UTC | #3
On 28/12/2018 17:04, Alex Mogurenko wrote:
> problem occurs in slice quant estimation and slice encoding.
> 
> if slice quant >= MAX_STORED_Q we dont use pre-calculated quant matrices
> but generate new:
> 
> qmat = ctx->custom_q;
> 
>         qmat_chroma = ctx->custom_q;
> 
>         for (i = 0; i < 64; i++) {
> 
>             qmat[i] = ctx->quant_mat[i] * quant;
> 
>             qmat_chroma[i] = ctx->quant_chroma_mat[i] * quant;
> 
>         }
> 
> 
> as you see both qmat and qmat_chroma both point to same ctx -> custom_q
> 
> as result they will contain chroma qunatizers as
> 
> 
> qmat_chroma[i] = ctx->quant_chroma_mat[i] * quant;
> 
> 
> last in loop, after all we pass qmat/qmat_chroma to function where we
> estimate encoded slice size or encode slice:
> 
> estimate_slice_plane / encode_slice_plane
> 
> 
> I will make new patch with detailed description
> 

Thanks, this makes sense, I missed that the fact it was setting it in the loop.

- Derek
diff mbox

Patch

diff --git a/libavcodec/proresenc_kostya.c b/libavcodec/proresenc_kostya.c
index 9a77d24fb6..e045a972f1 100644
--- a/libavcodec/proresenc_kostya.c
+++ b/libavcodec/proresenc_kostya.c
@@ -222,6 +222,7 @@  typedef struct ProresThreadData {
     DECLARE_ALIGNED(16, int16_t, blocks)[MAX_PLANES][64 * 4 * MAX_MBS_PER_SLICE];
     DECLARE_ALIGNED(16, uint16_t, emu_buf)[16 * 16];
     int16_t custom_q[64];
+    int16_t custom_chroma_q[64];
     struct TrellisNode *nodes;
 } ProresThreadData;
 
@@ -232,6 +233,7 @@  typedef struct ProresContext {
     int16_t quants[MAX_STORED_Q][64];
     int16_t quants_chroma[MAX_STORED_Q][64];
     int16_t custom_q[64];
+    int16_t custom_chroma_q[64];
     const uint8_t *quant_mat;
     const uint8_t *quant_chroma_mat;
     const uint8_t *scantable;
@@ -574,7 +576,7 @@  static int encode_slice(AVCodecContext *avctx, const AVFrame *pic,
         qmat_chroma = ctx->quants_chroma[quant];
     } else {
         qmat = ctx->custom_q;
-        qmat_chroma = ctx->custom_q;
+        qmat_chroma = ctx->custom_chroma_q;
         for (i = 0; i < 64; i++) {
             qmat[i] = ctx->quant_mat[i] * quant;
             qmat_chroma[i] = ctx->quant_chroma_mat[i] * quant;
@@ -902,7 +904,7 @@  static int find_slice_quant(AVCodecContext *avctx,
                 qmat_chroma = ctx->quants_chroma[q];
             } else {
                 qmat = td->custom_q;
-                qmat_chroma = td->custom_q;
+                qmat_chroma = td->custom_chroma_q;
                 for (i = 0; i < 64; i++) {
                     qmat[i] = ctx->quant_mat[i] * q;
                     qmat_chroma[i] = ctx->quant_chroma_mat[i] * q;