76 struct vlc_src_table {
int c_q, rho, u_off, e_k, e_1, cwd, cwd_len; };
77 vlc_src_table tbl0[] = {
80 size_t tbl0_size =
sizeof(tbl0) /
sizeof(vlc_src_table);
82 si32 pattern_popcnt[16];
83 for (
ui32 i = 0; i < 16; ++i)
86 vlc_src_table* src_tbl = tbl0;
88 size_t tbl_size = tbl0_size;
89 for (
int i = 0; i < 2048; ++i)
91 int c_q = i >> 8, rho = (i >> 4) & 0xF, emb = i & 0xF;
92 if (((emb & rho) != emb) || (rho == 0 && c_q == 0))
96 vlc_src_table *best_entry = NULL;
100 for (
size_t j = 0; j < tbl_size; ++j)
102 if (src_tbl[j].c_q == c_q && src_tbl[j].rho == rho)
103 if (src_tbl[j].u_off == 1)
104 if ((emb & src_tbl[j].e_k) == src_tbl[j].e_1)
108 int ones_count = pattern_popcnt[src_tbl[j].e_k];
109 if (ones_count >= best_e_k)
111 best_entry = src_tbl + j;
112 best_e_k = ones_count;
119 for (
size_t j = 0; j < tbl_size; ++j)
121 if (src_tbl[j].c_q == c_q && src_tbl[j].rho == rho)
122 if (src_tbl[j].u_off == 0)
124 best_entry = src_tbl + j;
130 tgt_tbl[i] = (
ui16)((best_entry->cwd<<8) + (best_entry->cwd_len<<4)
135 vlc_src_table tbl1[] = {
138 size_t tbl1_size =
sizeof(tbl1) /
sizeof(vlc_src_table);
142 tbl_size = tbl1_size;
143 for (
int i = 0; i < 2048; ++i)
145 int c_q = i >> 8, rho = (i >> 4) & 0xF, emb = i & 0xF;
146 if (((emb & rho) != emb) || (rho == 0 && c_q == 0))
150 vlc_src_table *best_entry = NULL;
154 for (
size_t j = 0; j < tbl_size; ++j)
156 if (src_tbl[j].c_q == c_q && src_tbl[j].rho == rho)
157 if (src_tbl[j].u_off == 1)
158 if ((emb & src_tbl[j].e_k) == src_tbl[j].e_1)
162 int ones_count = pattern_popcnt[src_tbl[j].e_k];
163 if (ones_count >= best_e_k)
165 best_entry = src_tbl + j;
166 best_e_k = ones_count;
173 for (
size_t j = 0; j < tbl_size; ++j)
175 if (src_tbl[j].c_q == c_q && src_tbl[j].rho == rho)
176 if (src_tbl[j].u_off == 0)
178 best_entry = src_tbl + j;
184 tgt_tbl[i] = (
ui16)((best_entry->cwd<<8) + (best_entry->cwd_len<<4)
207 for (
int i = 5; i < 33; ++i)
256 assert(v == 0 || v == 1);
257 melp->
tmp = (melp->
tmp << 1) + v;
262 OJPH_ERROR(0x00020001,
"mel encoder's buffer is full");
275 static const int mel_exp[13] = {0,0,0,1,1,1,2,2,2,3,3,4,5};
291 int t = mel_exp[melp->
k];
318 vlcp->
buf = data + buffer_size - 1;
335 OJPH_ERROR(0x00020002,
"vlc encoder's buffer is full");
338 int t =
ojph_min(avail_bits, cwd_len);
371 int vlc_mask = 0xFF >> (8 - vlcp->
used_bits);
372 if ((mel_mask | vlc_mask) == 0)
376 OJPH_ERROR(0x00020003,
"mel encoder's buffer is full");
377 int fuse = melp->
tmp | vlcp->
tmp;
378 if ( ( ((fuse ^ melp->
tmp) & mel_mask)
379 | ((fuse ^ vlcp->
tmp) & vlc_mask) ) == 0
380 && (fuse != 0xFF) && vlcp->
pos > 1)
387 OJPH_ERROR(0x00020004,
"vlc encoder's buffer is full");
427 OJPH_ERROR(0x00020005,
"magnitude sign encoder's buffer is full");
452 if (msp->
tmp != 0xFF)
455 OJPH_ERROR(0x00020006,
"magnitude sign encoder's buffer is full");
476 assert(num_passes == 1);
478 const int ms_size = (16384*16+14)/15;
480 const int mel_vlc_size = 3072;
481 ui8 mel_vlc_buf[mel_vlc_size];
482 const int mel_size = 192;
483 ui8 *mel_buf = mel_vlc_buf;
484 const int vlc_size = mel_vlc_size - mel_size;
485 ui8 *vlc_buf = mel_vlc_buf + mel_size;
494 ui32 p = 30 - missing_msbs;
507 ui8* lep = e_val; lep[0] = 0;
508 ui8* lcxp = cx_val; lcxp[0] = 0;
511 int e_qmax[2] = {0,0}, e_q[8] = {0,0,0,0,0,0,0,0};
514 ui32 s[8] = {0,0,0,0,0,0,0,0}, val, t;
517 for (
ui32 x = 0; x < width; x += 4)
529 s[0] = --val + (t >> 31);
532 t = height > 1 ? sp[stride] : 0;
541 e_qmax[0] =
ojph_max(e_qmax[0], e_q[1]);
542 s[1] = --val + (t >> 31);
555 e_qmax[0] =
ojph_max(e_qmax[0], e_q[2]);
556 s[2] = --val + (t >> 31);
559 t = height > 1 ? sp[stride] : 0;
568 e_qmax[0] =
ojph_max(e_qmax[0], e_q[3]);
569 s[3] = --val + (t >> 31);
574 int u_q0 = Uq0 - 1, u_q1 = 0;
579 eps0 |= (e_q[0] == e_qmax[0]);
580 eps0 |= (e_q[1] == e_qmax[0]) << 1;
581 eps0 |= (e_q[2] == e_qmax[0]) << 2;
582 eps0 |= (e_q[3] == e_qmax[0]) << 3;
585 lep[0] = (
ui8)e_q[3];
586 lcxp[0] = (
ui8)(lcxp[0] | (
ui8)((rho[0] & 2) >> 1)); lcxp++;
587 lcxp[0] = (
ui8)((rho[0] & 8) >> 3);
589 ui16 tuple0 =
vlc_tbl0[(c_q0 << 8) + (rho[0] << 4) + eps0];
590 vlc_encode(&vlc, tuple0 >> 8, (tuple0 >> 4) & 7);
595 int m = (rho[0] & 1) ? Uq0 - (tuple0 & 1) : 0;
597 m = (rho[0] & 2) ? Uq0 - ((tuple0 & 2) >> 1) : 0;
599 m = (rho[0] & 4) ? Uq0 - ((tuple0 & 4) >> 2) : 0;
601 m = (rho[0] & 8) ? Uq0 - ((tuple0 & 8) >> 3) : 0;
615 s[4] = --val + (t >> 31);
618 t = height > 1 ? sp[stride] : 0;
627 e_qmax[1] =
ojph_max(e_qmax[1], e_q[5]);
628 s[5] = --val + (t >> 31);
641 e_qmax[1] =
ojph_max(e_qmax[1], e_q[6]);
642 s[6] = --val + (t >> 31);
645 t = height > 1 ? sp[stride] : 0;
654 e_qmax[1] =
ojph_max(e_qmax[1], e_q[7]);
655 s[7] = --val + (t >> 31);
659 int c_q1 = (rho[0] >> 1) | (rho[0] & 1);
666 eps1 |= (e_q[4] == e_qmax[1]);
667 eps1 |= (e_q[5] == e_qmax[1]) << 1;
668 eps1 |= (e_q[6] == e_qmax[1]) << 2;
669 eps1 |= (e_q[7] == e_qmax[1]) << 3;
672 lep[0] = (
ui8)e_q[7];
673 lcxp[0] |= (
ui8)(lcxp[0] | (
ui8)((rho[1] & 2) >> 1)); lcxp++;
674 lcxp[0] = (
ui8)((rho[1] & 8) >> 3);
675 ui16 tuple1 =
vlc_tbl0[(c_q1 << 8) + (rho[1] << 4) + eps1];
676 vlc_encode(&vlc, tuple1 >> 8, (tuple1 >> 4) & 7);
681 int m = (rho[1] & 1) ? Uq1 - (tuple1 & 1) : 0;
683 m = (rho[1] & 2) ? Uq1 - ((tuple1 & 2) >> 1) : 0;
685 m = (rho[1] & 4) ? Uq1 - ((tuple1 & 4) >> 2) : 0;
687 m = (rho[1] & 8) ? Uq1 - ((tuple1 & 8) >> 3) : 0;
691 if (u_q0 > 0 && u_q1 > 0)
694 if (u_q0 > 2 && u_q1 > 2)
701 else if (u_q0 > 2 && u_q1 > 0)
716 c_q0 = (rho[1] >> 1) | (rho[1] & 1);
717 s[0] = s[1] = s[2] = s[3] = s[4] = s[5] = s[6] = s[7] = 0;
718 e_q[0]=e_q[1]=e_q[2]=e_q[3]=e_q[4]=e_q[5]=e_q[6]=e_q[7]=0;
719 rho[0] = rho[1] = 0; e_qmax[0] = e_qmax[1] = 0;
724 for (y = 2; y < height; y += 2)
727 int max_e =
ojph_max(lep[0], lep[1]) - 1;
730 c_q0 = lcxp[0] + (lcxp[1] << 2);
733 sp = buf + y * stride;
734 for (
ui32 x = 0; x < width; x += 4)
746 s[0] = --val + (t >> 31);
749 t = y + 1 < height ? sp[stride] : 0;
758 e_qmax[0] =
ojph_max(e_qmax[0], e_q[1]);
759 s[1] = --val + (t >> 31);
772 e_qmax[0] =
ojph_max(e_qmax[0], e_q[2]);
773 s[2] = --val + (t >> 31);
776 t = y + 1 < height ? sp[stride] : 0;
785 e_qmax[0] =
ojph_max(e_qmax[0], e_q[3]);
786 s[3] = --val + (t >> 31);
790 int kappa = (rho[0] & (rho[0]-1)) ?
ojph_max(1,max_e) : 1;
791 int Uq0 =
ojph_max(e_qmax[0], kappa);
792 int u_q0 = Uq0 - kappa, u_q1 = 0;
797 eps0 |= (e_q[0] == e_qmax[0]);
798 eps0 |= (e_q[1] == e_qmax[0]) << 1;
799 eps0 |= (e_q[2] == e_qmax[0]) << 2;
800 eps0 |= (e_q[3] == e_qmax[0]) << 3;
803 max_e =
ojph_max(lep[0], lep[1]) - 1;
804 lep[0] = (
ui8)e_q[3];
805 lcxp[0] = (
ui8)(lcxp[0] | (
ui8)((rho[0] & 2) >> 1)); lcxp++;
806 int c_q1 = lcxp[0] + (lcxp[1] << 2);
807 lcxp[0] = (
ui8)((rho[0] & 8) >> 3);
808 ui16 tuple0 =
vlc_tbl1[(c_q0 << 8) + (rho[0] << 4) + eps0];
809 vlc_encode(&vlc, tuple0 >> 8, (tuple0 >> 4) & 7);
814 int m = (rho[0] & 1) ? Uq0 - (tuple0 & 1) : 0;
816 m = (rho[0] & 2) ? Uq0 - ((tuple0 & 2) >> 1) : 0;
818 m = (rho[0] & 4) ? Uq0 - ((tuple0 & 4) >> 2) : 0;
820 m = (rho[0] & 8) ? Uq0 - ((tuple0 & 8) >> 3) : 0;
834 s[4] = --val + (t >> 31);
837 t = y + 1 < height ? sp[stride] : 0;
846 e_qmax[1] =
ojph_max(e_qmax[1], e_q[5]);
847 s[5] = --val + (t >> 31);
860 e_qmax[1] =
ojph_max(e_qmax[1], e_q[6]);
861 s[6] = --val + (t >> 31);
864 t = y + 1 < height ? sp[stride] : 0;
873 e_qmax[1] =
ojph_max(e_qmax[1], e_q[7]);
874 s[7] = --val + (t >> 31);
878 kappa = (rho[1] & (rho[1]-1)) ?
ojph_max(1,max_e) : 1;
879 c_q1 |= ((rho[0] & 4) >> 1) | ((rho[0] & 8) >> 2);
880 int Uq1 =
ojph_max(e_qmax[1], kappa);
886 eps1 |= (e_q[4] == e_qmax[1]);
887 eps1 |= (e_q[5] == e_qmax[1]) << 1;
888 eps1 |= (e_q[6] == e_qmax[1]) << 2;
889 eps1 |= (e_q[7] == e_qmax[1]) << 3;
892 max_e =
ojph_max(lep[0], lep[1]) - 1;
893 lep[0] = (
ui8)e_q[7];
894 lcxp[0] = (
ui8)(lcxp[0] | (
ui8)((rho[1] & 2) >> 1)); lcxp++;
895 c_q0 = lcxp[0] + (lcxp[1] << 2);
896 lcxp[0] = (
ui8)((rho[1] & 8) >> 3);
897 ui16 tuple1 =
vlc_tbl1[(c_q1 << 8) + (rho[1] << 4) + eps1];
898 vlc_encode(&vlc, tuple1 >> 8, (tuple1 >> 4) & 7);
903 int m = (rho[1] & 1) ? Uq1 - (tuple1 & 1) : 0;
905 m = (rho[1] & 2) ? Uq1 - ((tuple1 & 2) >> 1) : 0;
907 m = (rho[1] & 4) ? Uq1 - ((tuple1 & 4) >> 2) : 0;
909 m = (rho[1] & 8) ? Uq1 - ((tuple1 & 8) >> 3) : 0;
919 c_q0 |= ((rho[1] & 4) >> 1) | ((rho[1] & 8) >> 2);
920 s[0] = s[1] = s[2] = s[3] = s[4] = s[5] = s[6] = s[7] = 0;
921 e_q[0]=e_q[1]=e_q[2]=e_q[3]=e_q[4]=e_q[5]=e_q[6]=e_q[7]=0;
922 rho[0] = rho[1] = 0; e_qmax[0] = e_qmax[1] = 0;
939 coded->
buf[lengths[0]-1] = (
ui8)(num_bytes >> 4);
940 coded->
buf[lengths[0]-2] = coded->
buf[lengths[0]-2] & 0xF0;
941 coded->
buf[lengths[0]-2] =
942 (
ui8)(coded->
buf[lengths[0]-2] | (num_bytes & 0xF));
void get_buffer(ui32 needed_bytes, coded_lists *&p)
static bool uvlc_tables_initialized
Initializes UVLC tables uvlc_tbl0 and uvlc_tbl1.
static bool uvlc_init_tables()
Initializes uvlc_tbl0 and uvlc_tbl1 tables.
static bool vlc_tables_initialized
Initializes VLC tables vlc_tbl0 and vlc_tbl1.
static bool vlc_init_tables()
Initializes vlc_tbl0 and vlc_tbl1 tables, from table0.h and table1.h.
ui16 vlc_tbl0[1024]
vlc_tbl0 contains decoding information for initial row of quads
ui16 vlc_tbl1[1024]
vlc_tbl1 contains decoding information for non-initial row of quads
static void ms_terminate(ms_struct *msp)
static int ulvc_cwd_suf[33]
static int ulvc_cwd_suf_len[33]
static void vlc_encode(vlc_struct *vlcp, int cwd, int cwd_len)
static void terminate_mel_vlc(mel_struct *melp, vlc_struct *vlcp)
static void mel_init(dec_mel_st *melp, ui8 *bbuf, int lcup, int scup)
Initiates a dec_mel_st structure for MEL decoding and reads some bytes in order to get the read addre...
static void ms_init(ms_struct *msp, ui32 buffer_size, ui8 *data)
static void ms_encode(ms_struct *msp, ui32 cwd, int cwd_len)
static int ulvc_cwd_pre_len[33]
static int ulvc_cwd_pre[33]
static void mel_encode(mel_struct *melp, bool bit)
static void mel_emit_bit(mel_struct *melp, int v)
void ojph_encode_codeblock(ui32 *buf, ui32 missing_msbs, ui32 num_passes, ui32 width, ui32 height, ui32 stride, ui32 *lengths, ojph::mem_elastic_allocator *elastic, ojph::coded_lists *&coded)
static void vlc_init(vlc_struct *vlcp, ui32 buffer_size, ui8 *data)
static ui32 population_count(ui32 val)
static ui32 count_leading_zeros(ui32 val)
#define OJPH_ERROR(t,...)
bool last_greater_than_8F