[FFmpeg-devel] [RFC PATCH 4/4] libavcodec/j2kenc: Support for multiple layers

Moritz Barsnick barsnick at gmx.net
Thu Aug 20 13:06:25 EEST 2020


On Wed, Aug 19, 2020 at 17:51:02 +0530, gautamramk at gmail.com wrote:

Minor nits:

> +static void compute_rates(Jpeg2000EncoderContext* s)
> +{
> +    int i, j;
> +    int layno, compno;
> +    for (i = 0; i < s->numYtiles; i++) {
> +        for (j = 0; j < s->numXtiles; j++) {
> +            Jpeg2000Tile *tile = &s->tile[s->numXtiles * i + j];
> +            for (compno = 0; compno < s->ncomponents; compno++) {
> +                int tilew = tile->comp[compno].coord[0][1] - tile->comp[compno].coord[0][0];
> +                int tileh = tile->comp[compno].coord[1][1] - tile->comp[compno].coord[1][0];
> +                int scale = (compno?1 << s->chroma_shift[0]:1) * (compno?1 << s->chroma_shift[1]:1);
> +                for (layno = 0; layno < s->nlayers; layno++) {
> +                    if (s->layer_rates[layno] > 0.0f) {

Isn't this left hand an array of ints? Why compare an int against a
float? (And even if it were a double: Why compare a double against a
float?)

> +                        tile->layer_rates[layno] = 0.0f;

This left hand is a double. Why assign an explicit float, which the
compiler (or preprocessor?) needs to convert back to double? (I.e. just
"0.0", that's double.)

> +        for (bandno = 0; bandno < rlevel->nbands; bandno++){

Missing space before bracket.

> +            &&  rlevel->band[bandno].coord[1][0] < rlevel->band[bandno].coord[1][1]){

Missing space before bracket.

 +        Jpeg2000Band *band = rlevel->band + bandno;

Couldn't this also be "= rlevel->band[bandno]", as above?

> +                if (layno == nlayers - 1 && cblk->layers->cum_passes){

Missing space before bracket.

> +                if (cblk->layers[layno].npasses){

Missing space before bracket.

>      // lay-rlevel-comp-pos progression
> -    switch (s->prog) {
> +        switch (s->prog) {
>      case JPEG2000_PGOD_LRCP:

Stray incorrect indentation change.

> +                    if ((ret = encode_packet(s, reslevel, layno, precno, qntsty->expn + (reslevelno ? 3*reslevelno-2 : 0),
> +                                qntsty->nguardbits, packetno++, nlayers)) < 0)

Peculiar indentation, and consider shorting the first line even more.

> +                for (precno = 0; precno < reslevel->num_precincts_x * reslevel->num_precincts_y; precno++){
> +                    if ((ret = encode_packet(s, reslevel, layno, precno, qntsty->expn + (reslevelno ? 3*reslevelno-2 : 0),
> +                                qntsty->nguardbits, packetno++, nlayers)) < 0)

Ditto.

> +                    for (layno = 0; layno < nlayers; layno++){
> +                        if ((ret = encode_packet(s, reslevel, layno, precno, qntsty->expn + (reslevelno ? 3*reslevelno-2 : 0),
> +                                qntsty->nguardbits, packetno++, nlayers)) < 0)

Ditto.

> +                        for (layno = 0; layno < nlayers; layno++){
> +                            if ((ret = encode_packet(s, reslevel, layno, precno, qntsty->expn + (reslevelno ? 3*reslevelno-2 : 0),
> +                                    qntsty->nguardbits, packetno++, nlayers)) < 0)

Ditto.
Also missing space before bracket.
Also please use whitespace around operators.

(This functionality seems repetetive, perhaps this can be refactored?
Just wondering.)

> +                        for (layno = 0; layno < nlayers; layno++){
> +                            if ((ret = encode_packet(s, reslevel, layno, precno, qntsty->expn + (reslevelno ? 3*reslevelno-2 : 0),
> +                                    qntsty->nguardbits, packetno++, nlayers)) < 0)

Again. ;)

> +                                if (n == 0) {
> +                                    dr = pass->rate;
> +                                    dd = (double)pass->disto;

Redundant typecast from int32_t to double.

> +                                } else {
> +                                    dr = pass->rate - cblk->passes[n - 1].rate;
> +                                    dd = (double)pass->disto - (double)cblk->passes[n-1].disto;

Are you casting these ints to double before subtracting them? why not
afterwards (and make the typecast implicit again on assignment)?

> +                                if (!dr) {
> +                                    if (dd) {
> +                                        n = passno + 1;

You're comparing a double against 0.0, in this case it might be
appropriate to make this explicit.

> +                                dr = (int32_t)pass->rate;
> +                                dd = (double)pass->disto;
> +                            } else {
> +                                dr = (int32_t)(pass->rate) - cblk->passes[passno - 1].rate;
> +                                dd = (double)pass->disto - (double)cblk->passes[passno - 1].disto;

Ditto.

> +        double lo = min;
> +        double hi = max;
> +        double stable_thresh = 0;
> +        double good_thresh = 0;

Cosmetic: 0.0

> +            good_thresh = -1;

Cosmetic: -1.0 (but I think I see your intent of marking this as
invalid, right?).

> +        if (good_thresh >= 0)

Cosmetic: 0.0

> +            good_thresh = stable_thresh == 0 ? thresh : stable_thresh;

Cosmetic: 0.0

> +            s->layer_rates[0] = rate <= 1 ? 0:rate;

Use whitespace to separate operators (also ':').

> +            s->layer_rates[nlayers] = rate <= 1 ? 0:rate;

Ditto.

> +    if (parse_layer_rates(s)) {
> +        av_log(s, AV_LOG_WARNING, "Layer rates invalid. Shall encode with 1 layer.\n");

I suggest "Encoding with" instead of "Shall encode with". Not important
though.

> +    { "layer_rates",   "Layer Rates",       OFFSET(lr_str),        AV_OPT_TYPE_STRING, { .str = NULL }, 0, 0, VE },

I'm not happy with the capitalization, but that's what the rest uses,
so *sigh*.

Cheers,
Moritz


More information about the ffmpeg-devel mailing list