This is an automated email from the git hooks/post-receive script. Git pushed a commit to branch master in repository ffmpeg.
commit 14602cd9999a9f0296bfb341a6d4402755abe864 Author: Ramiro Polla <[email protected]> AuthorDate: Thu Sep 25 17:49:36 2025 +0200 Commit: Ramiro Polla <[email protected]> CommitDate: Fri Feb 20 16:32:10 2026 +0100 avcodec/mjpegdec: move SOS header fields to MJpegDecodeContext Use naming for SOS header fields from ISO/IEC 10918-1's non-lossless mode of operation in ff_mjpeg_decode_sos() instead of mixing JPEG-LS and lossless names. Each decode function still keeps its correct name for each field. --- libavcodec/jpeglsdec.c | 6 ++- libavcodec/jpeglsdec.h | 3 +- libavcodec/mjpegdec.c | 113 +++++++++++++++++++++++++------------------------ libavcodec/mjpegdec.h | 7 +++ 4 files changed, 70 insertions(+), 59 deletions(-) diff --git a/libavcodec/jpeglsdec.c b/libavcodec/jpeglsdec.c index 3c899568ec..d481221f2b 100644 --- a/libavcodec/jpeglsdec.c +++ b/libavcodec/jpeglsdec.c @@ -352,9 +352,11 @@ static inline int ls_decode_line(JLSState *state, MJpegDecodeContext *s, return 0; } -int ff_jpegls_decode_picture(MJpegDecodeContext *s, int near, - int point_transform, int ilv) +int ff_jpegls_decode_picture(MJpegDecodeContext *s) { + int near = s->Ss; + int point_transform = s->Al; + int ilv = s->Se; int i, t = 0; uint8_t *zero, *last, *cur; JLSState *state = s->jls_state; diff --git a/libavcodec/jpeglsdec.h b/libavcodec/jpeglsdec.h index 0cafaba7a4..0b5ee2d488 100644 --- a/libavcodec/jpeglsdec.h +++ b/libavcodec/jpeglsdec.h @@ -36,7 +36,6 @@ */ int ff_jpegls_decode_lse(MJpegDecodeContext *s); -int ff_jpegls_decode_picture(MJpegDecodeContext *s, int near, - int point_transform, int ilv); +int ff_jpegls_decode_picture(MJpegDecodeContext *s); #endif /* AVCODEC_JPEGLSDEC_H */ diff --git a/libavcodec/mjpegdec.c b/libavcodec/mjpegdec.c index a8ce15ddb0..f2a097093d 100644 --- a/libavcodec/mjpegdec.c +++ b/libavcodec/mjpegdec.c @@ -914,7 +914,7 @@ static int decode_dc_progressive(MJpegDecodeContext *s, int16_t *block, static int decode_block_progressive(MJpegDecodeContext *s, int16_t *block, uint8_t *last_nnz, int ac_index, uint16_t *quant_matrix, - int ss, int se, int Al, int *EOBRUN) + int Ss, int Se, int Al, int *EOBRUN) { int code, i, j, val, run; unsigned level; @@ -926,7 +926,7 @@ static int decode_block_progressive(MJpegDecodeContext *s, int16_t *block, { OPEN_READER(re, &s->gb); - for (i = ss; ; i++) { + for (i = Ss; ; i++) { UPDATE_CACHE(re, &s->gb); GET_VLC(code, re, &s->gb, s->vlcs[2][ac_index].table, 9, 2); @@ -943,10 +943,10 @@ static int decode_block_progressive(MJpegDecodeContext *s, int16_t *block, LAST_SKIP_BITS(re, &s->gb, code); - if (i >= se) { - if (i == se) { - j = s->permutated_scantable[se]; - block[j] = level * (quant_matrix[se] << Al); + if (i >= Se) { + if (i == Se) { + j = s->permutated_scantable[Se]; + block[j] = level * (quant_matrix[Se] << Al); break; } av_log(s->avctx, AV_LOG_ERROR, "error count: %d\n", i); @@ -957,7 +957,7 @@ static int decode_block_progressive(MJpegDecodeContext *s, int16_t *block, } else { if (run == 0xF) {// ZRL - skip 15 coefficients i += 15; - if (i >= se) { + if (i >= Se) { av_log(s->avctx, AV_LOG_ERROR, "ZRL overflow: %d\n", i); return AVERROR_INVALIDDATA; } @@ -995,7 +995,7 @@ static int decode_block_progressive(MJpegDecodeContext *s, int16_t *block, for (; ; i++) { \ if (i > last) { \ i += run; \ - if (i > se) { \ + if (i > Se) { \ av_log(s->avctx, AV_LOG_ERROR, "error count: %d\n", i); \ return -1; \ } \ @@ -1012,10 +1012,10 @@ for (; ; i++) { \ static int decode_block_refinement(MJpegDecodeContext *s, int16_t *block, uint8_t *last_nnz, int ac_index, uint16_t *quant_matrix, - int ss, int se, int Al, int *EOBRUN) + int Ss, int Se, int Al, int *EOBRUN) { - int code, i = ss, j, sign, val, run; - int last = FFMIN(se, *last_nnz); + int code, i = Ss, j, sign, val, run; + int last = FFMIN(Se, *last_nnz); OPEN_READER(re, &s->gb); if (*EOBRUN) { @@ -1033,7 +1033,7 @@ static int decode_block_refinement(MJpegDecodeContext *s, int16_t *block, j = s->permutated_scantable[i]; val--; block[j] = ((quant_matrix[i] << Al) ^ val) - val; - if (i == se) { + if (i == Se) { if (i > *last_nnz) *last_nnz = i; CLOSE_READER(re, &s->gb); @@ -1109,8 +1109,11 @@ static int handle_rstn(MJpegDecodeContext *s, int nb_components) } /* Handles 1 to 4 components */ -static int ljpeg_decode_rgb_scan(MJpegDecodeContext *s, int nb_components, int predictor, int point_transform) +static int ljpeg_decode_rgb_scan(MJpegDecodeContext *s) { + int nb_components = s->nb_components_sos; + int predictor = s->Ss; + int point_transform = s->Al; int i, mb_x, mb_y; unsigned width; uint16_t (*buffer)[4]; @@ -1282,9 +1285,11 @@ static int ljpeg_decode_rgb_scan(MJpegDecodeContext *s, int nb_components, int p return 0; } -static int ljpeg_decode_yuv_scan(MJpegDecodeContext *s, int predictor, - int point_transform, int nb_components) +static int ljpeg_decode_yuv_scan(MJpegDecodeContext *s) { + int predictor = s->Ss; + int point_transform = s->Al; + int nb_components = s->nb_components_sos; int i, mb_x, mb_y, mask; int bits= (s->bits+7)&~7; int resync_mb_y = 0; @@ -1470,11 +1475,14 @@ static void shift_output(MJpegDecodeContext *s, uint8_t *ptr, int linesize) } } -static int mjpeg_decode_scan(MJpegDecodeContext *s, int nb_components, int Ah, - int Al, const uint8_t *mb_bitmask, +static int mjpeg_decode_scan(MJpegDecodeContext *s, + const uint8_t *mb_bitmask, int mb_bitmask_size, const AVFrame *reference) { + int nb_components = s->nb_components_sos; + int Ah = s->Ah; + int Al = s->Al; int i, mb_x, mb_y, chroma_h_shift, chroma_v_shift, chroma_width, chroma_height; uint8_t *data[MAX_COMPONENTS]; const uint8_t *reference_data[MAX_COMPONENTS]; @@ -1611,23 +1619,26 @@ next_field: return 0; } -static int mjpeg_decode_scan_progressive_ac(MJpegDecodeContext *s, int ss, - int se, int Ah, int Al) +static int mjpeg_decode_scan_progressive_ac(MJpegDecodeContext *s) { + int Ss = s->Ss; + int Se = s->Se; + int Ah = s->Ah; + int Al = s->Al; int mb_x, mb_y; int EOBRUN = 0; int c = s->comp_index[0]; uint16_t *quant_matrix = s->quant_matrixes[s->quant_sindex[0]]; - av_assert0(ss>=0 && Ah>=0 && Al>=0); - if (se < ss || se > 63) { - av_log(s->avctx, AV_LOG_ERROR, "SS/SE %d/%d is invalid\n", ss, se); + av_assert0(Ss>=0 && Ah>=0 && Al>=0); + if (Se < Ss || Se > 63) { + av_log(s->avctx, AV_LOG_ERROR, "SS/SE %d/%d is invalid\n", Ss, Se); return AVERROR_INVALIDDATA; } // s->coefs_finished is a bitmask for coefficients coded - // ss and se are parameters telling start and end coefficients - s->coefs_finished[c] |= (2ULL << se) - (1ULL << ss); + // Ss and Se are parameters telling start and end coefficients + s->coefs_finished[c] |= (2ULL << Se) - (1ULL << Ss); s->restart_count = 0; @@ -1642,10 +1653,10 @@ static int mjpeg_decode_scan_progressive_ac(MJpegDecodeContext *s, int ss, if (Ah) ret = decode_block_refinement(s, *block, last_nnz, s->ac_index[0], - quant_matrix, ss, se, Al, &EOBRUN); + quant_matrix, Ss, Se, Al, &EOBRUN); else ret = decode_block_progressive(s, *block, last_nnz, s->ac_index[0], - quant_matrix, ss, se, Al, &EOBRUN); + quant_matrix, Ss, Se, Al, &EOBRUN); if (ret >= 0 && get_bits_left(&s->gb) < 0) ret = AVERROR_INVALIDDATA; @@ -1700,10 +1711,9 @@ static void mjpeg_idct_scan_progressive_ac(MJpegDecodeContext *s) int ff_mjpeg_decode_sos(MJpegDecodeContext *s, const uint8_t *mb_bitmask, int mb_bitmask_size, const AVFrame *reference) { - int len, nb_components, i, h, v, predictor, point_transform; + int len, i, h, v; int index, id, ret; const int block_size = s->lossless ? 1 : 8; - int ilv, prev_shift; if (!s->got_picture) { av_log(s->avctx, AV_LOG_WARNING, @@ -1716,18 +1726,18 @@ int ff_mjpeg_decode_sos(MJpegDecodeContext *s, const uint8_t *mb_bitmask, return ret; if (len < 1) return AVERROR_INVALIDDATA; - nb_components = bytestream2_get_byteu(&s->gB); - if (nb_components == 0 || nb_components > MAX_COMPONENTS) { + s->nb_components_sos = bytestream2_get_byteu(&s->gB); + if (s->nb_components_sos == 0 || s->nb_components_sos > MAX_COMPONENTS) { avpriv_report_missing_feature(s->avctx, "decode_sos: nb_components (%d)", - nb_components); + s->nb_components_sos); return AVERROR_PATCHWELCOME; } - if (len != 4 + 2 * nb_components) { - av_log(s->avctx, AV_LOG_ERROR, "decode_sos: len(%d) mismatch %d components\n", len, nb_components); + if (len != 4 + 2 * s->nb_components_sos) { + av_log(s->avctx, AV_LOG_ERROR, "decode_sos: len(%d) mismatch %d components\n", len, s->nb_components_sos); return AVERROR_INVALIDDATA; } - for (i = 0; i < nb_components; i++) { + for (i = 0; i < s->nb_components_sos; i++) { id = bytestream2_get_byteu(&s->gB); av_log(s->avctx, AV_LOG_DEBUG, "component: %d\n", id); /* find component index */ @@ -1741,7 +1751,7 @@ int ff_mjpeg_decode_sos(MJpegDecodeContext *s, const uint8_t *mb_bitmask, } /* Metasoft MJPEG codec has Cb and Cr swapped */ if (s->avctx->codec_tag == MKTAG('M', 'T', 'S', 'J') - && nb_components == 3 && s->nb_components == 3 && i) + && s->nb_components_sos == 3 && s->nb_components == 3 && i) index = 3 - i; s->quant_sindex[i] = s->quant_index[index]; @@ -1762,13 +1772,13 @@ int ff_mjpeg_decode_sos(MJpegDecodeContext *s, const uint8_t *mb_bitmask, goto out_of_range; } - predictor = bytestream2_get_byteu(&s->gB); /* JPEG Ss / lossless JPEG predictor / JPEG-LS NEAR */ - ilv = bytestream2_get_byteu(&s->gB); /* JPEG Se / JPEG-LS ILV */ + s->Ss = bytestream2_get_byteu(&s->gB); /* JPEG Ss / lossless JPEG predictor / JPEG-LS NEAR */ + s->Se = bytestream2_get_byteu(&s->gB); /* JPEG Se / JPEG-LS ILV */ uint8_t b = bytestream2_get_byteu(&s->gB); - prev_shift = b >> 4; /* Ah */ - point_transform = b & 0x0F; /* Al */ + s->Ah = b >> 4; /* Ah */ + s->Al = b & 0x0F; /* Al */ - if (nb_components > 1) { + if (s->nb_components_sos > 1) { /* interleaved stream */ s->mb_width = (s->width + s->h_max * block_size - 1) / (s->h_max * block_size); s->mb_height = (s->height + s->v_max * block_size - 1) / (s->v_max * block_size); @@ -1785,8 +1795,8 @@ int ff_mjpeg_decode_sos(MJpegDecodeContext *s, const uint8_t *mb_bitmask, if (s->avctx->debug & FF_DEBUG_PICT_INFO) av_log(s->avctx, AV_LOG_DEBUG, "%s %s p:%d >>:%d ilv:%d bits:%d skip:%d %s comp:%d\n", s->lossless ? "lossless" : "sequential DCT", s->rgb ? "RGB" : "", - predictor, point_transform, ilv, s->bits, s->mjpb_skiptosod, - s->pegasus_rct ? "PRCT" : (s->rct ? "RCT" : ""), nb_components); + s->Ss, s->Al, s->Se, s->bits, s->mjpb_skiptosod, + s->pegasus_rct ? "PRCT" : (s->rct ? "RCT" : ""), s->nb_components_sos); /* mjpeg-b can have padding bytes between sos and image data, skip them */ @@ -1807,31 +1817,24 @@ int ff_mjpeg_decode_sos(MJpegDecodeContext *s, const uint8_t *mb_bitmask, } else if (s->lossless) { av_assert0(s->picture_ptr == s->picture); if (CONFIG_JPEGLS_DECODER && s->ls) { - if ((ret = ff_jpegls_decode_picture(s, predictor, - point_transform, ilv)) < 0) + if ((ret = ff_jpegls_decode_picture(s)) < 0) return ret; } else { if (s->rgb || s->bayer) { - if ((ret = ljpeg_decode_rgb_scan(s, nb_components, predictor, point_transform)) < 0) + if ((ret = ljpeg_decode_rgb_scan(s)) < 0) return ret; } else { - if ((ret = ljpeg_decode_yuv_scan(s, predictor, - point_transform, - nb_components)) < 0) + if ((ret = ljpeg_decode_yuv_scan(s)) < 0) return ret; } } } else { - if (s->progressive && predictor) { + if (s->progressive && s->Ss) { av_assert0(s->picture_ptr == s->picture); - if ((ret = mjpeg_decode_scan_progressive_ac(s, predictor, - ilv, prev_shift, - point_transform)) < 0) + if ((ret = mjpeg_decode_scan_progressive_ac(s)) < 0) return ret; } else { - if ((ret = mjpeg_decode_scan(s, nb_components, - prev_shift, point_transform, - mb_bitmask, mb_bitmask_size, reference)) < 0) + if ((ret = mjpeg_decode_scan(s, mb_bitmask, mb_bitmask_size, reference)) < 0) return ret; } } diff --git a/libavcodec/mjpegdec.h b/libavcodec/mjpegdec.h index fdd1848d96..b5520522f9 100644 --- a/libavcodec/mjpegdec.h +++ b/libavcodec/mjpegdec.h @@ -85,6 +85,13 @@ typedef struct MJpegDecodeContext { int xfrm; int adobe_transform; + /* SOS fields */ + int nb_components_sos; + int Ss; + int Se; + int Ah; + int Al; + int maxval; int near; ///< near lossless bound (si 0 for lossless) int t1,t2,t3; _______________________________________________ ffmpeg-cvslog mailing list -- [email protected] To unsubscribe send an email to [email protected]
