113 #define QUALITY_THRESHOLD 100
114 #define THRESHOLD_MULTIPLIER 0.6
117 int count, y, x, i, j, split, best_mean, best_score, best_count;
119 int block_sum[7]= {0, 0, 0, 0, 0, 0};
120 int w= 2<<((level+2)>>1);
121 int h= 2<<((level+1)>>1);
123 int16_t
block[7][256];
124 const int8_t *codebook_sum, *codebook;
125 const uint16_t (*mean_vlc)[2];
126 const uint8_t (*multistage_vlc)[2];
138 block[0][x + w*y]=
v;
151 block[0][x + w*y]=
v;
159 best_score -= (int)(((
unsigned)block_sum[0]*block_sum[0])>>(level+3));
160 best_mean= (block_sum[0] + (size>>1)) >> (level+3);
163 for(count=1; count<7; count++){
164 int best_vector_score= INT_MAX;
165 int best_vector_sum=-999, best_vector_mean=-999;
166 const int stage= count-1;
167 const int8_t *vector;
170 int sum= codebook_sum[stage*16 + i];
171 int sqr, diff, score;
173 vector = codebook + stage*size*16 + i*
size;
175 diff= block_sum[stage] - sum;
176 score= sqr - ((diff*(int64_t)diff)>>(level+3));
177 if(score < best_vector_score){
178 int mean= (diff + (size>>1)) >> (level+3);
179 assert(mean >-300 && mean<300);
180 mean= av_clip(mean, intra?0:-256, 255);
181 best_vector_score= score;
182 best_vector[stage]= i;
183 best_vector_sum= sum;
184 best_vector_mean= mean;
187 assert(best_vector_mean != -999);
188 vector= codebook + stage*size*16 + best_vector[stage]*
size;
189 for(j=0; j<
size; j++){
190 block[stage+1][j] = block[stage][j] - vector[j];
192 block_sum[stage+1]= block_sum[stage] - best_vector_sum;
194 lambda*(+ 1 + 4*count
195 + multistage_vlc[1+count][1]
196 + mean_vlc[best_vector_mean][1]);
198 if(best_vector_score < best_score){
199 best_score= best_vector_score;
201 best_mean= best_vector_mean;
207 if(best_score > threshold && level){
209 int offset= (level&1) ? stride*h/2 : w/2;
212 for(i=level-1; i>=0; i--){
215 score +=
encode_block(s, src , ref , decoded , stride, level-1, threshold>>1, lambda, intra);
216 score +=
encode_block(s, src + offset, ref + offset, decoded + offset, stride, level-1, threshold>>1, lambda, intra);
219 if(score < best_score){
223 for(i=level-1; i>=0; i--){
232 assert((best_mean >= 0 && best_mean<256) || !intra);
233 assert(best_mean >= -256 && best_mean<256);
234 assert(best_count >=0 && best_count<7);
235 assert(level<4 || best_count==0);
239 multistage_vlc[1 + best_count][1],
240 multistage_vlc[1 + best_count][0]);
242 mean_vlc[best_mean][0]);
244 for (i = 0; i < best_count; i++){
245 assert(best_vector[i]>=0 && best_vector[i]<16);
251 decoded[x + y*
stride]= src[x + y*
stride] - block[best_count][x + w*y] + best_mean;
265 int block_width, block_height;
273 for (level = 4; level >= 0; level--)
276 block_width = (width + 15) / 16;
277 block_height = (height + 15) / 16;
326 for (y = 0; y < block_height; y++) {
330 for(i=0; i<16 && i + 16*y<
height; i++){
331 memcpy(&src[i*stride], &src_plane[(i+16*y)*src_stride], width);
332 for(x=width; x<16*block_width; x++)
333 src[i*stride+x]= src[i*stride+x-1];
335 for(; i<16 && i + 16*y<16*block_height; i++)
336 memcpy(&src[i*stride], &src[(i-1)*stride], 16*block_width);
338 for (x = 0; x < block_width; x++) {
353 for (y = 0; y < block_height; y++) {
354 for(i=0; i<16 && i + 16*y<
height; i++){
355 memcpy(&src[i*stride], &src_plane[(i+16*y)*src_stride], width);
356 for(x=width; x<16*block_width; x++)
357 src[i*stride+x]= src[i*stride+x-1];
359 for(; i<16 && i + 16*y<16*block_height; i++)
360 memcpy(&src[i*stride], &src[(i-1)*stride], 16*block_width);
363 for (x = 0; x < block_width; x++) {
364 uint8_t reorder_buffer[3][6][7*32];
366 int offset = y * 16 * stride + x * 16;
367 uint8_t *decoded= decoded_plane + offset;
368 uint8_t *ref= ref_plane + offset;
369 int score[4]={0,0,0,0}, best;
388 score[0]= vlc[1]*lambda;
402 int mx, my, pred_x, pred_y, dxy;
415 assert(mx>=-32 && mx<=31);
416 assert(my>=-32 && my<=31);
417 assert(pred_x>=-32 && pred_x<=31);
418 assert(pred_y>=-32 && pred_y<=31);
424 dxy= (mx&1) + 2*(my&1);
428 score[1]+=
encode_block(s, src+16*x, temp+16, decoded, stride, 5, 64, lambda, 0);
429 best= score[1] <= score[0];
433 score[2]+= vlc[1]*lambda;
434 if(score[2] < score[best] && mx==0 && my==0){
450 motion_ptr[0 ] = motion_ptr[1 ]=
451 motion_ptr[2 ] = motion_ptr[3 ]=
502 int buf_size,
void *
data)