diff options
author | Hendrik Leppkes <h.leppkes@gmail.com> | 2015-09-16 12:00:53 +0200 |
---|---|---|
committer | Hendrik Leppkes <h.leppkes@gmail.com> | 2015-09-16 12:08:39 +0200 |
commit | 64f72bb61f0f341698c75231ff7deaa2be3853b2 (patch) | |
tree | f3ee27c342127f7e1e776d26467b82ee17e4d6ac /libavcodec/jpeg2000dec.c | |
parent | dc1050a3e8557fc423023036f698cc476fb675b4 (diff) | |
parent | 29b00f880faa404aa1d0d6820310c510c5996479 (diff) | |
download | ffmpeg-64f72bb61f0f341698c75231ff7deaa2be3853b2.tar.gz |
Merge commit '29b00f880faa404aa1d0d6820310c510c5996479'
* commit '29b00f880faa404aa1d0d6820310c510c5996479':
jpeg2000: Templatize the frame writer
Merged-by: Hendrik Leppkes <h.leppkes@gmail.com>
Diffstat (limited to 'libavcodec/jpeg2000dec.c')
-rw-r--r-- | libavcodec/jpeg2000dec.c | 162 |
1 files changed, 66 insertions, 96 deletions
diff --git a/libavcodec/jpeg2000dec.c b/libavcodec/jpeg2000dec.c index 81e8a055e7..f2441a92ac 100644 --- a/libavcodec/jpeg2000dec.c +++ b/libavcodec/jpeg2000dec.c @@ -1616,7 +1616,7 @@ static inline void mct_decode(Jpeg2000DecoderContext *s, Jpeg2000Tile *tile) s->dsp.mct_decode[tile->codsty[0].transform](src[0], src[1], src[2], csize); } -static void tile_codeblocks(Jpeg2000DecoderContext *s, Jpeg2000Tile *tile) +static inline void tile_codeblocks(Jpeg2000DecoderContext *s, Jpeg2000Tile *tile) { Jpeg2000T1Context t1; @@ -1679,17 +1679,72 @@ static void tile_codeblocks(Jpeg2000DecoderContext *s, Jpeg2000Tile *tile) } /*end comp */ } +#define WRITE_FRAME(D, PIXEL) \ + static inline void write_frame_ ## D(Jpeg2000DecoderContext * s, Jpeg2000Tile * tile, \ + AVFrame * picture, int precision) \ + { \ + const AVPixFmtDescriptor *pixdesc = av_pix_fmt_desc_get(s->avctx->pix_fmt); \ + int planar = !!(pixdesc->flags & AV_PIX_FMT_FLAG_PLANAR); \ + int pixelsize = planar ? 1 : pixdesc->nb_components; \ + \ + int compno; \ + int x, y; \ + \ + for (compno = 0; compno < s->ncomponents; compno++) { \ + Jpeg2000Component *comp = tile->comp + compno; \ + Jpeg2000CodingStyle *codsty = tile->codsty + compno; \ + PIXEL *line; \ + float *datap = comp->f_data; \ + int32_t *i_datap = comp->i_data; \ + int cbps = s->cbps[compno]; \ + int w = tile->comp[compno].coord[0][1] - s->image_offset_x; \ + int plane = 0; \ + \ + if (planar) \ + plane = s->cdef[compno] ? s->cdef[compno]-1 : (s->ncomponents-1); \ + \ + y = tile->comp[compno].coord[1][0] - s->image_offset_y / s->cdy[compno]; \ + line = (PIXEL *)picture->data[plane] + y * (picture->linesize[plane] / sizeof(PIXEL));\ + for (; y < tile->comp[compno].coord[1][1] - s->image_offset_y; y++) { \ + PIXEL *dst; \ + \ + x = tile->comp[compno].coord[0][0] - s->image_offset_x / s->cdx[compno]; \ + dst = line + x * pixelsize + compno*!planar; \ + \ + if (codsty->transform == FF_DWT97) { \ + for (; x < w; x++) { \ + int val = lrintf(*datap) + (1 << (cbps - 1)); \ + /* DC level shift and clip see ISO 15444-1:2002 G.1.2 */ \ + val = av_clip(val, 0, (1 << cbps) - 1); \ + *dst = val << (precision - cbps); \ + datap++; \ + dst += pixelsize; \ + } \ + } else { \ + for (; x < w; x++) { \ + int val = *i_datap + (1 << (cbps - 1)); \ + /* DC level shift and clip see ISO 15444-1:2002 G.1.2 */ \ + val = av_clip(val, 0, (1 << cbps) - 1); \ + *dst = val << (precision - cbps); \ + i_datap++; \ + dst += pixelsize; \ + } \ + } \ + line += picture->linesize[plane] / sizeof(PIXEL); \ + } \ + } \ + \ + } + +WRITE_FRAME(8, uint8_t) +WRITE_FRAME(16, uint16_t) + +#undef WRITE_FRAME + static int jpeg2000_decode_tile(Jpeg2000DecoderContext *s, Jpeg2000Tile *tile, AVFrame *picture) { - const AVPixFmtDescriptor *pixdesc = av_pix_fmt_desc_get(s->avctx->pix_fmt); - int planar = !!(pixdesc->flags & AV_PIX_FMT_FLAG_PLANAR); - int pixelsize = planar ? 1 : pixdesc->nb_components; - - int compno; - int x, y; - - uint8_t *line; + int x; tile_codeblocks(s, tile); @@ -1705,99 +1760,14 @@ static int jpeg2000_decode_tile(Jpeg2000DecoderContext *s, Jpeg2000Tile *tile, } if (s->precision <= 8) { - for (compno = 0; compno < s->ncomponents; compno++) { - Jpeg2000Component *comp = tile->comp + compno; - Jpeg2000CodingStyle *codsty = tile->codsty + compno; - float *datap = comp->f_data; - int32_t *i_datap = comp->i_data; - int cbps = s->cbps[compno]; - int w = tile->comp[compno].coord[0][1] - s->image_offset_x; - int plane = 0; - - if (planar) - plane = s->cdef[compno] ? s->cdef[compno]-1 : (s->ncomponents-1); - - - y = tile->comp[compno].coord[1][0] - s->image_offset_y / s->cdy[compno]; - line = picture->data[plane] + y * picture->linesize[plane]; - for (; y < tile->comp[compno].coord[1][1] - s->image_offset_y; y ++) { - uint8_t *dst; - - x = tile->comp[compno].coord[0][0] - s->image_offset_x / s->cdx[compno]; - dst = line + x * pixelsize + compno*!planar; - - if (codsty->transform == FF_DWT97) { - for (; x < w; x ++) { - int val = lrintf(*datap) + (1 << (cbps - 1)); - /* DC level shift and clip see ISO 15444-1:2002 G.1.2 */ - val = av_clip(val, 0, (1 << cbps) - 1); - *dst = val << (8 - cbps); - datap++; - dst += pixelsize; - } - } else { - for (; x < w; x ++) { - int val = *i_datap + (1 << (cbps - 1)); - /* DC level shift and clip see ISO 15444-1:2002 G.1.2 */ - val = av_clip(val, 0, (1 << cbps) - 1); - *dst = val << (8 - cbps); - i_datap++; - dst += pixelsize; - } - } - line += picture->linesize[plane]; - } - } + write_frame_8(s, tile, picture, 8); } else { int precision = picture->format == AV_PIX_FMT_XYZ12 || picture->format == AV_PIX_FMT_RGB48 || picture->format == AV_PIX_FMT_RGBA64 || picture->format == AV_PIX_FMT_GRAY16 ? 16 : s->precision; - for (compno = 0; compno < s->ncomponents; compno++) { - Jpeg2000Component *comp = tile->comp + compno; - Jpeg2000CodingStyle *codsty = tile->codsty + compno; - float *datap = comp->f_data; - int32_t *i_datap = comp->i_data; - uint16_t *linel; - int cbps = s->cbps[compno]; - int w = tile->comp[compno].coord[0][1] - s->image_offset_x; - int plane = 0; - - if (planar) - plane = s->cdef[compno] ? s->cdef[compno]-1 : (s->ncomponents-1); - - y = tile->comp[compno].coord[1][0] - s->image_offset_y / s->cdy[compno]; - linel = (uint16_t *)picture->data[plane] + y * (picture->linesize[plane] >> 1); - for (; y < tile->comp[compno].coord[1][1] - s->image_offset_y; y ++) { - uint16_t *dst; - - x = tile->comp[compno].coord[0][0] - s->image_offset_x / s->cdx[compno]; - dst = linel + (x * pixelsize + compno*!planar); - if (codsty->transform == FF_DWT97) { - for (; x < w; x ++) { - int val = lrintf(*datap) + (1 << (cbps - 1)); - /* DC level shift and clip see ISO 15444-1:2002 G.1.2 */ - val = av_clip(val, 0, (1 << cbps) - 1); - /* align 12 bit values in little-endian mode */ - *dst = val << (precision - cbps); - datap++; - dst += pixelsize; - } - } else { - for (; x < w; x ++) { - int val = *i_datap + (1 << (cbps - 1)); - /* DC level shift and clip see ISO 15444-1:2002 G.1.2 */ - val = av_clip(val, 0, (1 << cbps) - 1); - /* align 12 bit values in little-endian mode */ - *dst = val << (precision - cbps); - i_datap++; - dst += pixelsize; - } - } - linel += picture->linesize[plane] >> 1; - } - } + write_frame_16(s, tile, picture, precision); } return 0; |