Mercurial > libavcodec.hg
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 |