[FFmpeg-devel] [RFC PATCH v3 2/5] libavcodec/j2kenc: Fix tag tree coding
Gautam Ramakrishnan
gautamramk at gmail.com
Tue Aug 25 06:37:18 EEST 2020
On Tue, Aug 25, 2020 at 4:08 AM Michael Niedermayer
<michael at niedermayer.cc> wrote:
>
> On Mon, Aug 24, 2020 at 11:10:31PM +0530, gautamramk at gmail.com wrote:
> > From: Gautam Ramakrishnan <gautamramk at gmail.com>
> >
> > The implementation of tag tree encoding was incorrect.
> > However, this error was not visible as the current j2k
> > encoder encodes only 1 layer.
> > This patch fixes tag tree coding for JPEG2000 such tag
> > tree coding would work for multi layer encoding.
> > ---
> > libavcodec/j2kenc.c | 41 ++++++++++++++++++++++++-----------------
> > libavcodec/jpeg2000.c | 1 +
> > libavcodec/jpeg2000.h | 1 +
> > 3 files changed, 26 insertions(+), 17 deletions(-)
> >
> > diff --git a/libavcodec/j2kenc.c b/libavcodec/j2kenc.c
> > index 16863f8e8c..d9777fe07f 100644
> > --- a/libavcodec/j2kenc.c
> > +++ b/libavcodec/j2kenc.c
> > @@ -242,27 +242,34 @@ static void j2k_flush(Jpeg2000EncoderContext *s)
> > static void tag_tree_code(Jpeg2000EncoderContext *s, Jpeg2000TgtNode *node, int threshold)
> > {
> > Jpeg2000TgtNode *stack[30];
> > - int sp = 1, curval = 0;
> > - stack[0] = node;
> > + int sp = -1, curval = 0;
> >
> > - node = node->parent;
> > - while(node){
> > - if (node->vis){
> > - curval = node->val;
> > - break;
> > - }
> > - node->vis++;
> > - stack[sp++] = node;
> > + while(node->parent){
> > + stack[++sp] = node;
> > node = node->parent;
> > }
> > - while(--sp >= 0){
> > - if (stack[sp]->val >= threshold){
> > - put_bits(s, 0, threshold - curval);
> > - break;
> > +
> > + while (1) {
> > + if (curval > node->temp_val)
> > + node->temp_val = curval;
> > + else {
> > + curval = node->temp_val;
> > }
> > - put_bits(s, 0, stack[sp]->val - curval);
> > - put_bits(s, 1, 1);
> > - curval = stack[sp]->val;
> > + while (curval < threshold) {
> > + if (curval >= node->val) {
> > + if (!node->vis) {
> > + node->vis = 1;
> > + put_bits(s, 1, 1);
> > + }
> > + break;
> > + }
> > + put_bits(s, 0, 1);
> > + curval++;
> > + }
>
> why is the put_bits(s, 0, stack[sp]->val - curval);
> changed into 1 bit at a time calls ?
> a single call should still work with the modified loop
> a single call may be faster ...
My bad, I oversimplified the implementation as it was hard to debug.
Now since I am sure its correct, i'll remove the loop.
>
> thx
>
> [...]
> --
> Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
>
> Dictatorship naturally arises out of democracy, and the most aggravated
> form of tyranny and slavery out of the most extreme liberty. -- Plato
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe".
--
-------------
Gautam |
More information about the ffmpeg-devel
mailing list