comparison svq1.c @ 2010:ad1a92c2db48 libavcodec

width height %64 != 0 fix print average RD score at the end precalculated codebook vector mean tables
author michael
date Sat, 08 May 2004 11:54:55 +0000
parents fc54b7be8448
children 8c7e7c332b86
comparison
equal deleted inserted replaced
2009:b13a25ac9f0c 2010:ad1a92c2db48
83 int c_block_width; 83 int c_block_width;
84 int c_block_height; 84 int c_block_height;
85 85
86 unsigned char *c_plane; 86 unsigned char *c_plane;
87 87
88 int64_t rd_total;
88 } SVQ1Context; 89 } SVQ1Context;
89 90
90 /* motion vector (prediction) */ 91 /* motion vector (prediction) */
91 typedef struct svq1_pmv_s { 92 typedef struct svq1_pmv_s {
92 int x; 93 int x;
1338 int best_vector_sum=-99, best_vector_mean=-99; 1339 int best_vector_sum=-99, best_vector_mean=-99;
1339 const int stage= count-1; 1340 const int stage= count-1;
1340 int8_t *vector; 1341 int8_t *vector;
1341 1342
1342 for(i=0; i<16; i++){ 1343 for(i=0; i<16; i++){
1343 int sum=0; 1344 int sum= svq1_intra_codebook_sum[level][stage*16 + i];
1344 int sqr=0; 1345 int sqr=0;
1345 int diff, mean, score; 1346 int diff, mean, score;
1346 1347
1347 vector = svq1_intra_codebooks[level] + stage*size*16 + i*size; 1348 vector = svq1_intra_codebooks[level] + stage*size*16 + i*size;
1348 1349
1349 for(j=0; j<size; j++){ 1350 for(j=0; j<size; j++){
1350 int v= vector[j]; 1351 int v= vector[j];
1351 sum += v;
1352 sqr += (v - block[stage][j])*(v - block[stage][j]); 1352 sqr += (v - block[stage][j])*(v - block[stage][j]);
1353 } 1353 }
1354 diff= block_sum[stage] - sum; 1354 diff= block_sum[stage] - sum;
1355 mean= (diff + (size>>1)) >> (level+3); 1355 mean= (diff + (size>>1)) >> (level+3);
1356 assert(mean >-50 && mean<300); 1356 assert(mean >-50 && mean<300);
1461 1461
1462 for (y = 0; y < block_height; y++) { 1462 for (y = 0; y < block_height; y++) {
1463 1463
1464 for (x = 0; x < block_width; x++) { 1464 for (x = 0; x < block_width; x++) {
1465 uint8_t reorder_buffer[6][7*32]; 1465 uint8_t reorder_buffer[6][7*32];
1466 uint8_t *src= plane + y * 16 * stride + x * 16;
1467 uint8_t buf[stride*16];
1466 1468
1467 #ifdef DEBUG_SVQ1 1469 #ifdef DEBUG_SVQ1
1468 av_log(s->avctx, AV_LOG_INFO, "* level 5 vector @ %d, %d:\n", x * 16, y * 16); 1470 av_log(s->avctx, AV_LOG_INFO, "* level 5 vector @ %d, %d:\n", x * 16, y * 16);
1469 #endif 1471 #endif
1470 1472
1472 left_edge = (y * 16 * stride) + (x * 16); 1474 left_edge = (y * 16 * stride) + (x * 16);
1473 1475
1474 for(i=0; i<6; i++){ 1476 for(i=0; i<6; i++){
1475 init_put_bits(&s->reorder_pb[i], reorder_buffer[i], 7*32); 1477 init_put_bits(&s->reorder_pb[i], reorder_buffer[i], 7*32);
1476 } 1478 }
1477 encode_block(s, &plane[left_edge], stride, 5, 256, (s->picture.quality*s->picture.quality) >> (2*FF_LAMBDA_SHIFT)); 1479 if(x*16 + 16 > width || y*16 + 16 > height){
1480 ff_emulated_edge_mc(buf, src, stride, 16, 16, 16*x, 16*y, width, height);
1481 src= buf;
1482 }
1483 s->rd_total += encode_block(s, src, stride, 5, 256, (s->picture.quality*s->picture.quality) >> (2*FF_LAMBDA_SHIFT));
1478 for(i=5; i>=0; i--){ 1484 for(i=5; i>=0; i--){
1479 int count= put_bits_count(&s->reorder_pb[i]); 1485 int count= put_bits_count(&s->reorder_pb[i]);
1480 1486
1481 flush_put_bits(&s->reorder_pb[i]); 1487 flush_put_bits(&s->reorder_pb[i]);
1482 ff_copy_bits(&s->pb, s->reorder_pb[i].buf, count); 1488 ff_copy_bits(&s->pb, s->reorder_pb[i].buf, count);
1674 1680
1675 static int svq1_encode_end(AVCodecContext *avctx) 1681 static int svq1_encode_end(AVCodecContext *avctx)
1676 { 1682 {
1677 SVQ1Context * const s = avctx->priv_data; 1683 SVQ1Context * const s = avctx->priv_data;
1678 1684
1685 av_log(avctx, AV_LOG_DEBUG, "RD: %f\n", s->rd_total/(double)(avctx->width*avctx->height*avctx->frame_number));
1686
1679 av_free(s->c_plane); 1687 av_free(s->c_plane);
1680 1688
1681 return 0; 1689 return 0;
1682 } 1690 }
1683 1691