PR #25368 opened by Baptiste Coudurier (bcoudurier) URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/25368 Patch URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/25368.patch
Apple's JPEG decoder rejects the vertical sampling factors currently emitted for MJPEG 4:2:2 and 4:4:4. Use Y 2x1 / Cb 1x1 / Cr 1x1 for 4:2:2 and 1x1 for every component in 4:4:4. Encode each macroblock row in two 8-pixel passes so blocks follow MCU scan order without a deferred coefficient buffer. Reuse the block skip mask, share ordering between default and optimal Huffman coding, and keep restart intervals at one macroblock row. LJPEG and AMV sampling are preserved. Validation: - 46 FATE targets, including new wide, noisy single-row regressions. - 415 output and quality-stat comparisons against the reviewed implementation, covering MJPEG options and shared MPEG-2, MPEG-4, H.263, and SpeedHQ paths. - Native Apple VideoToolbox JPEG (`jpeg`) decoding of 120 images across 4:2:0, 4:2:2, and 4:4:4, both Huffman modes, threading modes, and dimensions from 1x1 to 1920x1080. - `git diff --check`. The separate one-macroblock-wide slice-threading restart-marker fix is not included. >From 449fb3f5c9a8206cb5c784200bcd1675a22cedb4 Mon Sep 17 00:00:00 2001 From: Baptiste Coudurier <[email protected]> Date: Sat, 17 Oct 2026 11:03:58 -0700 Subject: [PATCH] avcodec/mjpegenc: use standard sampling factors for 4:2:2 and 4:4:4 4:2:2 was coded with Y 2x2 and chroma 1x2, and 4:4:4 with 1x2 for all components. These factors are valid JPEG, but Apple's JPEG decoder rejects them. Use Y 2x1 and chroma 1x1 for 4:2:2, and 1x1 for 4:4:4. Encode each macroblock row in two 8-pixel passes, skipping the blocks belonging to the other pass. This produces MCU scan order without buffering a row of coefficients. Keep the restart interval at one macroblock row. Share block ordering between default and optimal Huffman coding, and add regression coverage for wide, noisy single-row images. Co-Authored-By: Claude Opus 5.5 <[email protected]> --- libavcodec/mjpegenc.c | 82 +++++++------------------- libavcodec/mjpegenc_common.c | 22 ++++--- libavcodec/mpegvideo_enc.c | 62 ++++++++++++------- libavcodec/mpegvideoenc.h | 2 +- tests/fate/ffmpeg.mak | 7 +++ tests/ref/fate/ffmpeg-mjpeg-422-row | 6 ++ tests/ref/fate/ffmpeg-mjpeg-444-row | 6 ++ tests/ref/fate/jpg-icc | 6 +- tests/ref/vsynth/vsynth1-mjpeg-422 | 4 +- tests/ref/vsynth/vsynth1-mjpeg-444 | 4 +- tests/ref/vsynth/vsynth2-mjpeg-422 | 4 +- tests/ref/vsynth/vsynth2-mjpeg-444 | 4 +- tests/ref/vsynth/vsynth3-mjpeg-422 | 4 +- tests/ref/vsynth/vsynth3-mjpeg-444 | 4 +- tests/ref/vsynth/vsynth_lena-mjpeg-422 | 4 +- tests/ref/vsynth/vsynth_lena-mjpeg-444 | 4 +- 16 files changed, 113 insertions(+), 112 deletions(-) create mode 100644 tests/ref/fate/ffmpeg-mjpeg-422-row create mode 100644 tests/ref/fate/ffmpeg-mjpeg-444-row diff --git a/libavcodec/mjpegenc.c b/libavcodec/mjpegenc.c index 4305f117745..e111051c2b7 100644 --- a/libavcodec/mjpegenc.c +++ b/libavcodec/mjpegenc.c @@ -462,70 +462,32 @@ static void encode_block(MPVEncContext *const s, int16_t block[], int n) put_bits(&s->pb, huff_size_ac[0], huff_code_ac[0]); } -static void mjpeg_record_mb(MPVEncContext *const s, int16_t block[][64], - int unused_x, int unused_y) -{ - if (s->c.chroma_format == CHROMA_444) { - record_block(s, block[0], 0); - record_block(s, block[2], 2); - record_block(s, block[4], 4); - record_block(s, block[8], 8); - record_block(s, block[5], 5); - record_block(s, block[9], 9); - - if (16*s->c.mb_x+8 < s->c.width) { - record_block(s, block[1], 1); - record_block(s, block[3], 3); - record_block(s, block[6], 6); - record_block(s, block[10], 10); - record_block(s, block[7], 7); - record_block(s, block[11], 11); - } - } else { - for (int i = 0; i < 5; i++) - record_block(s, block[i], i); - if (s->c.chroma_format == CHROMA_420) { - record_block(s, block[5], 5); - } else { - record_block(s, block[6], 6); - record_block(s, block[5], 5); - record_block(s, block[7], 7); - } - } -} - static void mjpeg_encode_mb(MPVEncContext *const s, int16_t block[][64], int unused_x, int unused_y) { - if (s->c.chroma_format == CHROMA_444) { - encode_block(s, block[0], 0); - encode_block(s, block[2], 2); - encode_block(s, block[4], 4); - encode_block(s, block[8], 8); - encode_block(s, block[5], 5); - encode_block(s, block[9], 9); + static const uint8_t blocks[][12] = { + [CHROMA_420] = { 0, 1, 2, 3, 4, 5 }, + [CHROMA_422] = { 0, 1, 4, 5, 2, 3, 6, 7 }, + [CHROMA_444] = { 0, 4, 5, 1, 6, 7, 2, 8, 9, 3, 10, 11 }, + }; + const MJpegContext *const m = s->mjpeg_ctx; + const int bottom = s->skipdct & 1; + int count = s->c.chroma_format == CHROMA_422 ? 4 : 6; + const uint8_t *order = blocks[s->c.chroma_format] + bottom * count; - if (16 * s->c.mb_x + 8 < s->c.width) { - encode_block(s, block[1], 1); - encode_block(s, block[3], 3); - encode_block(s, block[6], 6); - encode_block(s, block[10], 10); - encode_block(s, block[7], 7); - encode_block(s, block[11], 11); - } - } else { - for (int i = 0; i < 5; i++) - encode_block(s, block[i], i); - if (s->c.chroma_format == CHROMA_420) { - encode_block(s, block[5], 5); - } else { - encode_block(s, block[6], 6); - encode_block(s, block[5], 5); - encode_block(s, block[7], 7); - } + if (bottom && 16 * s->c.mb_y + 8 >= s->c.height) + return; + if (s->c.chroma_format == CHROMA_444 && 16 * s->c.mb_x + 8 >= s->c.width) + count = 3; + for (int i = 0; i < count; i++) { + int n = order[i]; + if (m->huffman == HUFFMAN_TABLE_OPTIMAL) + record_block(s, block[n], n); + else + encode_block(s, block[n], n); } - - s->i_tex_bits += get_bits_diff(s); + if (m->huffman != HUFFMAN_TABLE_OPTIMAL) + s->i_tex_bits += get_bits_diff(s); } static av_cold int mjpeg_encode_init(AVCodecContext *avctx) @@ -537,7 +499,6 @@ static av_cold int mjpeg_encode_init(AVCodecContext *avctx) s->mjpeg_ctx = m; m2->mpeg.encode_picture_header = mjpeg_amv_encode_picture_header; - // May be overridden below s->encode_mb = mjpeg_encode_mb; if (s->mpv_flags & FF_MPV_FLAG_QP_RD) { @@ -601,7 +562,6 @@ static av_cold int mjpeg_encode_init(AVCodecContext *avctx) if (m->huffman == HUFFMAN_TABLE_OPTIMAL) { // If we are here, we have only one slice_context. So no loop necessary. - s->encode_mb = mjpeg_record_mb; return alloc_huffman(m2); } diff --git a/libavcodec/mjpegenc_common.c b/libavcodec/mjpegenc_common.c index bc58ca9903b..b44650d04bc 100644 --- a/libavcodec/mjpegenc_common.c +++ b/libavcodec/mjpegenc_common.c @@ -56,12 +56,11 @@ static int put_huffman_table(PutBitContext *p, int table_class, int table_id, return n + 17; } -static void jpeg_table_header(AVCodecContext *avctx, PutBitContext *p, - const MJpegContext *m, +static void jpeg_table_header(PutBitContext *p, const MJpegContext *m, const uint8_t intra_matrix_permutation[64], const uint16_t luma_intra_matrix[64], const uint16_t chroma_intra_matrix[64], - int hsample[3], int use_slices, int matrices_differ) + int restart_interval, int matrices_differ) { int size; uint8_t *ptr; @@ -90,10 +89,10 @@ static void jpeg_table_header(AVCodecContext *avctx, PutBitContext *p, } } - if (use_slices) { + if (restart_interval) { put_marker(p, DRI); put_bits(p, 16, 4); - put_bits(p, 16, (avctx->width-1)/(8*hsample[0]) + 1); + put_bits(p, 16, restart_interval); } /* huffman table */ @@ -349,6 +348,8 @@ void ff_mjpeg_init_hvsample(const AVCodecContext *avctx, int hsample[4], int vsa hsample[1] = 2 >> chroma_h_shift; hsample[2] = 2 >> chroma_h_shift; } + if (avctx->codec_id == AV_CODEC_ID_MJPEG && vsample[1] == 2) + vsample[0] = vsample[1] = vsample[2] = 1; } void ff_mjpeg_encode_picture_header(AVCodecContext *avctx, PutBitContext *pb, @@ -361,7 +362,7 @@ void ff_mjpeg_encode_picture_header(AVCodecContext *avctx, PutBitContext *pb, const int lossless = !m; int hsample[4], vsample[4]; int components = 3 + (avctx->pix_fmt == AV_PIX_FMT_BGRA); - int chroma_matrix; + int chroma_matrix, restart_interval = 0; ff_mjpeg_init_hvsample(avctx, hsample, vsample); @@ -376,9 +377,12 @@ void ff_mjpeg_encode_picture_header(AVCodecContext *avctx, PutBitContext *pb, chroma_matrix = !lossless && !!memcmp(luma_intra_matrix, chroma_intra_matrix, sizeof(luma_intra_matrix[0]) * 64); - jpeg_table_header(avctx, pb, m, intra_matrix_permutation, - luma_intra_matrix, chroma_intra_matrix, hsample, - use_slices, chroma_matrix); + /* Restart interval of one macroblock row. */ + if (use_slices) + restart_interval = ((avctx->width - 1) / (8 * hsample[0]) + 1) * (2 / vsample[0]); + jpeg_table_header(pb, m, intra_matrix_permutation, + luma_intra_matrix, chroma_intra_matrix, + restart_interval, chroma_matrix); switch (avctx->codec_id) { case AV_CODEC_ID_MJPEG: put_marker(pb, SOF0 ); break; diff --git a/libavcodec/mpegvideo_enc.c b/libavcodec/mpegvideo_enc.c index 08d7aa59b7d..9298fba4e02 100644 --- a/libavcodec/mpegvideo_enc.c +++ b/libavcodec/mpegvideo_enc.c @@ -1129,6 +1129,8 @@ av_cold int ff_mpv_encode_end(AVCodecContext *avctx) static inline void put_dct(MPVEncContext *const s, int16_t *block, int i, uint8_t *dest, int line_size, int qscale) { + if (s->skipdct & (1U << i)) + return; s->c.dct_unquantize_intra(&s->c, block, i, qscale); s->c.idsp.idct_put(dest, line_size, block); } @@ -1201,6 +1203,16 @@ static void mpv_reconstruct_mb(MPVEncContext *const s, int16_t block[12][64]) if (s->c.chroma_y_shift) { put_dct(s, block[4], 4, dest_cb, uvlinesize, s->c.chroma_qscale); put_dct(s, block[5], 5, dest_cr, uvlinesize, s->c.chroma_qscale); + } else if (s->mjpeg_ctx) { + for (int i = 0; i < (4 >> s->c.chroma_x_shift); i++) { + int x = (i & 1) >> s->c.chroma_x_shift; + int y = i >> (1 - s->c.chroma_x_shift); + int offset = 8 * (x + y * uvlinesize); + put_dct(s, block[4 + 2 * i], 4 + 2 * i, dest_cb + offset, + uvlinesize, s->c.chroma_qscale); + put_dct(s, block[5 + 2 * i], 5 + 2 * i, dest_cr + offset, + uvlinesize, s->c.chroma_qscale); + } } else { dct_offset >>= 1; dct_linesize >>= 1; @@ -2283,7 +2295,7 @@ static av_always_inline void encode_mb_internal(MPVEncContext *const s, ptrdiff_t wrap_y, wrap_c; for (i = 0; i < mb_block_count; i++) - skip_dct[i] = s->skipdct; + skip_dct[i] = s->skipdct & (1U << i); if (s->adaptive_quant) { const int last_qp = s->c.qscale; @@ -2375,27 +2387,25 @@ static av_always_inline void encode_mb_internal(MPVEncContext *const s, } } - s->pdsp.get_pixels(s->block[0], ptr_y, wrap_y); - s->pdsp.get_pixels(s->block[1], ptr_y + 8, wrap_y); - s->pdsp.get_pixels(s->block[2], ptr_y + dct_offset, wrap_y); - s->pdsp.get_pixels(s->block[3], ptr_y + dct_offset + 8, wrap_y); + for (i = 0; i < 4; i++) { + if (!skip_dct[i]) + s->pdsp.get_pixels(s->block[i], + ptr_y + (i & 1) * 8 + (i >> 1) * dct_offset, + wrap_y); + } if (s->c.avctx->flags & AV_CODEC_FLAG_GRAY) { skip_dct[4] = 1; skip_dct[5] = 1; } else { - s->pdsp.get_pixels(s->block[4], ptr_cb, wrap_c); - s->pdsp.get_pixels(s->block[5], ptr_cr, wrap_c); - if (chroma_format == CHROMA_422) { - s->pdsp.get_pixels(s->block[6], ptr_cb + uv_dct_offset, wrap_c); - s->pdsp.get_pixels(s->block[7], ptr_cr + uv_dct_offset, wrap_c); - } else if (chroma_format == CHROMA_444) { - s->pdsp.get_pixels(s->block[ 6], ptr_cb + 8, wrap_c); - s->pdsp.get_pixels(s->block[ 7], ptr_cr + 8, wrap_c); - s->pdsp.get_pixels(s->block[ 8], ptr_cb + uv_dct_offset, wrap_c); - s->pdsp.get_pixels(s->block[ 9], ptr_cr + uv_dct_offset, wrap_c); - s->pdsp.get_pixels(s->block[10], ptr_cb + uv_dct_offset + 8, wrap_c); - s->pdsp.get_pixels(s->block[11], ptr_cr + uv_dct_offset + 8, wrap_c); + for (i = 4; i < mb_block_count; i++) { + if (skip_dct[i]) + continue; + const uint8_t *ptr = i & 1 ? ptr_cr : ptr_cb; + int x = ((i - 4) >> 1 & 1) >> chroma_x_shift; + int y = (i - 4) >> (2 - chroma_x_shift); + s->pdsp.get_pixels(s->block[i], + ptr + x * 8 + y * uv_dct_offset, wrap_c); } } } else { @@ -2957,6 +2967,7 @@ int ff_mpv_reallocate_putbitbuffer(MPVEncContext *const s, size_t threshold, siz static int encode_thread(AVCodecContext *c, void *arg){ MPVEncContext *const s = *(void**)arg; + const int row_passes = s->mjpeg_ctx && !s->c.chroma_y_shift ? 2 : 1; int chr_h = 16 >> s->c.chroma_y_shift; int i; MBBackup best_s = { 0 }, backup_s; @@ -3005,7 +3016,10 @@ static int encode_thread(AVCodecContext *c, void *arg){ s->c.resync_mb_y = 0; s->c.first_slice_line = 1; s->ptr_lastgob = s->pb.buf; - for (int mb_y_order = s->c.start_mb_y; mb_y_order < s->c.end_mb_y; mb_y_order++) { + /* JPEG 4:2:2 and 4:4:4 encode each row in two 8-pixel passes. */ + for (int mb_y_order = s->c.start_mb_y * row_passes; + mb_y_order < s->c.end_mb_y * row_passes; mb_y_order++) { + const int pass = mb_y_order % row_passes; int mb_y; if (CONFIG_SPEEDHQ_ENCODER && s->c.codec_id == AV_CODEC_ID_SPEEDHQ) { int first_in_slice; @@ -3014,8 +3028,11 @@ static int encode_thread(AVCodecContext *c, void *arg){ ff_speedhq_end_slice(s); s->last_dc[0] = s->last_dc[1] = s->last_dc[2] = 1024; } else { - mb_y = mb_y_order; + mb_y = mb_y_order / row_passes; } + s->skipdct = row_passes == 1 ? 0 + : s->c.chroma_format == CHROMA_422 + ? (pass ? 0x033 : 0x0cc) : (pass ? 0x0f3 : 0xf0c); s->c.mb_x = 0; s->c.mb_y = mb_y; @@ -3053,7 +3070,7 @@ static int encode_thread(AVCodecContext *c, void *arg){ mb_type = s->mb_type[xy]; /* write gob / video packet header */ - if(s->rtp_mode){ + if (s->rtp_mode && !pass) { int current_packet_size, is_gob_start; current_packet_size = put_bytes_count(&s->pb, 1) @@ -3381,7 +3398,7 @@ static int encode_thread(AVCodecContext *c, void *arg){ s->c.mv[1][0][0] = best_s.mv[1][0][0]; s->c.mv[1][0][1] = best_s.mv[1][0][1];*/ backup_s.dquant= 0; - s->skipdct=1; + s->skipdct=~0U; encode_mb_hq(s, &backup_s, &best_s, pb, pb2, tex_pb, &dmin, &next_block, mx, my); s->skipdct=0; @@ -3557,7 +3574,8 @@ static int encode_thread(AVCodecContext *c, void *arg){ #endif } - if (s->c.avctx->flags & AV_CODEC_FLAG_PSNR) { + if (s->c.avctx->flags & AV_CODEC_FLAG_PSNR && + pass == row_passes - 1) { int w= 16; int h= 16; diff --git a/libavcodec/mpegvideoenc.h b/libavcodec/mpegvideoenc.h index 3943a284e8c..13fd60c84c9 100644 --- a/libavcodec/mpegvideoenc.h +++ b/libavcodec/mpegvideoenc.h @@ -54,7 +54,7 @@ typedef struct MPVEncContext { int *lambda_table; int adaptive_quant; ///< use adaptive quantization int dquant; ///< qscale difference to prev qscale - int skipdct; ///< skip dct and code zero residual + unsigned skipdct; ///< bitmask of blocks whose DCT is skipped int quantizer_noise_shaping; diff --git a/tests/fate/ffmpeg.mak b/tests/fate/ffmpeg.mak index 9da5ed9d61d..f371007f178 100644 --- a/tests/fate/ffmpeg.mak +++ b/tests/fate/ffmpeg.mak @@ -450,3 +450,10 @@ FATE_SAMPLES_FFMPEG-$(call FRAMECRC, MOV, HEVC, HEVC_PARSER) += fate-ffmpeg-heif # binding the internal filtegraph with a caller defined filtergraph fate-ffmpeg-heif-merge-filtergraph: CMD = framecrc -i $(TARGET_SAMPLES)/heif-conformance/C007.heic -filter_complex "sws_flags=+accurate_rnd+bitexact\;[0:g:0]scale=w=1280:h=720[out]" -map "[out]" FATE_SAMPLES_FFMPEG-$(call FRAMECRC, MOV, HEVC, HEVC_PARSER SCALE_FILTER) += fate-ffmpeg-heif-merge-filtergraph + +FATE_FFMPEG-$(call ALLYES, TESTSRC2_FILTER FORMAT_FILTER NOISE_FILTER LAVFI_INDEV WRAPPED_AVFRAME_DECODER MJPEG_ENCODER FRAMECRC_MUXER PIPE_PROTOCOL) += fate-ffmpeg-mjpeg-422-row fate-ffmpeg-mjpeg-444-row +fate-ffmpeg-mjpeg-422-row: SIZE = 768x16 +fate-ffmpeg-mjpeg-422-row: PIXFMT = yuvj422p +fate-ffmpeg-mjpeg-444-row: SIZE = 512x16 +fate-ffmpeg-mjpeg-444-row: PIXFMT = yuvj444p +fate-ffmpeg-mjpeg-422-row fate-ffmpeg-mjpeg-444-row: CMD = framecrc -f lavfi -i "testsrc2=s=$(SIZE),format=$(PIXFMT),noise=alls=100:allf=t+u" -flags +bitexact -dct fastint -threads 1 -c:v mjpeg -huffman default -q:v 2 -frames:v 1 diff --git a/tests/ref/fate/ffmpeg-mjpeg-422-row b/tests/ref/fate/ffmpeg-mjpeg-422-row new file mode 100644 index 00000000000..66339248250 --- /dev/null +++ b/tests/ref/fate/ffmpeg-mjpeg-422-row @@ -0,0 +1,6 @@ +#tb 0: 1/25 +#media_type 0: video +#codec_id 0: mjpeg +#dimensions 0: 768x16 +#sar 0: 1/1 +0, 0, 0, 1, 15088, 0xadc30f61, S=1, Quality stats, 8, 0x076400ed diff --git a/tests/ref/fate/ffmpeg-mjpeg-444-row b/tests/ref/fate/ffmpeg-mjpeg-444-row new file mode 100644 index 00000000000..5aba909f8f4 --- /dev/null +++ b/tests/ref/fate/ffmpeg-mjpeg-444-row @@ -0,0 +1,6 @@ +#tb 0: 1/25 +#media_type 0: video +#codec_id 0: mjpeg +#dimensions 0: 512x16 +#sar 0: 1/1 +0, 0, 0, 1, 15512, 0x4b10f22a, S=1, Quality stats, 8, 0x076400ed diff --git a/tests/ref/fate/jpg-icc b/tests/ref/fate/jpg-icc index 048a02c084a..23e3ec27f2d 100644 --- a/tests/ref/fate/jpg-icc +++ b/tests/ref/fate/jpg-icc @@ -1,5 +1,5 @@ -b2cee4b7c68dc804cbd90fe9a0f895d5 *tests/data/fate/jpg-icc.mjpeg -11002 tests/data/fate/jpg-icc.mjpeg +1255b215e62e81bde9c09f41a5d2b558 *tests/data/fate/jpg-icc.mjpeg +11045 tests/data/fate/jpg-icc.mjpeg #tb 0: 1/25 #media_type 0: video #codec_id 0: rawvideo @@ -19,7 +19,7 @@ best_effort_timestamp_time=0.000000 duration=1 duration_time=0.040000 pkt_pos=0 -pkt_size=11002 +pkt_size=11045 width=128 height=128 crop_top=0 diff --git a/tests/ref/vsynth/vsynth1-mjpeg-422 b/tests/ref/vsynth/vsynth1-mjpeg-422 index 068ca8ee472..004c5ef1235 100644 --- a/tests/ref/vsynth/vsynth1-mjpeg-422 +++ b/tests/ref/vsynth/vsynth1-mjpeg-422 @@ -1,4 +1,4 @@ -9d81781e8ebe33607f9f158a1beb8aa6 *tests/data/fate/vsynth1-mjpeg-422.avi -1611626 tests/data/fate/vsynth1-mjpeg-422.avi +3f7bbf7f0247e8b7e4075b248d9a070b *tests/data/fate/vsynth1-mjpeg-422.avi +1613040 tests/data/fate/vsynth1-mjpeg-422.avi 9d22ef64c57b1e6a7d7e167c44ef0d6c *tests/data/fate/vsynth1-mjpeg-422.out.rawvideo stddev: 7.45 PSNR: 30.69 MAXDIFF: 63 bytes: 7603200/ 7603200 diff --git a/tests/ref/vsynth/vsynth1-mjpeg-444 b/tests/ref/vsynth/vsynth1-mjpeg-444 index 1f8e77de2d6..14d6f191edc 100644 --- a/tests/ref/vsynth/vsynth1-mjpeg-444 +++ b/tests/ref/vsynth/vsynth1-mjpeg-444 @@ -1,4 +1,4 @@ -8dc11023199b3cfa614947479feff644 *tests/data/fate/vsynth1-mjpeg-444.avi -1831038 tests/data/fate/vsynth1-mjpeg-444.avi +86c6c14ebc700ffe93e63bd70e1321d7 *tests/data/fate/vsynth1-mjpeg-444.avi +1827816 tests/data/fate/vsynth1-mjpeg-444.avi c2fcb1f3db1bb718bdbd8c95515a4802 *tests/data/fate/vsynth1-mjpeg-444.out.rawvideo stddev: 7.37 PSNR: 30.77 MAXDIFF: 63 bytes: 7603200/ 7603200 diff --git a/tests/ref/vsynth/vsynth2-mjpeg-422 b/tests/ref/vsynth/vsynth2-mjpeg-422 index ad1b88870c1..ff31b45e1e1 100644 --- a/tests/ref/vsynth/vsynth2-mjpeg-422 +++ b/tests/ref/vsynth/vsynth2-mjpeg-422 @@ -1,4 +1,4 @@ -2017bd0d5e517cf37cf9b6fd3f94ff9f *tests/data/fate/vsynth2-mjpeg-422.avi -877228 tests/data/fate/vsynth2-mjpeg-422.avi +ccdb0ac39cff1fd7ca34d06744f5e837 *tests/data/fate/vsynth2-mjpeg-422.avi +874812 tests/data/fate/vsynth2-mjpeg-422.avi 5a02998884d603f69101a49ac0099496 *tests/data/fate/vsynth2-mjpeg-422.out.rawvideo stddev: 4.69 PSNR: 34.69 MAXDIFF: 55 bytes: 7603200/ 7603200 diff --git a/tests/ref/vsynth/vsynth2-mjpeg-444 b/tests/ref/vsynth/vsynth2-mjpeg-444 index cf149fc907e..64da6f181b7 100644 --- a/tests/ref/vsynth/vsynth2-mjpeg-444 +++ b/tests/ref/vsynth/vsynth2-mjpeg-444 @@ -1,4 +1,4 @@ -2a3044c5d304b89de4dc2b553b6f36cc *tests/data/fate/vsynth2-mjpeg-444.avi -1004700 tests/data/fate/vsynth2-mjpeg-444.avi +d384cb168d1c99a0eea7b041a388c512 *tests/data/fate/vsynth2-mjpeg-444.avi +993490 tests/data/fate/vsynth2-mjpeg-444.avi f2a6c9f7e5c7d1aa0f3e36f8059695fb *tests/data/fate/vsynth2-mjpeg-444.out.rawvideo stddev: 4.57 PSNR: 34.93 MAXDIFF: 55 bytes: 7603200/ 7603200 diff --git a/tests/ref/vsynth/vsynth3-mjpeg-422 b/tests/ref/vsynth/vsynth3-mjpeg-422 index aad6db56e7e..42e8525c325 100644 --- a/tests/ref/vsynth/vsynth3-mjpeg-422 +++ b/tests/ref/vsynth/vsynth3-mjpeg-422 @@ -1,4 +1,4 @@ -90fe07b8a3290d14a99fb81b7bcbf969 *tests/data/fate/vsynth3-mjpeg-422.avi -52592 tests/data/fate/vsynth3-mjpeg-422.avi +efacee80aa88bd93cd468d4af7e9b8d6 *tests/data/fate/vsynth3-mjpeg-422.avi +49044 tests/data/fate/vsynth3-mjpeg-422.avi 11b0ffbd56600bf744973b364af4a8ee *tests/data/fate/vsynth3-mjpeg-422.out.rawvideo stddev: 8.23 PSNR: 29.82 MAXDIFF: 58 bytes: 86700/ 86700 diff --git a/tests/ref/vsynth/vsynth3-mjpeg-444 b/tests/ref/vsynth/vsynth3-mjpeg-444 index 9c8afded150..02a79641ffb 100644 --- a/tests/ref/vsynth/vsynth3-mjpeg-444 +++ b/tests/ref/vsynth/vsynth3-mjpeg-444 @@ -1,4 +1,4 @@ -037c97f4c298442c2fd8c08e8497e06c *tests/data/fate/vsynth3-mjpeg-444.avi -53946 tests/data/fate/vsynth3-mjpeg-444.avi +30e416ad3762b8e0dae4425bb5b3cc91 *tests/data/fate/vsynth3-mjpeg-444.avi +49958 tests/data/fate/vsynth3-mjpeg-444.avi 5ef0cde1ae541744a34057f42cecd3d8 *tests/data/fate/vsynth3-mjpeg-444.out.rawvideo stddev: 8.21 PSNR: 29.84 MAXDIFF: 58 bytes: 86700/ 86700 diff --git a/tests/ref/vsynth/vsynth_lena-mjpeg-422 b/tests/ref/vsynth/vsynth_lena-mjpeg-422 index 9cb59f64b82..5aaf2251dd1 100644 --- a/tests/ref/vsynth/vsynth_lena-mjpeg-422 +++ b/tests/ref/vsynth/vsynth_lena-mjpeg-422 @@ -1,4 +1,4 @@ -fde3250911dbb7f1a5ed7cd385d92b2f *tests/data/fate/vsynth_lena-mjpeg-422.avi -707096 tests/data/fate/vsynth_lena-mjpeg-422.avi +a966b2222acbe8599fb044591a992716 *tests/data/fate/vsynth_lena-mjpeg-422.avi +712066 tests/data/fate/vsynth_lena-mjpeg-422.avi bc3811ab5fdb33cef828465d3d056903 *tests/data/fate/vsynth_lena-mjpeg-422.out.rawvideo stddev: 4.18 PSNR: 35.70 MAXDIFF: 49 bytes: 7603200/ 7603200 diff --git a/tests/ref/vsynth/vsynth_lena-mjpeg-444 b/tests/ref/vsynth/vsynth_lena-mjpeg-444 index 6a29d6195c6..9202fde5404 100644 --- a/tests/ref/vsynth/vsynth_lena-mjpeg-444 +++ b/tests/ref/vsynth/vsynth_lena-mjpeg-444 @@ -1,4 +1,4 @@ -708d7eb504c7f12f7934618a532a7441 *tests/data/fate/vsynth_lena-mjpeg-444.avi -807234 tests/data/fate/vsynth_lena-mjpeg-444.avi +0fc3ea198b2494e1a9942215024dd47e *tests/data/fate/vsynth_lena-mjpeg-444.avi +812110 tests/data/fate/vsynth_lena-mjpeg-444.avi 46ffd78d0fe6fe5ebe22cca3e64fbe26 *tests/data/fate/vsynth_lena-mjpeg-444.out.rawvideo stddev: 4.05 PSNR: 35.96 MAXDIFF: 49 bytes: 7603200/ 7603200 -- 2.54.0 _______________________________________________ ffmpeg-devel mailing list -- [email protected] To unsubscribe send an email to [email protected]
