This is an automated email from the git hooks/post-receive script. Git pushed a commit to branch master in repository ffmpeg.
commit 1debadd58ef7fd86cba34c998043a0ae5c15a880 Author: Ramiro Polla <[email protected]> AuthorDate: Fri Sep 12 19:01:42 2025 +0200 Commit: Ramiro Polla <[email protected]> CommitDate: Mon Jan 5 13:14:15 2026 +0000 avcodec/mjpegdec: use GetByteContext instead of GetBitContext where possible JPEG is mostly byte-aligned. We only really need GetBitContext while decoding the image data. Suggested-by: Andreas Rheinhardt <[email protected]> --- libavcodec/jpeglsdec.c | 20 +++--- libavcodec/mjpegbdec.c | 14 ++-- libavcodec/mjpegdec.c | 180 +++++++++++++++++++++++++------------------------ libavcodec/mjpegdec.h | 2 + libavcodec/mxpegdec.c | 8 +-- 5 files changed, 114 insertions(+), 110 deletions(-) diff --git a/libavcodec/jpeglsdec.c b/libavcodec/jpeglsdec.c index 6c4c6ad33c..154f1ed074 100644 --- a/libavcodec/jpeglsdec.c +++ b/libavcodec/jpeglsdec.c @@ -53,19 +53,19 @@ int ff_jpegls_decode_lse(MJpegDecodeContext *s) int id; int tid, wt, maxtab, i, j; - int len = get_bits(&s->gb, 16); - id = get_bits(&s->gb, 8); + int len = bytestream2_get_be16(&s->gB); + id = bytestream2_get_byte(&s->gB); switch (id) { case 1: if (len < 13) return AVERROR_INVALIDDATA; - s->maxval = get_bits(&s->gb, 16); - s->t1 = get_bits(&s->gb, 16); - s->t2 = get_bits(&s->gb, 16); - s->t3 = get_bits(&s->gb, 16); - s->reset = get_bits(&s->gb, 16); + s->maxval = bytestream2_get_be16u(&s->gB); + s->t1 = bytestream2_get_be16u(&s->gB); + s->t2 = bytestream2_get_be16u(&s->gB); + s->t3 = bytestream2_get_be16u(&s->gB); + s->reset = bytestream2_get_be16u(&s->gB); if (s->avctx->debug & FF_DEBUG_PICT_INFO) { av_log(s->avctx, AV_LOG_DEBUG, "Coding parameters maxval:%d T1:%d T2:%d T3:%d reset:%d\n", @@ -78,8 +78,8 @@ int ff_jpegls_decode_lse(MJpegDecodeContext *s) case 2: s->palette_index = 0; case 3: - tid= get_bits(&s->gb, 8); - wt = get_bits(&s->gb, 8); + tid= bytestream2_get_byte(&s->gB); + wt = bytestream2_get_byte(&s->gB); if (len < 5) return AVERROR_INVALIDDATA; @@ -129,7 +129,7 @@ int ff_jpegls_decode_lse(MJpegDecodeContext *s) uint8_t k = i << shift; pal[k] = wt < 4 ? 0xFF000000 : 0; for (j=0; j<wt; j++) { - pal[k] |= get_bits(&s->gb, 8) << (8*(wt-j-1)); + pal[k] |= bytestream2_get_byte(&s->gB) << (8*(wt-j-1)); } } s->palette_index = i; diff --git a/libavcodec/mjpegbdec.c b/libavcodec/mjpegbdec.c index 4db1d9a89d..79eed6eaa6 100644 --- a/libavcodec/mjpegbdec.c +++ b/libavcodec/mjpegbdec.c @@ -84,7 +84,7 @@ read_header: dqt_offs = read_offs(avctx, &hgb, buf_end - buf_ptr, "dqt is %d and size is %d\n"); av_log(avctx, AV_LOG_DEBUG, "dqt offs: 0x%"PRIx32"\n", dqt_offs); if (dqt_offs) { - init_get_bits(&s->gb, buf_ptr+dqt_offs, (buf_end - (buf_ptr+dqt_offs))*8); + bytestream2_init(&s->gB, buf_ptr+dqt_offs, buf_end - (buf_ptr+dqt_offs)); s->start_code = DQT; ret = ff_mjpeg_decode_dqt(s); if (ret < 0 && (avctx->err_recognition & AV_EF_EXPLODE)) @@ -94,7 +94,7 @@ read_header: dht_offs = read_offs(avctx, &hgb, buf_end - buf_ptr, "dht is %d and size is %d\n"); av_log(avctx, AV_LOG_DEBUG, "dht offs: 0x%"PRIx32"\n", dht_offs); if (dht_offs) { - init_get_bits(&s->gb, buf_ptr+dht_offs, (buf_end - (buf_ptr+dht_offs))*8); + bytestream2_init(&s->gB, buf_ptr+dht_offs, buf_end - (buf_ptr+dht_offs)); s->start_code = DHT; ff_mjpeg_decode_dht(s); } @@ -102,7 +102,7 @@ read_header: sof_offs = read_offs(avctx, &hgb, buf_end - buf_ptr, "sof is %d and size is %d\n"); av_log(avctx, AV_LOG_DEBUG, "sof offs: 0x%"PRIx32"\n", sof_offs); if (sof_offs) { - init_get_bits(&s->gb, buf_ptr+sof_offs, (buf_end - (buf_ptr+sof_offs))*8); + bytestream2_init(&s->gB, buf_ptr+sof_offs, buf_end - (buf_ptr+sof_offs)); s->start_code = SOF0; if ((ret = ff_mjpeg_decode_sof(s)) < 0) return ret; @@ -113,12 +113,12 @@ read_header: sod_offs = read_offs(avctx, &hgb, buf_end - buf_ptr, "sof is %d and size is %d\n"); av_log(avctx, AV_LOG_DEBUG, "sod offs: 0x%"PRIx32"\n", sod_offs); if (sos_offs) { - init_get_bits(&s->gb, buf_ptr + sos_offs, - 8 * FFMIN(field_size, buf_end - buf_ptr - sos_offs)); - s->mjpb_skiptosod = (sod_offs - sos_offs - show_bits(&s->gb, 16)); + bytestream2_init(&s->gB, buf_ptr+sos_offs, + FFMIN(field_size, buf_end - buf_ptr - sos_offs)); + s->mjpb_skiptosod = (sod_offs - sos_offs - bytestream2_peek_be16(&s->gB)); s->start_code = SOS; if (avctx->skip_frame == AVDISCARD_ALL) { - skip_bits(&s->gb, get_bits_left(&s->gb)); + bytestream2_skipu(&s->gB, bytestream2_get_bytes_left(&s->gB)); } else { ret = ff_mjpeg_decode_sos(s, NULL, 0, NULL); if (ret < 0 && (avctx->err_recognition & AV_EF_EXPLODE)) diff --git a/libavcodec/mjpegdec.c b/libavcodec/mjpegdec.c index 958b18b444..417cedae4a 100644 --- a/libavcodec/mjpegdec.c +++ b/libavcodec/mjpegdec.c @@ -148,8 +148,7 @@ av_cold int ff_mjpeg_decode_init(AVCodecContext *avctx) if (s->extern_huff) { av_log(avctx, AV_LOG_INFO, "using external huffman table\n"); - if ((ret = init_get_bits(&s->gb, avctx->extradata, avctx->extradata_size * 8)) < 0) - return ret; + bytestream2_init(&s->gB, avctx->extradata, avctx->extradata_size); if (ff_mjpeg_decode_dht(s)) { av_log(avctx, AV_LOG_ERROR, "error using external huffman table, switching back to internal\n"); @@ -192,8 +191,8 @@ av_cold int ff_mjpeg_decode_init(AVCodecContext *avctx) static int mjpeg_parse_len(MJpegDecodeContext *s, int *plen, const char *name) { - int len = get_bits(&s->gb, 16); - if (len < 2 || get_bits_left(&s->gb) < (8 * len - 16)) { + int len = bytestream2_get_be16u(&s->gB); + if (len < 2 || bytestream2_get_bytes_left(&s->gB) < (len - 2)) { av_log(s->avctx, AV_LOG_ERROR, "%s: invalid len %d\n", name, len); return AVERROR_INVALIDDATA; } @@ -211,20 +210,21 @@ int ff_mjpeg_decode_dqt(MJpegDecodeContext *s) return ret; while (len >= 65) { - int pr = get_bits(&s->gb, 4); + uint8_t b = bytestream2_get_byteu(&s->gB); + int pr = b >> 4; if (pr > 1) { av_log(s->avctx, AV_LOG_ERROR, "dqt: invalid precision\n"); return AVERROR_INVALIDDATA; } if (len < (1 + 64 * (1+pr))) return AVERROR_INVALIDDATA; - index = get_bits(&s->gb, 4); + index = b & 0x0F; if (index >= 4) return AVERROR_INVALIDDATA; av_log(s->avctx, AV_LOG_DEBUG, "index=%d\n", index); /* read quant table */ for (i = 0; i < 64; i++) { - s->quant_matrixes[index][i] = get_bits(&s->gb, pr ? 16 : 8); + s->quant_matrixes[index][i] = pr ? bytestream2_get_be16u(&s->gB) : bytestream2_get_byteu(&s->gB); if (s->quant_matrixes[index][i] == 0) { int log_level = s->avctx->err_recognition & AV_EF_EXPLODE ? AV_LOG_ERROR : AV_LOG_WARNING; av_log(s->avctx, log_level, "dqt: 0 quant value\n"); @@ -258,15 +258,16 @@ int ff_mjpeg_decode_dht(MJpegDecodeContext *s) while (len > 0) { if (len < 17) return AVERROR_INVALIDDATA; - class = get_bits(&s->gb, 4); + uint8_t b = bytestream2_get_byteu(&s->gB); + class = b >> 4; if (class >= 2) return AVERROR_INVALIDDATA; - index = get_bits(&s->gb, 4); + index = b & 0x0F; if (index >= 4) return AVERROR_INVALIDDATA; n = 0; for (i = 1; i <= 16; i++) { - bits_table[i] = get_bits(&s->gb, 8); + bits_table[i] = bytestream2_get_byteu(&s->gB); n += bits_table[i]; } len -= 17; @@ -274,7 +275,7 @@ int ff_mjpeg_decode_dht(MJpegDecodeContext *s) return AVERROR_INVALIDDATA; for (i = 0; i < n; i++) { - v = get_bits(&s->gb, 8); + v = bytestream2_get_byteu(&s->gB); val_table[i] = v; } len -= n; @@ -318,7 +319,7 @@ int ff_mjpeg_decode_sof(MJpegDecodeContext *s) return ret; if (len < 6) return AVERROR_INVALIDDATA; - bits = get_bits(&s->gb, 8); + bits = bytestream2_get_byteu(&s->gB); if (bits > 16 || bits < 1) { av_log(s->avctx, AV_LOG_ERROR, "bits %d is invalid\n", bits); @@ -340,8 +341,8 @@ int ff_mjpeg_decode_sof(MJpegDecodeContext *s) return AVERROR(ENOSYS); } - height = get_bits(&s->gb, 16); - width = get_bits(&s->gb, 16); + height = bytestream2_get_be16u(&s->gB); + width = bytestream2_get_be16u(&s->gB); // HACK for odd_height.mov if (s->interlaced && s->width == width && s->height == height + 1) @@ -357,7 +358,7 @@ int ff_mjpeg_decode_sof(MJpegDecodeContext *s) return AVERROR_INVALIDDATA; } - nb_components = get_bits(&s->gb, 8); + nb_components = bytestream2_get_byteu(&s->gB); if (nb_components <= 0 || nb_components > MAX_COMPONENTS) return AVERROR_INVALIDDATA; @@ -385,15 +386,16 @@ int ff_mjpeg_decode_sof(MJpegDecodeContext *s) s->v_max = 1; for (i = 0; i < nb_components; i++) { /* component id */ - s->component_id[i] = get_bits(&s->gb, 8); - h_count[i] = get_bits(&s->gb, 4); - v_count[i] = get_bits(&s->gb, 4); + s->component_id[i] = bytestream2_get_byteu(&s->gB); + uint8_t b = bytestream2_get_byteu(&s->gB); + h_count[i] = b >> 4; + v_count[i] = b & 0x0F; /* compute hmax and vmax (only used in interleaved case) */ if (h_count[i] > s->h_max) s->h_max = h_count[i]; if (v_count[i] > s->v_max) s->v_max = v_count[i]; - s->quant_index[i] = get_bits(&s->gb, 8); + s->quant_index[i] = bytestream2_get_byteu(&s->gB); if (s->quant_index[i] >= 4) { av_log(s->avctx, AV_LOG_ERROR, "quant_index is invalid\n"); return AVERROR_INVALIDDATA; @@ -1698,7 +1700,7 @@ int ff_mjpeg_decode_sos(MJpegDecodeContext *s, const uint8_t *mb_bitmask, return ret; if (len < 1) return AVERROR_INVALIDDATA; - nb_components = get_bits(&s->gb, 8); + nb_components = bytestream2_get_byteu(&s->gB); if (nb_components == 0 || nb_components > MAX_COMPONENTS) { avpriv_report_missing_feature(s->avctx, "decode_sos: nb_components (%d)", @@ -1710,7 +1712,7 @@ int ff_mjpeg_decode_sos(MJpegDecodeContext *s, const uint8_t *mb_bitmask, return AVERROR_INVALIDDATA; } for (i = 0; i < nb_components; i++) { - id = get_bits(&s->gb, 8); + id = bytestream2_get_byteu(&s->gB); av_log(s->avctx, AV_LOG_DEBUG, "component: %d\n", id); /* find component index */ for (index = 0; index < s->nb_components; index++) @@ -1733,8 +1735,9 @@ int ff_mjpeg_decode_sos(MJpegDecodeContext *s, const uint8_t *mb_bitmask, s->comp_index[i] = index; - s->dc_index[i] = get_bits(&s->gb, 4); - s->ac_index[i] = get_bits(&s->gb, 4); + uint8_t b = bytestream2_get_byteu(&s->gB); + s->dc_index[i] = b >> 4; + s->ac_index[i] = b & 0x0F; if (s->dc_index[i] < 0 || s->ac_index[i] < 0 || s->dc_index[i] >= 4 || s->ac_index[i] >= 4) @@ -1743,11 +1746,12 @@ int ff_mjpeg_decode_sos(MJpegDecodeContext *s, const uint8_t *mb_bitmask, goto out_of_range; } - predictor = get_bits(&s->gb, 8); /* JPEG Ss / lossless JPEG predictor /JPEG-LS NEAR */ - ilv = get_bits(&s->gb, 8); /* JPEG Se / JPEG-LS ILV */ + 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 */ if(s->avctx->codec_tag != AV_RL32("CJPG")){ - prev_shift = get_bits(&s->gb, 4); /* Ah */ - point_transform = get_bits(&s->gb, 4); /* Al */ + uint8_t b = bytestream2_get_byteu(&s->gB); + prev_shift = b >> 4; /* Ah */ + point_transform = b & 0x0F; /* Al */ }else prev_shift = point_transform = 0; @@ -1773,15 +1777,19 @@ int ff_mjpeg_decode_sos(MJpegDecodeContext *s, const uint8_t *mb_bitmask, /* mjpeg-b can have padding bytes between sos and image data, skip them */ - for (i = s->mjpb_skiptosod; i > 0; i--) - skip_bits(&s->gb, 8); + if (s->mjpb_skiptosod) + bytestream2_skip(&s->gB, s->mjpb_skiptosod); + + ret = init_get_bits8(&s->gb, s->gB.buffer, bytestream2_get_bytes_left(&s->gB)); + if (ret < 0) + return ret; next_field: for (i = 0; i < nb_components; i++) s->last_dc[i] = (4 << s->bits); if (s->avctx->hwaccel) { - int bytes_to_start = get_bits_count(&s->gb) / 8; + int bytes_to_start = bytestream2_tell(&s->gB); av_assert0(bytes_to_start >= 0 && s->raw_scan_buffer_size >= bytes_to_start); @@ -1841,6 +1849,10 @@ next_field: } } + /* Add the amount of bits read from the unescaped image data buffer + * into the GetByteContext. */ + bytestream2_skipu(&s->gB, (get_bits_count(&s->gb) + 7) / 8); + return 0; out_of_range: av_log(s->avctx, AV_LOG_ERROR, "decode_sos: ac/dc index out of range\n"); @@ -1849,9 +1861,9 @@ next_field: static int mjpeg_decode_dri(MJpegDecodeContext *s) { - if (get_bits(&s->gb, 16) != 4) + if (bytestream2_get_be16u(&s->gB) != 4) return AVERROR_INVALIDDATA; - s->restart_interval = get_bits(&s->gb, 16); + s->restart_interval = bytestream2_get_be16u(&s->gB); s->restart_count = 0; av_log(s->avctx, AV_LOG_DEBUG, "restart interval: %d\n", s->restart_interval); @@ -1874,7 +1886,7 @@ static int mjpeg_decode_app(MJpegDecodeContext *s) goto out; } - id = get_bits_long(&s->gb, 32); + id = bytestream2_get_be32u(&s->gB); len -= 4; if (s->avctx->debug & FF_DEBUG_STARTCODE) @@ -1893,7 +1905,7 @@ static int mjpeg_decode_app(MJpegDecodeContext *s) 4bytes field_size_less_padding */ s->buggy_avid = 1; - i = get_bits(&s->gb, 8); len--; + i = bytestream2_get_byteu(&s->gB); len--; av_log(s->avctx, AV_LOG_DEBUG, "polarity %d\n", i); goto out; } @@ -1902,13 +1914,13 @@ static int mjpeg_decode_app(MJpegDecodeContext *s) int t_w, t_h, v1, v2; if (len < 8) goto out; - skip_bits(&s->gb, 8); /* the trailing zero-byte */ - v1 = get_bits(&s->gb, 8); - v2 = get_bits(&s->gb, 8); - skip_bits(&s->gb, 8); + bytestream2_skipu(&s->gB, 1); /* the trailing zero-byte */ + v1 = bytestream2_get_byteu(&s->gB); + v2 = bytestream2_get_byteu(&s->gB); + bytestream2_skipu(&s->gB, 1); - s->avctx->sample_aspect_ratio.num = get_bits(&s->gb, 16); - s->avctx->sample_aspect_ratio.den = get_bits(&s->gb, 16); + s->avctx->sample_aspect_ratio.num = bytestream2_get_be16u(&s->gB); + s->avctx->sample_aspect_ratio.den = bytestream2_get_be16u(&s->gB); if ( s->avctx->sample_aspect_ratio.num <= 0 || s->avctx->sample_aspect_ratio.den <= 0) { s->avctx->sample_aspect_ratio.num = 0; @@ -1924,8 +1936,8 @@ static int mjpeg_decode_app(MJpegDecodeContext *s) len -= 8; if (len >= 2) { - t_w = get_bits(&s->gb, 8); - t_h = get_bits(&s->gb, 8); + t_w = bytestream2_get_byteu(&s->gB); + t_h = bytestream2_get_byteu(&s->gB); if (t_w && t_h) { /* skip thumbnail */ if (len -10 - (t_w * t_h * 3) > 0) @@ -1938,13 +1950,13 @@ static int mjpeg_decode_app(MJpegDecodeContext *s) if ( id == AV_RB32("Adob") && len >= 8 - && show_bits(&s->gb, 8) == 'e' - && show_bits_long(&s->gb, 32) != AV_RB32("e_CM")) { - skip_bits(&s->gb, 8); /* 'e' */ - skip_bits(&s->gb, 16); /* version */ - skip_bits(&s->gb, 16); /* flags0 */ - skip_bits(&s->gb, 16); /* flags1 */ - s->adobe_transform = get_bits(&s->gb, 8); + && bytestream2_peek_byteu(&s->gB) == 'e' + && bytestream2_peek_be32u(&s->gB) != AV_RB32("e_CM")) { + bytestream2_skipu(&s->gB, 1); /* 'e' */ + bytestream2_skipu(&s->gB, 2); /* version */ + bytestream2_skipu(&s->gB, 2); /* flags0 */ + bytestream2_skipu(&s->gB, 2); /* flags1 */ + s->adobe_transform = bytestream2_get_byteu(&s->gB); if (s->avctx->debug & FF_DEBUG_PICT_INFO) av_log(s->avctx, AV_LOG_INFO, "mjpeg: Adobe header found, transform=%d\n", s->adobe_transform); len -= 8; @@ -1957,11 +1969,11 @@ static int mjpeg_decode_app(MJpegDecodeContext *s) if (s->avctx->debug & FF_DEBUG_PICT_INFO) av_log(s->avctx, AV_LOG_INFO, "Pegasus lossless jpeg header found\n"); - skip_bits(&s->gb, 16); /* version ? */ - skip_bits(&s->gb, 16); /* unknown always 0? */ - skip_bits(&s->gb, 16); /* unknown always 0? */ - skip_bits(&s->gb, 16); /* unknown always 0? */ - switch (i=get_bits(&s->gb, 8)) { + bytestream2_skipu(&s->gB, 2); /* version ? */ + bytestream2_skipu(&s->gB, 2); /* unknown always 0? */ + bytestream2_skipu(&s->gB, 2); /* unknown always 0? */ + bytestream2_skipu(&s->gB, 2); /* unknown always 0? */ + switch (i=bytestream2_get_byteu(&s->gB)) { case 1: rgb = 1; pegasus_rct = 0; @@ -1989,14 +2001,14 @@ static int mjpeg_decode_app(MJpegDecodeContext *s) goto out; } if (id == AV_RL32("colr") && len > 0) { - s->colr = get_bits(&s->gb, 8); + s->colr = bytestream2_get_byteu(&s->gB); if (s->avctx->debug & FF_DEBUG_PICT_INFO) av_log(s->avctx, AV_LOG_INFO, "COLR %d\n", s->colr); len --; goto out; } if (id == AV_RL32("xfrm") && len > 0) { - s->xfrm = get_bits(&s->gb, 8); + s->xfrm = bytestream2_get_byteu(&s->gB); if (s->avctx->debug & FF_DEBUG_PICT_INFO) av_log(s->avctx, AV_LOG_INFO, "XFRM %d\n", s->xfrm); len --; @@ -2009,12 +2021,12 @@ static int mjpeg_decode_app(MJpegDecodeContext *s) if (s->avctx->debug & FF_DEBUG_PICT_INFO) av_log(s->avctx, AV_LOG_INFO, "_JPSJPS_\n"); - skip_bits(&s->gb, 32); len -= 4; /* JPS_ */ - skip_bits(&s->gb, 16); len -= 2; /* block length */ - skip_bits(&s->gb, 8); /* reserved */ - flags = get_bits(&s->gb, 8); - layout = get_bits(&s->gb, 8); - type = get_bits(&s->gb, 8); + bytestream2_skipu(&s->gB, 4); len -= 4; /* JPS_ */ + bytestream2_skipu(&s->gB, 2); len -= 2; /* block length */ + bytestream2_skipu(&s->gB, 1); /* reserved */ + flags = bytestream2_get_byteu(&s->gB); + layout = bytestream2_get_byteu(&s->gB); + type = bytestream2_get_byteu(&s->gB); len -= 4; av_freep(&s->stereo3d); @@ -2046,21 +2058,17 @@ static int mjpeg_decode_app(MJpegDecodeContext *s) /* EXIF metadata */ if (s->start_code == APP1 && id == AV_RB32("Exif") && len >= 2) { int ret; - const uint8_t *aligned; - skip_bits(&s->gb, 16); // skip padding + bytestream2_skipu(&s->gB, 2); // skip padding len -= 2; - // init byte wise reading - aligned = align_get_bits(&s->gb); - - ret = av_exif_parse_buffer(s->avctx, aligned, len, &s->exif_metadata, AV_EXIF_TIFF_HEADER); + ret = av_exif_parse_buffer(s->avctx, s->gB.buffer, len, &s->exif_metadata, AV_EXIF_TIFF_HEADER); if (ret < 0) { av_log(s->avctx, AV_LOG_WARNING, "unable to parse EXIF buffer\n"); goto out; } - skip_bits(&s->gb, ret << 3); + bytestream2_skipu(&s->gB, ret); len -= ret; goto out; @@ -2068,7 +2076,7 @@ static int mjpeg_decode_app(MJpegDecodeContext *s) /* Apple MJPEG-A */ if ((s->start_code == APP1) && (len > (0x28 - 8))) { - id = get_bits_long(&s->gb, 32); + id = bytestream2_get_be32u(&s->gB); len -= 4; /* Apple MJPEG-A */ if (id == AV_RB32("mjpg")) { @@ -2092,23 +2100,23 @@ static int mjpeg_decode_app(MJpegDecodeContext *s) unsigned seqno; unsigned nummarkers; - id = get_bits_long(&s->gb, 32); - id2 = get_bits(&s->gb, 24); + id = bytestream2_get_be32u(&s->gB); + id2 = bytestream2_get_be24u(&s->gB); len -= 7; if (id != AV_RB32("PROF") || id2 != AV_RB24("ILE")) { av_log(s->avctx, AV_LOG_WARNING, "Invalid ICC_PROFILE header in APP2\n"); goto out; } - skip_bits(&s->gb, 8); - seqno = get_bits(&s->gb, 8); + bytestream2_skipu(&s->gB, 1); + seqno = bytestream2_get_byteu(&s->gB); len -= 2; if (seqno == 0) { av_log(s->avctx, AV_LOG_WARNING, "Invalid sequence number in APP2\n"); goto out; } - nummarkers = get_bits(&s->gb, 8); + nummarkers = bytestream2_get_byteu(&s->gB); len -= 1; if (nummarkers == 0) { av_log(s->avctx, AV_LOG_WARNING, "Invalid number of markers coded in APP2\n"); @@ -2142,8 +2150,7 @@ static int mjpeg_decode_app(MJpegDecodeContext *s) return AVERROR(ENOMEM); } - memcpy(s->iccentries[seqno - 1].data, align_get_bits(&s->gb), len); - skip_bits(&s->gb, len << 3); + bytestream2_get_bufferu(&s->gB, s->iccentries[seqno - 1].data, len); len = 0; s->iccread++; @@ -2156,8 +2163,8 @@ out: if (len < 0) av_log(s->avctx, AV_LOG_ERROR, "mjpeg: error, decode_app parser read over the end\n"); - while (len-- > 0) - skip_bits(&s->gb, 8); + if (len) + bytestream2_skipu(&s->gB, len); return 0; } @@ -2177,7 +2184,7 @@ static int mjpeg_decode_com(MJpegDecodeContext *s) return AVERROR(ENOMEM); for (i = 0; i < len; i++) - cbuf[i] = get_bits(&s->gb, 8); + cbuf[i] = bytestream2_get_byteu(&s->gB); if (cbuf[i - 1] == '\n') cbuf[i - 1] = 0; else @@ -2412,12 +2419,7 @@ redo_for_pal8: av_log(avctx, AV_LOG_DEBUG, "marker=%x avail_size_in_buf=%td\n", start_code, buf_end - buf_ptr); - ret = init_get_bits8(&s->gb, unescaped_buf_ptr, unescaped_buf_size); - - if (ret < 0) { - av_log(avctx, AV_LOG_ERROR, "invalid buffer\n"); - goto fail; - } + bytestream2_init(&s->gB, unescaped_buf_ptr, unescaped_buf_size); s->start_code = start_code; if (avctx->debug & FF_DEBUG_STARTCODE) @@ -2614,10 +2616,10 @@ eoi_parser: skip: /* eof process start code */ - buf_ptr += (get_bits_count(&s->gb) + 7) / 8; + buf_ptr += bytestream2_tell(&s->gB); av_log(avctx, AV_LOG_DEBUG, - "marker parser used %d bytes (%d bits)\n", - (get_bits_count(&s->gb) + 7) / 8, get_bits_count(&s->gb)); + "marker parser used %d bytes\n", + bytestream2_tell(&s->gB)); } if (s->got_picture && s->cur_scan) { av_log(avctx, AV_LOG_WARNING, "EOI missing, emulating\n"); diff --git a/libavcodec/mjpegdec.h b/libavcodec/mjpegdec.h index ce688482cf..4f4139dcc4 100644 --- a/libavcodec/mjpegdec.h +++ b/libavcodec/mjpegdec.h @@ -36,6 +36,7 @@ #include "avcodec.h" #include "blockdsp.h" +#include "bytestream.h" #include "exif.h" #include "get_bits.h" #include "hpeldsp.h" @@ -56,6 +57,7 @@ typedef struct MJpegDecodeContext { AVClass *class; AVCodecContext *avctx; GetBitContext gb; + GetByteContext gB; int buf_size; int start_code; /* current start code */ diff --git a/libavcodec/mxpegdec.c b/libavcodec/mxpegdec.c index 9526189f66..b66bff56c9 100644 --- a/libavcodec/mxpegdec.c +++ b/libavcodec/mxpegdec.c @@ -86,7 +86,7 @@ static int mxpeg_decode_app(MXpegDecodeContext *s, if (buf_size < 2) return 0; len = AV_RB16(buf_ptr); - skip_bits(&s->jpg.gb, 8*FFMIN(len,buf_size)); + bytestream2_skipu(&s->jpg.gB, FFMIN(len, buf_size)); return 0; } @@ -154,7 +154,7 @@ static int mxpeg_decode_com(MXpegDecodeContext *s, if (len > 14 && len <= buf_size && !strncmp(buf_ptr + 2, "MXM", 3)) { ret = mxpeg_decode_mxm(s, buf_ptr + 2, len - 2); } - skip_bits(&s->jpg.gb, 8*FFMIN(len,buf_size)); + bytestream2_skipu(&s->jpg.gB, FFMIN(len, buf_size)); return ret; } @@ -217,7 +217,7 @@ static int mxpeg_decode_frame(AVCodecContext *avctx, AVFrame *rframe, if (start_code < 0) goto the_end; - init_get_bits(&jpg->gb, unescaped_buf_ptr, unescaped_buf_size*8); + bytestream2_init(&jpg->gB, unescaped_buf_ptr, unescaped_buf_size); if (start_code >= APP0 && start_code <= APP15) { mxpeg_decode_app(s, unescaped_buf_ptr, unescaped_buf_size); @@ -326,7 +326,7 @@ static int mxpeg_decode_frame(AVCodecContext *avctx, AVFrame *rframe, break; } - buf_ptr += (get_bits_count(&jpg->gb)+7) >> 3; + buf_ptr += bytestream2_tell(&jpg->gB); } the_end: _______________________________________________ ffmpeg-cvslog mailing list -- [email protected] To unsubscribe send an email to [email protected]
