Commit ceb9a33b authored by Devarsh Thakkar's avatar Devarsh Thakkar Committed by Hans Verkuil

media: imagination: Use exported tables from v4l2-jpeg core

Use exported huffman and quantization tables from v4l2-jpeg core library.
Signed-off-by: default avatarDevarsh Thakkar <devarsht@ti.com>
Signed-off-by: default avatarSebastian Fricke <sebastian.fricke@collabora.com>
Signed-off-by: default avatarHans Verkuil <hverkuil-cisco@xs4all.nl>
parent 7dfa3259
...@@ -5,6 +5,7 @@ config VIDEO_E5010_JPEG_ENC ...@@ -5,6 +5,7 @@ config VIDEO_E5010_JPEG_ENC
select VIDEOBUF2_DMA_CONTIG select VIDEOBUF2_DMA_CONTIG
select VIDEOBUF2_VMALLOC select VIDEOBUF2_VMALLOC
select V4L2_MEM2MEM_DEV select V4L2_MEM2MEM_DEV
select V4L2_JPEG_HELPER
help help
This is a video4linux2 M2M driver for Imagination E5010 JPEG encoder, This is a video4linux2 M2M driver for Imagination E5010 JPEG encoder,
which supports JPEG and MJPEG baseline encoding of YUV422 and YUV420 which supports JPEG and MJPEG baseline encoding of YUV422 and YUV420
......
...@@ -32,116 +32,6 @@ ...@@ -32,116 +32,6 @@
#include "e5010-jpeg-enc.h" #include "e5010-jpeg-enc.h"
#include "e5010-jpeg-enc-hw.h" #include "e5010-jpeg-enc-hw.h"
/* Luma and chroma qp table to achieve 50% compression quality
* This is as per example in Annex K.1 of ITU-T.81
*/
static const u8 luma_q_table[64] = {
16, 11, 10, 16, 24, 40, 51, 61,
12, 12, 14, 19, 26, 58, 60, 55,
14, 13, 16, 24, 40, 57, 69, 56,
14, 17, 22, 29, 51, 87, 80, 62,
18, 22, 37, 56, 68, 109, 103, 77,
24, 35, 55, 64, 81, 104, 113, 92,
49, 64, 78, 87, 103, 121, 120, 101,
72, 92, 95, 98, 112, 100, 103, 99
};
static const u8 chroma_q_table[64] = {
17, 18, 24, 47, 99, 99, 99, 99,
18, 21, 26, 66, 99, 99, 99, 99,
24, 26, 56, 99, 99, 99, 99, 99,
47, 66, 99, 99, 99, 99, 99, 99,
99, 99, 99, 99, 99, 99, 99, 99,
99, 99, 99, 99, 99, 99, 99, 99,
99, 99, 99, 99, 99, 99, 99, 99,
99, 99, 99, 99, 99, 99, 99, 99
};
/* Zigzag scan pattern */
static const u8 zigzag[64] = {
0, 1, 8, 16, 9, 2, 3, 10,
17, 24, 32, 25, 18, 11, 4, 5,
12, 19, 26, 33, 40, 48, 41, 34,
27, 20, 13, 6, 7, 14, 21, 28,
35, 42, 49, 56, 57, 50, 43, 36,
29, 22, 15, 23, 30, 37, 44, 51,
58, 59, 52, 45, 38, 31, 39, 46,
53, 60, 61, 54, 47, 55, 62, 63
};
/*
* Contains the data that needs to be sent in the marker segment of an interchange format JPEG
* stream or an abbreviated format table specification data stream.
* Specifies the huffman table used for encoding the luminance DC coefficient differences.
* The table represents Table K.3 of ITU-T.81
*/
static const u8 luma_dc_table[] = {
0x00, 0x01, 0x05, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B
};
/*
* Contains the data that needs to be sent in the marker segment of an interchange format JPEG
* stream or an abbreviated format table specification data stream.
* Specifies the huffman table used for encoding the luminance AC coefficients.
* The table represents Table K.5 of ITU-T.81
*/
static const u8 luma_ac_table[] = {
0x00, 0x02, 0x01, 0x03, 0x03, 0x02, 0x04, 0x03,
0x05, 0x05, 0x04, 0x04, 0x00, 0x00, 0x01, 0x7D,
0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12, 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61,
0x07, 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xA1, 0x08, 0x23, 0x42, 0xB1, 0xC1, 0x15, 0x52,
0xD1, 0xF0, 0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0A, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x25,
0x26, 0x27, 0x28, 0x29, 0x2A, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x43, 0x44, 0x45,
0x46, 0x47, 0x48, 0x49, 0x4A, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x63, 0x64,
0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x83,
0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99,
0x9A, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6,
0xB7, 0xB8, 0xB9, 0xBA, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xD2, 0xD3,
0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8,
0xE9, 0xEA, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA
};
/*
* Contains the data that needs to be sent in the marker segment of an interchange format JPEG
* stream or an abbreviated format table specification data stream.
* Specifies the huffman table used for encoding the chrominance DC coefficient differences.
* The table represents Table K.4 of ITU-T.81
*/
static const u8 chroma_dc_table[] = {
0x00, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B
};
/*
* Contains the data that needs to be sent in the marker segment of an interchange format JPEG
* stream or an abbreviated format table specification data stream.
* Specifies the huffman table used for encoding the chrominance AC coefficients.
* The table represents Table K.6 of ITU-T.81
*/
static const u8 chroma_ac_table[] = {
0x00, 0x02, 0x01, 0x02, 0x04, 0x04, 0x03, 0x04,
0x07, 0x05, 0x04, 0x04, 0x00, 0x01, 0x02, 0x77,
0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21, 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61,
0x71, 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91, 0xA1, 0xB1, 0xC1, 0x09, 0x23, 0x33,
0x52, 0xF0, 0x15, 0x62, 0x72, 0xD1, 0x0A, 0x16, 0x24, 0x34, 0xE1, 0x25, 0xF1, 0x17, 0x18,
0x19, 0x1A, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x43, 0x44,
0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x63,
0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A,
0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
0x98, 0x99, 0x9A, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xB2, 0xB3, 0xB4,
0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA,
0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7,
0xE8, 0xE9, 0xEA, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA
};
#define JPEG_LUM_HT 0x00
#define JPEG_CHR_HT 0x01
#define JPEG_DC_HT 0x00
#define JPEG_AC_HT 0x10
/* forward declarations */ /* forward declarations */
static const struct of_device_id e5010_of_match[]; static const struct of_device_id e5010_of_match[];
...@@ -281,15 +171,15 @@ static void calculate_qp_tables(struct e5010_context *ctx) ...@@ -281,15 +171,15 @@ static void calculate_qp_tables(struct e5010_context *ctx)
contrast *= INCREASE; contrast *= INCREASE;
} }
for (i = 0; i < ARRAY_SIZE(luma_q_table); i++) { for (i = 0; i < V4L2_JPEG_PIXELS_IN_BLOCK; i++) {
long long delta = chroma_q_table[i] * contrast + luminosity; long long delta = v4l2_jpeg_ref_table_chroma_qt[i] * contrast + luminosity;
int val = (int)(chroma_q_table[i] + delta); int val = (int)(v4l2_jpeg_ref_table_chroma_qt[i] + delta);
clamp(val, 1, 255); clamp(val, 1, 255);
ctx->chroma_qp[i] = quality == -50 ? 1 : val; ctx->chroma_qp[i] = quality == -50 ? 1 : val;
delta = luma_q_table[i] * contrast + luminosity; delta = v4l2_jpeg_ref_table_luma_qt[i] * contrast + luminosity;
val = (int)(luma_q_table[i] + delta); val = (int)(v4l2_jpeg_ref_table_luma_qt[i] + delta);
clamp(val, 1, 255); clamp(val, 1, 255);
ctx->luma_qp[i] = quality == -50 ? 1 : val; ctx->luma_qp[i] = quality == -50 ? 1 : val;
} }
...@@ -931,38 +821,39 @@ static void encode_marker_segment(struct e5010_context *ctx, void *addr, unsigne ...@@ -931,38 +821,39 @@ static void encode_marker_segment(struct e5010_context *ctx, void *addr, unsigne
header_write(ctx, buffer, offset, 2, START_OF_IMAGE); header_write(ctx, buffer, offset, 2, START_OF_IMAGE);
header_write(ctx, buffer, offset, 2, DQT_MARKER); header_write(ctx, buffer, offset, 2, DQT_MARKER);
header_write(ctx, buffer, offset, 3, LQPQ << 4); header_write(ctx, buffer, offset, 3, LQPQ << 4);
for (i = 0; i < PELS_IN_BLOCK; i++) for (i = 0; i < V4L2_JPEG_PIXELS_IN_BLOCK; i++)
header_write(ctx, buffer, offset, 1, ctx->luma_qp[zigzag[i]]); header_write(ctx, buffer, offset, 1, ctx->luma_qp[v4l2_jpeg_zigzag_scan_index[i]]);
header_write(ctx, buffer, offset, 2, DQT_MARKER); header_write(ctx, buffer, offset, 2, DQT_MARKER);
header_write(ctx, buffer, offset, 3, (LQPQ << 4) | 1); header_write(ctx, buffer, offset, 3, (LQPQ << 4) | 1);
for (i = 0; i < PELS_IN_BLOCK; i++) for (i = 0; i < V4L2_JPEG_PIXELS_IN_BLOCK; i++)
header_write(ctx, buffer, offset, 1, ctx->chroma_qp[zigzag[i]]); header_write(ctx, buffer, offset, 1,
ctx->chroma_qp[v4l2_jpeg_zigzag_scan_index[i]]);
/* Huffman tables */ /* Huffman tables */
header_write(ctx, buffer, offset, 2, DHT_MARKER); header_write(ctx, buffer, offset, 2, DHT_MARKER);
header_write(ctx, buffer, offset, 2, LH_DC); header_write(ctx, buffer, offset, 2, LH_DC);
header_write(ctx, buffer, offset, 1, JPEG_LUM_HT | JPEG_DC_HT); header_write(ctx, buffer, offset, 1, V4L2_JPEG_LUM_HT | V4L2_JPEG_DC_HT);
for (i = 0 ; i < ARRAY_SIZE(luma_dc_table); i++) for (i = 0 ; i < V4L2_JPEG_REF_HT_DC_LEN; i++)
header_write(ctx, buffer, offset, 1, luma_dc_table[i]); header_write(ctx, buffer, offset, 1, v4l2_jpeg_ref_table_luma_dc_ht[i]);
header_write(ctx, buffer, offset, 2, DHT_MARKER); header_write(ctx, buffer, offset, 2, DHT_MARKER);
header_write(ctx, buffer, offset, 2, LH_AC); header_write(ctx, buffer, offset, 2, LH_AC);
header_write(ctx, buffer, offset, 1, JPEG_LUM_HT | JPEG_AC_HT); header_write(ctx, buffer, offset, 1, V4L2_JPEG_LUM_HT | V4L2_JPEG_AC_HT);
for (i = 0 ; i < ARRAY_SIZE(luma_ac_table); i++) for (i = 0 ; i < V4L2_JPEG_REF_HT_AC_LEN; i++)
header_write(ctx, buffer, offset, 1, luma_ac_table[i]); header_write(ctx, buffer, offset, 1, v4l2_jpeg_ref_table_luma_ac_ht[i]);
header_write(ctx, buffer, offset, 2, DHT_MARKER); header_write(ctx, buffer, offset, 2, DHT_MARKER);
header_write(ctx, buffer, offset, 2, LH_DC); header_write(ctx, buffer, offset, 2, LH_DC);
header_write(ctx, buffer, offset, 1, JPEG_CHR_HT | JPEG_DC_HT); header_write(ctx, buffer, offset, 1, V4L2_JPEG_CHR_HT | V4L2_JPEG_DC_HT);
for (i = 0 ; i < ARRAY_SIZE(chroma_dc_table); i++) for (i = 0 ; i < V4L2_JPEG_REF_HT_DC_LEN; i++)
header_write(ctx, buffer, offset, 1, chroma_dc_table[i]); header_write(ctx, buffer, offset, 1, v4l2_jpeg_ref_table_chroma_dc_ht[i]);
header_write(ctx, buffer, offset, 2, DHT_MARKER); header_write(ctx, buffer, offset, 2, DHT_MARKER);
header_write(ctx, buffer, offset, 2, LH_AC); header_write(ctx, buffer, offset, 2, LH_AC);
header_write(ctx, buffer, offset, 1, JPEG_CHR_HT | JPEG_AC_HT); header_write(ctx, buffer, offset, 1, V4L2_JPEG_CHR_HT | V4L2_JPEG_AC_HT);
for (i = 0 ; i < ARRAY_SIZE(chroma_ac_table); i++) for (i = 0 ; i < V4L2_JPEG_REF_HT_AC_LEN; i++)
header_write(ctx, buffer, offset, 1, chroma_ac_table[i]); header_write(ctx, buffer, offset, 1, v4l2_jpeg_ref_table_chroma_ac_ht[i]);
} }
static void encode_frame_header(struct e5010_context *ctx, void *addr, unsigned int *offset) static void encode_frame_header(struct e5010_context *ctx, void *addr, unsigned int *offset)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment