Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
 help / color / mirror / Atom feed
* [FFmpeg-devel] [PATCH] avcodec/amv: use correct quantize tables
@ 2023-04-09  8:20 AlexGuo1998
  2023-04-09  8:37 ` AlexGuo1998
  0 siblings, 1 reply; 5+ messages in thread
From: AlexGuo1998 @ 2023-04-09  8:20 UTC (permalink / raw)
  To: ffmpeg-devel

The official encoder has a mode to generate mjpeg AVI files, which
embeds the correct quantize table. Change the table we use (both encoder
and decoder) to match that.

Signed-off-by: AlexGuo1998 <AlexGuo1998@163.com>
---
 libavcodec/mpegvideo_enc.c | 16 +++++++---------
 libavcodec/sp5x.h          | 21 +++++++++++++++++++++
 libavcodec/sp5xdec.c       |  9 +++++++--
 3 files changed, 35 insertions(+), 11 deletions(-)

diff --git a/libavcodec/mpegvideo_enc.c b/libavcodec/mpegvideo_enc.c
index 7d3c8875f2..5592095ed2 100644
--- a/libavcodec/mpegvideo_enc.c
+++ b/libavcodec/mpegvideo_enc.c
@@ -2878,9 +2878,9 @@ static int encode_thread(AVCodecContext *c, void *arg){
         s->encoding_error[i] = 0;
     }
     if(s->codec_id==AV_CODEC_ID_AMV){
-        s->last_dc[0] = 128*8/13;
-        s->last_dc[1] = 128*8/14;
-        s->last_dc[2] = 128*8/14;
+        s->last_dc[0] = 128*8/8;
+        s->last_dc[1] = 128*8/9;
+        s->last_dc[2] = 128*8/9;
     }
     s->mb_skip_run = 0;
     memset(s->last_mv, 0, sizeof(s->last_mv));
@@ -3755,18 +3755,16 @@ static int encode_picture(MpegEncContext *s)
         s->qscale= 8;

         if (s->codec_id == AV_CODEC_ID_AMV) {
-            static const uint8_t y[32] =
{13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13};
-            static const uint8_t c[32] =
{14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14};
+            static const uint8_t y[32] =
{8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8};
+            static const uint8_t c[32] =
{9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9};
             for (int i = 1; i < 64; i++) {
                 int j = s->idsp.idct_permutation[ff_zigzag_direct[i]];

-                s->intra_matrix[j]        = sp5x_qscale_five_quant_table[0][i];
-                s->chroma_intra_matrix[j] = sp5x_qscale_five_quant_table[1][i];
+                s->intra_matrix[j]        = amv_quant_table[0][i];
+                s->chroma_intra_matrix[j] = amv_quant_table[1][i];
             }
             s->y_dc_scale_table = y;
             s->c_dc_scale_table = c;
-            s->intra_matrix[0] = 13;
-            s->chroma_intra_matrix[0] = 14;
             ff_convert_matrix(s, s->q_intra_matrix, s->q_intra_matrix16,
                               s->intra_matrix, s->intra_quant_bias, 8, 8, 1);
             ff_convert_matrix(s, s->q_chroma_intra_matrix,
s->q_chroma_intra_matrix16,
diff --git a/libavcodec/sp5x.h b/libavcodec/sp5x.h
index d84d851768..4646914235 100644
--- a/libavcodec/sp5x.h
+++ b/libavcodec/sp5x.h
@@ -145,4 +145,25 @@ static const uint8_t sp5x_qscale_five_quant_table[][64]=
        79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79 },
 };

+static const uint8_t amv_quant_table[][64] =
+{
+    /* AMV: always constant quantize table */
+    {   0x08, 0x06, 0x06, 0x07, 0x06, 0x05, 0x08, 0x07,
+        0x07, 0x07, 0x09, 0x09, 0x08, 0x0A, 0x0C, 0x14,
+        0x0D, 0x0C, 0x0B, 0x0B, 0x0C, 0x19, 0x12, 0x13,
+        0x0F, 0x14, 0x1D, 0x1A, 0x1F, 0x1E, 0x1D, 0x1A,
+        0x1C, 0x1C, 0x20, 0x24, 0x2E, 0x27, 0x20, 0x22,
+        0x2C, 0x23, 0x1C, 0x1C, 0x28, 0x37, 0x29, 0x2C,
+        0x30, 0x31, 0x34, 0x34, 0x34, 0x1F, 0x27, 0x39,
+        0x3D, 0x38, 0x32, 0x3C, 0x2E, 0x33, 0x34, 0x32 },
+    {   0x09, 0x09, 0x09, 0x0C, 0x0B, 0x0C, 0x18, 0x0D,
+        0x0D, 0x18, 0x32, 0x21, 0x1C, 0x21, 0x32, 0x32,
+        0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32,
+        0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32,
+        0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32,
+        0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32,
+        0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32,
+        0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32 },
+};
+
 #endif /* AVCODEC_SP5X_H */
diff --git a/libavcodec/sp5xdec.c b/libavcodec/sp5xdec.c
index dfed725500..8c8b4f67fa 100644
--- a/libavcodec/sp5xdec.c
+++ b/libavcodec/sp5xdec.c
@@ -55,8 +55,13 @@ static int sp5x_decode_frame(AVCodecContext *avctx,
     recoded[j++] = 0xD8;

     memcpy(recoded+j, &sp5x_data_dqt[0], sizeof(sp5x_data_dqt));
-    memcpy(recoded + j + 5,  &sp5x_qscale_five_quant_table[0], 64);
-    memcpy(recoded + j + 70, &sp5x_qscale_five_quant_table[1], 64);
+    if (avctx->codec_id==AV_CODEC_ID_AMV) {
+        memcpy(recoded + j + 5,  &amv_quant_table[0], 64);
+        memcpy(recoded + j + 70, &amv_quant_table[1], 64);
+    } else {
+        memcpy(recoded + j + 5,  &sp5x_qscale_five_quant_table[0], 64);
+        memcpy(recoded + j + 70, &sp5x_qscale_five_quant_table[1], 64);
+    }
     j += sizeof(sp5x_data_dqt);

     memcpy(recoded+j, &sp5x_data_dht[0], sizeof(sp5x_data_dht));
-- 
2.40.0.windows.1
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2023-04-10 14:17 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-04-09  8:20 [FFmpeg-devel] [PATCH] avcodec/amv: use correct quantize tables AlexGuo1998
2023-04-09  8:37 ` AlexGuo1998
2023-04-09 23:42   ` Michael Niedermayer
2023-04-10  4:09     ` AlexGuo1998
2023-04-10 14:17       ` Michael Niedermayer

Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

This inbox may be cloned and mirrored by anyone:

	git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \
		ffmpegdev@gitmailbox.com
	public-inbox-index ffmpegdev

Example config snippet for mirrors.


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git