1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2025-08-04 22:03:09 +02:00

avcodec/mpegvideo_enc: Don't set qscale_table value prematurely

When there are multiple candidates for macroblock type, the encoder
tries them all. In order to do so, it keeps several sets of states
containing the variables that get modified when encoding
the macroblock and in the end uses the best of these.

Yet one variable was set, but not included in this state:
The current macroblock's qscale value in the current picture's
qscale_table. This may currently be set multiple times in
mpv_reconstruct_mb(), yet it is read when adaptive_quant is true.
Currently, the value read can be the value set by the last attempt
to write the current macroblock and not the initial value.

Fix this by only setting the qscale_table value in one place
outside of mpv_reconstruct_mb() (where it does not belong at all).

Reviewed-by: Ramiro Polla <ramiro.polla@gmail.com>
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
This commit is contained in:
Andreas Rheinhardt
2024-06-30 16:04:13 +02:00
parent 3e9777dc75
commit ab768b88e0
6 changed files with 32 additions and 36 deletions

View File

@ -1118,10 +1118,6 @@ static inline void add_dequant_dct(MpegEncContext *s,
*/
static void mpv_reconstruct_mb(MpegEncContext *s, int16_t block[12][64])
{
const int mb_xy = s->mb_y * s->mb_stride + s->mb_x;
s->cur_pic.qscale_table[mb_xy] = s->qscale;
if (s->avctx->debug & FF_DEBUG_DCT_COEFF) {
/* print DCT coefficients */
av_log(s->avctx, AV_LOG_DEBUG, "DCT coeffs of MB at %dx%d:\n", s->mb_x, s->mb_y);
@ -3382,8 +3378,6 @@ static int encode_thread(AVCodecContext *c, void *arg){
}
}
s->cur_pic.qscale_table[xy] = best_s.qscale;
copy_context_after_encode(s, &best_s);
pb_bits_count= put_bits_count(&s->pb);
@ -3538,6 +3532,8 @@ static int encode_thread(AVCodecContext *c, void *arg){
mpv_reconstruct_mb(s, s->block);
}
s->cur_pic.qscale_table[xy] = s->qscale;
/* clean the MV table in IPS frames for direct mode in B-frames */
if(s->mb_intra /* && I,P,S_TYPE */){
s->p_mv_table[xy][0]=0;

View File

@ -2,45 +2,45 @@ ret: 0 st: 0 flags:1 dts: 0.000000 pts: NOPTS pos: 5652 size: 6855
ret: 0 st:-1 flags:0 ts:-1.000000
ret: 0 st: 0 flags:1 dts: 0.000000 pts: NOPTS pos: 5652 size: 6855
ret: 0 st:-1 flags:1 ts: 1.894167
ret: 0 st: 0 flags:1 dts: 1.840000 pts: NOPTS pos: 161318 size: 19176
ret: 0 st: 0 flags:1 dts: 1.840000 pts: NOPTS pos: 161352 size: 19191
ret: 0 st: 0 flags:0 ts: 0.800000
ret: 0 st: 0 flags:1 dts: 0.880000 pts: NOPTS pos: 75056 size: 19178
ret: 0 st: 0 flags:1 dts: 0.880000 pts: NOPTS pos: 75104 size: 19178
ret:-1 st: 0 flags:1 ts:-0.320000
ret:-1 st:-1 flags:0 ts: 2.576668
ret: 0 st:-1 flags:1 ts: 1.470835
ret: 0 st: 0 flags:1 dts: 1.360000 pts: NOPTS pos: 118696 size: 20018
ret: 0 st: 0 flags:1 dts: 1.360000 pts: NOPTS pos: 118586 size: 20060
ret: 0 st: 0 flags:0 ts: 0.360000
ret: 0 st: 0 flags:1 dts: 0.400000 pts: NOPTS pos: 35800 size: 17261
ret: 0 st: 0 flags:1 dts: 0.400000 pts: NOPTS pos: 35840 size: 17261
ret:-1 st: 0 flags:1 ts:-0.760000
ret:-1 st:-1 flags:0 ts: 2.153336
ret: 0 st:-1 flags:1 ts: 1.047503
ret: 0 st: 0 flags:1 dts: 0.880000 pts: NOPTS pos: 75056 size: 19178
ret: 0 st: 0 flags:1 dts: 0.880000 pts: NOPTS pos: 75104 size: 19178
ret: 0 st: 0 flags:0 ts:-0.040000
ret: 0 st: 0 flags:1 dts: 0.000000 pts: NOPTS pos: 5652 size: 6855
ret: 0 st: 0 flags:1 ts: 2.840000
ret: 0 st: 0 flags:1 dts: 1.840000 pts: NOPTS pos: 161318 size: 19176
ret: 0 st: 0 flags:1 dts: 1.840000 pts: NOPTS pos: 161352 size: 19191
ret: 0 st:-1 flags:0 ts: 1.730004
ret: 0 st: 0 flags:1 dts: 1.840000 pts: NOPTS pos: 161318 size: 19176
ret: 0 st: 0 flags:1 dts: 1.840000 pts: NOPTS pos: 161352 size: 19191
ret: 0 st:-1 flags:1 ts: 0.624171
ret: 0 st: 0 flags:1 dts: 0.400000 pts: NOPTS pos: 35800 size: 17261
ret: 0 st: 0 flags:1 dts: 0.400000 pts: NOPTS pos: 35840 size: 17261
ret: 0 st: 0 flags:0 ts:-0.480000
ret: 0 st: 0 flags:1 dts: 0.000000 pts: NOPTS pos: 5652 size: 6855
ret: 0 st: 0 flags:1 ts: 2.400000
ret: 0 st: 0 flags:1 dts: 1.840000 pts: NOPTS pos: 161318 size: 19176
ret: 0 st: 0 flags:1 dts: 1.840000 pts: NOPTS pos: 161352 size: 19191
ret: 0 st:-1 flags:0 ts: 1.306672
ret: 0 st: 0 flags:1 dts: 1.360000 pts: NOPTS pos: 118696 size: 20018
ret: 0 st: 0 flags:1 dts: 1.360000 pts: NOPTS pos: 118586 size: 20060
ret: 0 st:-1 flags:1 ts: 0.200839
ret: 0 st: 0 flags:1 dts: 0.000000 pts: NOPTS pos: 5652 size: 6855
ret: 0 st: 0 flags:0 ts:-0.920000
ret: 0 st: 0 flags:1 dts: 0.000000 pts: NOPTS pos: 5652 size: 6855
ret: 0 st: 0 flags:1 ts: 2.000000
ret: 0 st: 0 flags:1 dts: 1.840000 pts: NOPTS pos: 161318 size: 19176
ret: 0 st: 0 flags:1 dts: 1.840000 pts: NOPTS pos: 161352 size: 19191
ret: 0 st:-1 flags:0 ts: 0.883340
ret: 0 st: 0 flags:1 dts: 0.880000 pts: NOPTS pos: 75056 size: 19178
ret: 0 st: 0 flags:1 dts: 0.880000 pts: NOPTS pos: 75104 size: 19178
ret:-1 st:-1 flags:1 ts:-0.222493
ret:-1 st: 0 flags:0 ts: 2.680000
ret: 0 st: 0 flags:1 ts: 1.560000
ret: 0 st: 0 flags:1 dts: 1.360000 pts: NOPTS pos: 118696 size: 20018
ret: 0 st: 0 flags:1 dts: 1.360000 pts: NOPTS pos: 118586 size: 20060
ret: 0 st:-1 flags:0 ts: 0.460008
ret: 0 st: 0 flags:1 dts: 0.880000 pts: NOPTS pos: 75056 size: 19178
ret: 0 st: 0 flags:1 dts: 0.880000 pts: NOPTS pos: 75104 size: 19178
ret:-1 st:-1 flags:1 ts:-0.645825

View File

@ -1,4 +1,4 @@
0f1cbbdc3f9b91f2d9ac3d1fc2cf7d4e *tests/data/fate/vsynth1-mpeg4-adap.avi
325518 tests/data/fate/vsynth1-mpeg4-adap.avi
1e6c596f9f491fbf15920ef1bace7fb8 *tests/data/fate/vsynth1-mpeg4-adap.out.rawvideo
stddev: 14.12 PSNR: 25.13 MAXDIFF: 184 bytes: 7603200/ 7603200
3b4fe7ad106cb112364d062b20ad80a8 *tests/data/fate/vsynth1-mpeg4-adap.avi
325594 tests/data/fate/vsynth1-mpeg4-adap.avi
96c5a7759413ab24afaa926abb3c5fe0 *tests/data/fate/vsynth1-mpeg4-adap.out.rawvideo
stddev: 14.11 PSNR: 25.13 MAXDIFF: 184 bytes: 7603200/ 7603200

View File

@ -1,4 +1,4 @@
9465ef120d560537d8fcfb5564782e01 *tests/data/fate/vsynth2-mpeg4-adap.avi
203004 tests/data/fate/vsynth2-mpeg4-adap.avi
d7851ab1ca9744f8e618a24193e5ef76 *tests/data/fate/vsynth2-mpeg4-adap.out.rawvideo
stddev: 4.56 PSNR: 34.95 MAXDIFF: 84 bytes: 7603200/ 7603200
21d205e0f42ce613481b202d52593225 *tests/data/fate/vsynth2-mpeg4-adap.avi
202870 tests/data/fate/vsynth2-mpeg4-adap.avi
1c45877fe27fb5fbfcdaff4a1da94de4 *tests/data/fate/vsynth2-mpeg4-adap.out.rawvideo
stddev: 4.55 PSNR: 34.95 MAXDIFF: 84 bytes: 7603200/ 7603200

View File

@ -1,4 +1,4 @@
6b2f641f2e68b11b992fd6ba1ed66a21 *tests/data/fate/vsynth3-mpeg4-adap.avi
41012 tests/data/fate/vsynth3-mpeg4-adap.avi
3483a2032cb02c3a37f5e43b128e59ed *tests/data/fate/vsynth3-mpeg4-adap.out.rawvideo
stddev: 5.79 PSNR: 32.87 MAXDIFF: 49 bytes: 86700/ 86700
10512ee1a666ed95643557e1cf699363 *tests/data/fate/vsynth3-mpeg4-adap.avi
41100 tests/data/fate/vsynth3-mpeg4-adap.avi
9ba2c3cab3f08d2a345b849d0b30e3e1 *tests/data/fate/vsynth3-mpeg4-adap.out.rawvideo
stddev: 5.79 PSNR: 32.88 MAXDIFF: 49 bytes: 86700/ 86700

View File

@ -1,4 +1,4 @@
633da125f46391eef33bb031cd728f4b *tests/data/fate/vsynth_lena-mpeg4-adap.avi
187598 tests/data/fate/vsynth_lena-mpeg4-adap.avi
21312bfcb28c40299fb27a5b03477f8c *tests/data/fate/vsynth_lena-mpeg4-adap.out.rawvideo
stddev: 3.63 PSNR: 36.92 MAXDIFF: 71 bytes: 7603200/ 7603200
5af033cfe87bc2abf688b602e5a1a35c *tests/data/fate/vsynth_lena-mpeg4-adap.avi
187652 tests/data/fate/vsynth_lena-mpeg4-adap.avi
515efcfb456cf7b460f356fe0dc7c808 *tests/data/fate/vsynth_lena-mpeg4-adap.out.rawvideo
stddev: 3.63 PSNR: 36.93 MAXDIFF: 71 bytes: 7603200/ 7603200