1 /*
2 * Copyright (C) 2004 Michael Niedermayer <michaelni@gmx.at>
3 *
4 * This file is part of FFmpeg.
5 *
6 * FFmpeg is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10 *
11 * FFmpeg is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with FFmpeg; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19 */
20
28
31
34
36 {
39 int i;
40
45 return -1;
46 }
47
49
52
53 for(plane_index=0; plane_index<3; plane_index++){
60 }
61
65 }
67
69
71
75
83
85
87
91
94 }
97 return -1;
98 }
100
103 // case AV_PIX_FMT_YUV422P:
105 // case AV_PIX_FMT_YUV411P:
109 break;
113 break;
114 /* case AV_PIX_FMT_RGB32:
115 s->colorspace= 1;
116 break;*/
117 default:
119 return -1;
120 }
122
125
130
133
141 }
142 }
143
144 return 0;
145 }
146
147 //near copy & paste from dsputil, FIXME
149 {
151
152 s = 0;
153 for (i = 0; i < h; i++) {
154 for (j = 0; j < w; j++) {
155 s += pix[0];
156 pix ++;
157 }
158 pix += line_size - w;
159 }
161 }
162
163 //near copy & paste from dsputil, FIXME
165 {
168
169 s = 0;
170 for (i = 0; i < w; i++) {
171 for (j = 0; j < w; j ++) {
172 s += sq[pix[0]];
173 pix ++;
174 }
175 pix += line_size - w;
176 }
178 }
179
181 switch(type&0xFF){
182 default:
186 return (3*lambda)>>(FF_LAMBDA_SHIFT+1);
200 return 1;
201 }
202 }
203
204 //FIXME copy&paste
207 #define P_TOPRIGHT P[3]
208 #define P_MEDIAN P[4]
210 #define FLAG_QPEL 1 //must be 1
211
220 int score, score2, iscore, i_len, p_len, block_s, sum, base_bits;
224 const int index= (x + y*w) << rem_depth;
226 int trx= (x+1)<<rem_depth;
227 int try= (y+1)<<rem_depth;
233 const BlockNode *tr = y && trx<w && ((x&1)==0 || level==0) ? &s->
block[index-w+(1<<rem_depth)] : tl;
//FIXME use lt
234 int pl = left->
color[0];
235 int pcb= left->
color[1];
236 int pcr= left->
color[2];
237 int pmx, pmy;
238 int mx=0, my=0;
246 int16_t last_mv[3][2];
248 const int shift= 1+qpel;
254 int ref, best_ref, ref_score, ref_mx, ref_my;
255
258 set_blocks(s, level, x, y, pl, pcb, pcr, 0, 0, 0,
BLOCK_INTRA);
259 return 0;
260 }
261
262 // clip predictors / edge ?
263
270
273 last_mv[1][0]= right->
mx;
274 last_mv[1][1]= right->
my;
275 last_mv[2][0]= bottom->
mx;
276 last_mv[2][1]= bottom->
my;
277
282
285
290
291 c->
xmin = - x*block_w - 16+3;
292 c->
ymin = - y*block_w - 16+3;
295
303
306
307 if (!y) {
310 } else {
313 }
314
315 score= INT_MAX;
316 best_ref= 0;
319
322
327
335 }
336 if(score > ref_score){
337 score= ref_score;
338 best_ref= ref;
339 mx= ref_mx;
340 my= ref_my;
341 }
342 }
343 //FIXME if mb_cmp != SSE then intra cannot be compared currently and mb_penalty vs. lambda2
344
345 // subpel search
349 pc.bytestream= p_buffer; //FIXME end/start? and at the other stoo
351
353 put_rac(&pc, &p_state[4 + s_context], 1);
356 put_symbol(&pc, &p_state[128 + 1024 + 32*ref_context], best_ref, 0);
357 pred_mv(s, &pmx, &pmy, best_ref, left, top, tr);
358 put_symbol(&pc, &p_state[128 + 32*(mx_context + 16*!!best_ref)], mx - pmx, 1);
359 put_symbol(&pc, &p_state[128 + 32*(my_context + 16*!!best_ref)], my - pmy, 1);
360 p_len= pc.bytestream - pc.bytestream_start;
362
363 block_s= block_w*block_w;
364 sum =
pix_sum(current_data[0], stride, block_w, block_w);
365 l= (sum + block_s/2)/block_s;
366 iscore =
pix_norm1(current_data[0], stride, block_w) - 2*l*sum + l*l*block_s;
367
371 cb= (sum + block_s/2)/block_s;
372 // iscore += pix_norm1(¤t_mb[1][0], uvstride, block_w>>1) - 2*cb*sum + cb*cb*block_s;
374 cr= (sum + block_s/2)/block_s;
375 // iscore += pix_norm1(¤t_mb[2][0], uvstride, block_w>>1) - 2*cr*sum + cr*cr*block_s;
376 }else
377 cb = cr = 0;
378
381 ic.bytestream= i_buffer; //FIXME end/start? and at the other stoo
384 put_rac(&ic, &i_state[4 + s_context], 1);
390 }
391 i_len= ic.bytestream - ic.bytestream_start;
393
394 av_assert1(iscore < 255*255*256 + s->lambda2*10);
398
399 if(level==0){
400 int varc= iscore >> 8;
401 int vard= score >> 8;
402 if (vard <= 64 || vard < varc)
404 else
406 }
407
415
416 if(score2 < score && score2 < iscore)
417 return score2;
418 }
419
420 if(iscore < score){
421 pred_mv(s, &pmx, &pmy, 0, left, top, tr);
422 memcpy(pbbak, i_buffer, i_len);
426 set_blocks(s, level, x, y, l, cb, cr, pmx, pmy, 0,
BLOCK_INTRA);
428 return iscore;
429 }else{
430 memcpy(pbbak, p_buffer, p_len);
434 set_blocks(s, level, x, y, pl, pcb, pcr, mx, my, best_ref, 0);
436 return score;
437 }
438 }
439
443 const int index= (x + y*w) << rem_depth;
444 int trx= (x+1)<<rem_depth;
449 const BlockNode *tr = y && trx<w && ((x&1)==0 || level==0) ? &s->
block[index-w+(1<<rem_depth)] : tl;
//FIXME use lt
450 int pl = left->
color[0];
451 int pcb= left->
color[1];
452 int pcr= left->
color[2];
453 int pmx, pmy;
458
460 set_blocks(s, level, x, y, pl, pcb, pcr, 0, 0, 0,
BLOCK_INTRA);
461 return;
462 }
463
467 }else{
473 return;
474 }
475 }
477 pred_mv(s, &pmx, &pmy, 0, left, top, tr);
483 }
484 set_blocks(s, level, x, y, b->
color[0], b->
color[1], b->
color[2], pmx, pmy, 0,
BLOCK_INTRA);
485 }else{
486 pred_mv(s, &pmx, &pmy, b->
ref, left, top, tr);
492 set_blocks(s, level, x, y, pl, pcb, pcr, b->
mx, b->
my, b->
ref, 0);
493 }
494 }
495
497 int i, x2, y2;
500 const int block_w = plane_index ? block_size>>s->
chroma_h_shift : block_size;
501 const int block_h = plane_index ? block_size>>s->
chroma_v_shift : block_size;
503 const int obmc_stride= plane_index ? (2*block_size)>>s->
chroma_h_shift : 2*block_size;
505 uint8_t *
src= s-> input_picture->data[plane_index];
508 const int w= p->
width;
510 int index= mb_x + mb_y*b_stride;
513 int ab=0;
514 int aa=0;
515
517
519 b->
color[plane_index]= 0;
520 memset(dst, 0, obmc_stride*obmc_stride*
sizeof(
IDWTELEM));
521
522 for(i=0; i<4; i++){
523 int mb_x2= mb_x + (i &1) - 1;
524 int mb_y2= mb_y + (i>>1) - 1;
525 int x= block_w*mb_x2 + block_w/2;
526 int y= block_h*mb_y2 + block_h/2;
527
529 x, y, block_w, block_h, w, h, obmc_stride, ref_stride, obmc_stride, mb_x2, mb_y2, 0, 0, plane_index);
530
531 for(y2=
FFMAX(y, 0); y2<
FFMIN(h, y+block_h); y2++){
532 for(x2=
FFMAX(x, 0); x2<
FFMIN(w, x+block_w); x2++){
533 int index= x2-(block_w*mb_x - block_w/2) + (y2-(block_h*mb_y - block_h/2))*obmc_stride;
534 int obmc_v= obmc[
index];
535 int d;
536 if(y<0) obmc_v += obmc[index + block_h*obmc_stride];
537 if(x<0) obmc_v += obmc[index + block_w];
538 if(y+block_h>h) obmc_v += obmc[index - block_h*obmc_stride];
539 if(x+block_w>w) obmc_v += obmc[index - block_w];
540 //FIXME precalculate this or simplify it somehow else
541
544 ab += (
src[x2 + y2*ref_stride] - (d>>
FRAC_BITS)) * obmc_v;
545 aa += obmc_v * obmc_v; //FIXME precalculate this
546 }
547 }
548 }
549 *b= backup;
550
552 }
553
557 int index= x + y*b_stride;
561 const BlockNode *tl = y && x ? &s->
block[index-b_stride-1] : left;
562 const BlockNode *tr = y && x+w<b_stride ? &s->
block[index-b_stride+w] : tl;
563 int dmx, dmy;
564 // int mx_context= av_log2(2*FFABS(left->mx - top->mx));
565 // int my_context= av_log2(2*FFABS(left->my - top->my));
566
567 if(x<0 || x>=b_stride || y>=b_height)
568 return 0;
569 /*
570 1 0 0
571 01X 1-2 1
572 001XX 3-6 2-3
573 0001XXX 7-14 4-7
574 00001XXXX 15-30 8-15
575 */
576 //FIXME try accurate rate
577 //FIXME intra and inter predictors if surrounding blocks are not the same type
582 }else{
583 pred_mv(s, &dmx, &dmy, b->
ref, left, top, tr);
586 return 2*(1 +
av_log2(2*
FFABS(dmx))
//FIXME kill the 2* can be merged in lambda
589 }
590 }
591
595 const int block_w = plane_index ? block_size>>s->
chroma_h_shift : block_size;
596 const int block_h = plane_index ? block_size>>s->
chroma_v_shift : block_size;
597 const int obmc_stride= plane_index ? (2*block_size)>>s->
chroma_h_shift : 2*block_size;
600 uint8_t *
src= s-> input_picture->data[plane_index];
606 const int w= p->
width;
608 int distortion;
609 int rate= 0;
611 int sx= block_w*mb_x - block_w/2;
612 int sy= block_h*mb_y - block_h/2;
613 int x0=
FFMAX(0,-sx);
614 int y0=
FFMAX(0,-sy);
615 int x1=
FFMIN(block_w*2, w-sx);
616 int y1=
FFMIN(block_h*2, h-sy);
618
620
621 ff_snow_pred_block(s, cur, tmp, ref_stride, sx, sy, block_w*2, block_h*2, &s->
block[mb_x + mb_y*b_stride], plane_index, w, h);
622
623 for(y=y0; y<y1; y++){
624 const uint8_t *obmc1= obmc_edged[
y];
626 uint8_t *cur1 = cur + y*ref_stride;
627 uint8_t *dst1 = dst + sx + (sy+
y)*ref_stride;
628 for(x=x0; x<x1; x++){
629 #if FRAC_BITS >= LOG2_OBMC_MAX
631 #else
633 #endif
635 if(v&(~255)) v= ~(v>>31);
637 }
638 }
639
640 /* copy the regions where obmc[] = (uint8_t)256 */
642 && (mb_x == 0 || mb_x == b_stride-1)
643 && (mb_y == 0 || mb_y == b_height-1)){
644 if(mb_x == 0)
645 x1 = block_w;
646 else
647 x0 = block_w;
648 if(mb_y == 0)
649 y1 = block_h;
650 else
651 y0 = block_h;
652 for(y=y0; y<y1; y++)
653 memcpy(dst + sx+x0 + (sy+y)*ref_stride, cur + x0 + y*ref_stride, x1-x0);
654 }
655
656 if(block_w==16){
657 /* FIXME rearrange dsputil to fit 32x32 cmp functions */
658 /* FIXME check alignment of the cmp wavelet vs the encoding wavelet */
659 /* FIXME cmps overlap but do not cover the wavelet's whole support.
660 * So improving the score of one block is not strictly guaranteed
661 * to improve the score of the whole frame, thus iterative motion
662 * estimation does not always converge. */
664 distortion =
ff_w97_32_c(&s->
m,
src + sx + sy*ref_stride, dst + sx + sy*ref_stride, ref_stride, 32);
666 distortion =
ff_w53_32_c(&s->
m,
src + sx + sy*ref_stride, dst + sx + sy*ref_stride, ref_stride, 32);
667 else{
668 distortion = 0;
669 for(i=0; i<4; i++){
670 int off = sx+16*(i&1) + (sy+16*(i>>1))*ref_stride;
671 distortion += s->
mecc.
me_cmp[0](&s->
m,
src + off, dst + off, ref_stride, 16);
672 }
673 }
674 }else{
676 distortion = s->
mecc.
me_cmp[0](&s->
m,
src + sx + sy*ref_stride, dst + sx + sy*ref_stride, ref_stride, block_w*2);
677 }
678
679 if(plane_index==0){
680 for(i=0; i<4; i++){
681 /* ..RRr
682 * .RXx.
683 * rxx..
684 */
685 rate +=
get_block_bits(s, mb_x + (i&1) - (i>>1), mb_y + (i>>1), 1);
686 }
687 if(mb_x == b_stride-2)
689 }
690 return distortion + rate*penalty_factor;
691 }
692
694 int i, y2;
697 const int block_w = plane_index ? block_size>>s->
chroma_h_shift : block_size;
698 const int block_h = plane_index ? block_size>>s->
chroma_v_shift : block_size;
700 const int obmc_stride= plane_index ? (2*block_size)>>s->
chroma_h_shift : 2*block_size;
703 uint8_t *
src= s-> input_picture->data[plane_index];
704 //FIXME zero_dst is const but add_yblock changes dst if add is 0 (this is never the case for dst=zero_dst
705 // const has only been removed from zero_dst to suppress a warning
706 static IDWTELEM zero_dst[4096];
//FIXME
708 const int w= p->
width;
710 int distortion= 0;
711 int rate= 0;
713
715
716 for(i=0; i<9; i++){
717 int mb_x2= mb_x + (i%3) - 1;
718 int mb_y2= mb_y + (i/3) - 1;
719 int x= block_w*mb_x2 + block_w/2;
720 int y= block_h*mb_y2 + block_h/2;
721
723 x, y, block_w, block_h, w, h, /*dst_stride*/0, ref_stride, obmc_stride, mb_x2, mb_y2, 1, 1, plane_index);
724
725 //FIXME find a cleaner/simpler way to skip the outside stuff
726 for(y2= y; y2<0; y2++)
727 memcpy(dst + x + y2*ref_stride,
src + x + y2*ref_stride, block_w);
728 for(y2= h; y2<y+block_h; y2++)
729 memcpy(dst + x + y2*ref_stride,
src + x + y2*ref_stride, block_w);
730 if(x<0){
731 for(y2= y; y2<y+block_h; y2++)
732 memcpy(dst + x + y2*ref_stride,
src + x + y2*ref_stride, -x);
733 }
734 if(x+block_w > w){
735 for(y2= y; y2<y+block_h; y2++)
736 memcpy(dst + w + y2*ref_stride,
src + w + y2*ref_stride, x+block_w - w);
737 }
738
740 distortion += s->
mecc.
me_cmp[block_w==8](&s->
m,
src + x + y*ref_stride, dst + x + y*ref_stride, ref_stride, block_h);
741 }
742
743 if(plane_index==0){
746
747 /* ..RRRr
748 * .RXXx.
749 * .RXXx.
750 * rxxx.
751 */
752 if(merged)
754 for(i=merged?4:0; i<9; i++){
755 static const int dxy[9][2] = {{0,0},{1,0},{0,1},{1,1},{2,0},{2,1},{-1,2},{0,2},{1,2}};
757 }
758 }
759 return distortion + rate*penalty_factor;
760 }
761
763 const int w= b->
width;
766
767 if(1){
770 int run_index=0;
771 int max_index;
772
773 for(y=0; y<h; y++){
774 for(x=0; x<w; x++){
776 int /*ll=0, */l=0, lt=0, t=0, rt=0;
777 v= src[x + y*stride];
778
779 if(y){
780 t= src[x + (y-1)*stride];
781 if(x){
782 lt= src[x - 1 + (y-1)*stride];
783 }
784 if(x + 1 < w){
785 rt= src[x + 1 + (y-1)*stride];
786 }
787 }
788 if(x){
789 l= src[x - 1 + y*stride];
790 /*if(x > 1){
791 if(orientation==1) ll= src[y + (x-2)*stride];
792 else ll= src[x - 2 + y*stride];
793 }*/
794 }
795 if(parent){
796 int px= x>>1;
797 int py= y>>1;
798 if(px<b->parent->width && py<b->parent->height)
799 p= parent[px + py*2*stride];
800 }
801 if(!(/*ll|*/l|lt|t|rt|p)){
802 if(v){
803 runs[run_index++]=
run;
804 run=0;
805 }else{
806 run++;
807 }
808 }
809 }
810 }
811 max_index= run_index;
812 runs[run_index++]=
run;
813 run_index=0;
814 run= runs[run_index++];
815
817 if(run_index <= max_index)
819
820 for(y=0; y<h; y++){
823 return -1;
824 }
825 for(x=0; x<w; x++){
827 int /*ll=0, */l=0, lt=0, t=0, rt=0;
828 v= src[x + y*stride];
829
830 if(y){
831 t= src[x + (y-1)*stride];
832 if(x){
833 lt= src[x - 1 + (y-1)*stride];
834 }
835 if(x + 1 < w){
836 rt= src[x + 1 + (y-1)*stride];
837 }
838 }
839 if(x){
840 l= src[x - 1 + y*stride];
841 /*if(x > 1){
842 if(orientation==1) ll= src[y + (x-2)*stride];
843 else ll= src[x - 2 + y*stride];
844 }*/
845 }
846 if(parent){
847 int px= x>>1;
848 int py= y>>1;
849 if(px<b->parent->width && py<b->parent->height)
850 p= parent[px + py*2*stride];
851 }
852 if(/*ll|*/l|lt|t|rt|p){
854
856 }else{
857 if(!run){
858 run= runs[run_index++];
859
860 if(run_index <= max_index)
863 }else{
864 run--;
866 }
867 }
868 if(v){
870 int l2= 2*
FFABS(l) + (l<0);
872
875 }
876 }
877 }
878 }
879 return 0;
880 }
881
883 // encode_subband_qtree(s, b, src, parent, stride, orientation);
884 // encode_subband_z0run(s, b, src, parent, stride, orientation);
886 // encode_subband_dzr(s, b, src, parent, stride, orientation);
887 }
888
895
898
899 if(intra){
900 block->
color[0] = p[0];
901 block->
color[1] = p[1];
902 block->
color[2] = p[2];
904 }else{
908 return 0;
910
914 }
915
917
918 //FIXME chroma
919 if(rd < *best_rd){
920 *best_rd= rd;
921 return 1;
922 }else{
923 *block= backup;
924 return 0;
925 }
926 }
927
928 /* special case for int[2] args we discard afterwards,
929 * fixes compilation problem with gcc 2.95 */
931 int p[2] = {p0, p1};
932 return check_block(s, mb_x, mb_y, p, 0, obmc_edged, best_rd);
933 }
934
941
942 /* We don't initialize backup[] during variable declaration, because
943 * that fails to compile on MSVC: "cannot convert from 'BlockNode' to
944 * 'int16_t'". */
945 backup[0] = block[0];
946 backup[1] = block[1];
947 backup[2] = block[b_stride];
948 backup[3] = block[b_stride + 1];
949
953
957 return 0;
959
964 block[1]= block[b_stride]= block[b_stride+1]= *
block;
965
967
968 //FIXME chroma
969 if(rd < *best_rd){
970 *best_rd= rd;
971 return 1;
972 }else{
973 block[0]= backup[0];
974 block[1]= backup[1];
975 block[b_stride]= backup[2];
976 block[b_stride+1]= backup[3];
977 return 0;
978 }
979 }
980
982 int pass, mb_x, mb_y;
985 const int b_stride= b_width;
987
988 {
992 for(mb_y= 0; mb_y<s->
b_height; mb_y++)
993 for(mb_x= 0; mb_x<s->
b_width; mb_x++)
997 }
998
999 for(pass=0; pass<25; pass++){
1000 int change= 0;
1001
1002 for(mb_y= 0; mb_y<b_height; mb_y++){
1003 for(mb_x= 0; mb_x<b_width; mb_x++){
1004 int dia_change, i, j, ref;
1005 int best_rd= INT_MAX, ref_rd;
1007 const int index= mb_x + mb_y * b_stride;
1016 BlockNode *brb= mb_x+1<b_width && mb_y+1<b_height ? &s->
block[index+b_stride+1] :
NULL;
1019
1021 continue;
1023
1025
1029
1030 //FIXME precalculate
1031 {
1033 for (y = 0; y < b_w * 2; y++)
1035 if(mb_x==0)
1036 for(y=0; y<b_w*2; y++)
1037 memset(obmc_edged[y], obmc_edged[y][0] + obmc_edged[y][b_w-1], b_w);
1038 if(mb_x==b_stride-1)
1039 for(y=0; y<b_w*2; y++)
1040 memset(obmc_edged[y]+b_w, obmc_edged[y][b_w] + obmc_edged[y][b_w*2-1], b_w);
1041 if(mb_y==0){
1042 for(x=0; x<b_w*2; x++)
1043 obmc_edged[0][x] += obmc_edged[b_w-1][x];
1044 for(y=1; y<b_w; y++)
1045 memcpy(obmc_edged[y], obmc_edged[0], b_w*2);
1046 }
1047 if(mb_y==b_height-1){
1048 for(x=0; x<b_w*2; x++)
1049 obmc_edged[b_w*2-1][x] += obmc_edged[b_w][x];
1050 for(y=b_w; y<b_w*2-1; y++)
1051 memcpy(obmc_edged[y], obmc_edged[b_w*2-1], b_w*2);
1052 }
1053 }
1054
1055 //skip stuff outside the picture
1056 if(mb_x==0 || mb_y==0 || mb_x==b_width-1 || mb_y==b_height-1){
1062 const int sx= block_w*mb_x - block_w/2;
1063 const int sy= block_h*mb_y - block_h/2;
1067
1068 for(y=sy; y<0; y++)
1069 memcpy(dst + sx + y*stride, src + sx + y*stride, block_w*2);
1070 for(y=h; y<sy+block_h*2; y++)
1071 memcpy(dst + sx + y*stride, src + sx + y*stride, block_w*2);
1072 if(sx<0){
1073 for(y=sy; y<sy+block_h*2; y++)
1074 memcpy(dst + sx + y*stride, src + sx + y*stride, -sx);
1075 }
1076 if(sx+block_w*2 > w){
1077 for(y=sy; y<sy+block_h*2; y++)
1078 memcpy(dst + w + y*stride, src + w + y*stride, sx+block_w*2 - w);
1079 }
1080 }
1081
1082 // intra(black) = neighbors' contribution to the current block
1084 color[i]=
get_dc(s, mb_x, mb_y, i);
1085
1086 // get previous score (cannot be cached due to OBMC)
1089 check_block(s, mb_x, mb_y, color0, 1, obmc_edged, &best_rd);
1090 }else
1092
1094 ref_rd= best_rd;
1098 continue;
1100 best_rd= INT_MAX;
1101
1104 if(tb)
1105 check_block_inter(s, mb_x, mb_y, mvr[-b_stride][0], mvr[-b_stride][1], obmc_edged, &best_rd);
1106 if(lb)
1108 if(rb)
1110 if(bb)
1111 check_block_inter(s, mb_x, mb_y, mvr[b_stride][0], mvr[b_stride][1], obmc_edged, &best_rd);
1112
1113 /* fullpel ME */
1114 //FIXME avoid subpel interpolation / round to nearest integer
1115 do{
1116 dia_change=0;
1118 for(j=0; j<i; j++){
1119 dia_change |=
check_block_inter(s, mb_x, mb_y, block->
mx+4*(i-j), block->
my+(4*j), obmc_edged, &best_rd);
1120 dia_change |=
check_block_inter(s, mb_x, mb_y, block->
mx-4*(i-j), block->
my-(4*j), obmc_edged, &best_rd);
1121 dia_change |=
check_block_inter(s, mb_x, mb_y, block->
mx+4*(i-j), block->
my-(4*j), obmc_edged, &best_rd);
1122 dia_change |=
check_block_inter(s, mb_x, mb_y, block->
mx-4*(i-j), block->
my+(4*j), obmc_edged, &best_rd);
1123 }
1124 }
1125 }while(dia_change);
1126 /* subpel ME */
1127 do{
1128 static const int square[8][2]= {{+1, 0},{-1, 0},{ 0,+1},{ 0,-1},{+1,+1},{-1,-1},{+1,-1},{-1,+1},};
1129 dia_change=0;
1130 for(i=0; i<8; i++)
1131 dia_change |=
check_block_inter(s, mb_x, mb_y, block->
mx+square[i][0], block->
my+square[i][1], obmc_edged, &best_rd);
1132 }while(dia_change);
1133 //FIXME or try the standard 2 pass qpel or similar
1134
1135 mvr[0][0]= block->
mx;
1136 mvr[0][1]= block->
my;
1137 if(ref_rd > best_rd){
1138 ref_rd= best_rd;
1140 }
1141 }
1142 best_rd= ref_rd;
1143 *block= ref_b;
1144 check_block(s, mb_x, mb_y, color, 1, obmc_edged, &best_rd);
1145 //FIXME RD style color selection
1155 change ++;
1156 }
1157 }
1158 }
1160 if(!change)
1161 break;
1162 }
1163
1165 int change= 0;
1166 for(mb_y= 0; mb_y<b_height; mb_y+=2){
1167 for(mb_x= 0; mb_x<b_width; mb_x+=2){
1168 int i;
1169 int best_rd, init_rd;
1170 const int index= mb_x + mb_y * b_stride;
1172
1174 b[1]= b[0]+1;
1175 b[2]= b[0]+b_stride;
1176 b[3]= b[2]+1;
1180 continue;
1181
1185
1187
1188 //FIXME more multiref search?
1190 (b[0]->mx + b[1]->mx + b[2]->mx + b[3]->mx + 2) >> 2,
1191 (b[0]->my + b[1]->my + b[2]->my + b[3]->my + 2) >> 2, 0, &best_rd);
1192
1193 for(i=0; i<4; i++)
1196
1197 if(init_rd != best_rd)
1198 change++;
1199 }
1200 }
1202 }
1203 }
1204
1209
1212
1213 for(y=0; y<h; y++){
1216 return;
1217 }
1218 for(x=0; x<w; x++){
1221 else
1223 }
1224 }
1225 }
1226
1228 const int w= b->
width;
1232 int x,
y, thres1, thres2;
1233
1235 for(y=0; y<h; y++)
1236 for(x=0; x<w; x++)
1237 dst[x + y*stride]= src[x + y*stride];
1238 return;
1239 }
1240
1241 bias= bias ? 0 : (3*qmul)>>3;
1243 thres2= 2*thres1;
1244
1245 if(!bias){
1246 for(y=0; y<h; y++){
1247 for(x=0; x<w; x++){
1248 int i= src[x + y*stride];
1249
1250 if((unsigned)(i+thres1) > thres2){
1251 if(i>=0){
1253 i/= qmul; //FIXME optimize
1254 dst[x + y*stride]= i;
1255 }else{
1256 i= -i;
1258 i/= qmul; //FIXME optimize
1259 dst[x + y*stride]= -i;
1260 }
1261 }else
1262 dst[x + y*stride]= 0;
1263 }
1264 }
1265 }else{
1266 for(y=0; y<h; y++){
1267 for(x=0; x<w; x++){
1268 int i= src[x + y*stride];
1269
1270 if((unsigned)(i+thres1) > thres2){
1271 if(i>=0){
1273 i= (i + bias) / qmul; //FIXME optimize
1274 dst[x + y*stride]= i;
1275 }else{
1276 i= -i;
1278 i= (i + bias) / qmul; //FIXME optimize
1279 dst[x + y*stride]= -i;
1280 }
1281 }else
1282 dst[x + y*stride]= 0;
1283 }
1284 }
1285 }
1286 }
1287
1289 const int w= b->
width;
1295
1297
1298 for(y=0; y<h; y++){
1299 for(x=0; x<w; x++){
1300 int i= src[x + y*stride];
1301 if(i<0){
1302 src[x + y*stride]= -((-i*qmul + qadd)>>(
QEXPSHIFT));
//FIXME try different bias
1303 }else if(i>0){
1304 src[x + y*stride]= (( i*qmul + qadd)>>(
QEXPSHIFT));
1305 }
1306 }
1307 }
1308 }
1309
1311 const int w= b->
width;
1314
1315 for(y=h-1; y>=0; y--){
1316 for(x=w-1; x>=0; x--){
1317 int i= x + y*stride;
1318
1319 if(x){
1320 if(use_median){
1321 if(y && x+1<w) src[i] -=
mid_pred(src[i - 1], src[i - stride], src[i - stride + 1]);
1322 else src[i] -= src[i - 1];
1323 }else{
1324 if(y) src[i] -=
mid_pred(src[i - 1], src[i - stride], src[i - 1] + src[i - stride] - src[i - 1 - stride]);
1325 else src[i] -= src[i - 1];
1326 }
1327 }else{
1328 if(y) src[i] -= src[i - stride];
1329 }
1330 }
1331 }
1332 }
1333
1335 const int w= b->
width;
1338
1339 for(y=0; y<h; y++){
1340 for(x=0; x<w; x++){
1341 int i= x + y*stride;
1342
1343 if(x){
1344 if(use_median){
1345 if(y && x+1<w) src[i] +=
mid_pred(src[i - 1], src[i - stride], src[i - stride + 1]);
1346 else src[i] += src[i - 1];
1347 }else{
1348 if(y) src[i] +=
mid_pred(src[i - 1], src[i - stride], src[i - 1] + src[i - stride] - src[i - 1 - stride]);
1349 else src[i] += src[i - 1];
1350 }
1351 }else{
1352 if(y) src[i] += src[i - stride];
1353 }
1354 }
1355 }
1356 }
1357
1359 int plane_index,
level, orientation;
1360
1361 for(plane_index=0; plane_index<
FFMIN(s->
nb_planes, 2); plane_index++){
1363 for(orientation=level ? 1:0; orientation<4; orientation++){
1364 if(orientation==2) continue;
1366 }
1367 }
1368 }
1369 }
1370
1372 int plane_index, i;
1374
1375 memset(kstate,
MID_STATE,
sizeof(kstate));
1376
1385 for(plane_index=0; plane_index<2; plane_index++){
1390 }
1391 }
1402 }
1404 // put_rac(&s->c, s->header_state, s->rate_scalability);
1406
1408 }
1409
1411 int update_mc=0;
1412 for(plane_index=0; plane_index<
FFMIN(s->
nb_planes, 2); plane_index++){
1417 }
1419 if(update_mc){
1420 for(plane_index=0; plane_index<
FFMIN(s->
nb_planes, 2); plane_index++){
1424 for(i= p->
htaps/2; i; i--)
1426 }
1427 }
1432 }else
1434 }
1435
1441
1442 }
1443
1445 int plane_index;
1446
1448 for(plane_index=0; plane_index<2; plane_index++){
1453 }
1454 }
1455
1462 }
1463
1466 + 61*
QROOT/8;
///< 64 > 60
1467 }
1468
1470 {
1471 /* Estimate the frame's complexity as a sum of weighted dwt coefficients.
1472 * FIXME we know exact mv bits at this point,
1473 * but ratecontrol isn't set up to include them. */
1474 uint32_t coef_sum= 0;
1475 int level, orientation, delta_qlog;
1476
1478 for(orientation=level ? 1 : 0; orientation<4; orientation++){
1481 const int w= b->
width;
1483 const int stride= b->
stride;
1486 const int qdiv= (1<<16)/qmul;
1488 //FIXME this is ugly
1489 for(y=0; y<h; y++)
1490 for(x=0; x<w; x++)
1491 buf[x+y*stride]= b->
buf[x+y*stride];
1492 if(orientation==0)
1494 for(y=0; y<h; y++)
1495 for(x=0; x<w; x++)
1496 coef_sum+= abs(buf[x+y*stride]) * qdiv >> 16;
1497 }
1498 }
1499
1500 /* ugly, ratecontrol just takes a sqrt again */
1502 coef_sum = (uint64_t)coef_sum * coef_sum >> 16;
1503
1507 }else{
1510 }
1511
1514 return INT_MIN;
1517 s->
qlog+= delta_qlog;
1518 return delta_qlog;
1519 }
1520
1524 int level, orientation, x,
y;
1525
1527 for(orientation=level ? 1 : 0; orientation<4; orientation++){
1530 int64_t error=0;
1531
1536 for(x=0; x<
width; x++){
1538 error += d*d;
1539 }
1540 }
1541
1542 b->
qlog= (int)(log(352256.0/sqrt(error)) / log(pow(2.0, 1.0/
QROOT))+0.5);
1543 }
1544 }
1545 }
1546
1548 const AVFrame *pict,
int *got_packet)
1549 {
1555 int level, orientation, plane_index, i,
y,
ret;
1558
1561
1564
1568 for(y=0; y<(height>>vshift); y++)
1571 width>>hshift);
1573 width >> hshift, height >> vshift,
1576
1577 }
1578 emms_c();
1580
1588 return -1;
1589 }
1590 }else{
1593 }
1594
1600 }
1604 }//else keep previous frame's qlog until after motion estimation
1605
1609
1620 }
1621 }
1622
1626
1631 int block_width = (width +15)>>4;
1632 int block_height= (height+15)>>4;
1634
1637
1641 s->
m. last_picture_ptr= &s->
m. last_picture;
1658
1662
1669 }
1670
1674 }
1675
1676 redo_frame:
1677
1679
1683
1687 }
1688
1691
1693
1695 for(plane_index=0; plane_index < s->
nb_planes; plane_index++){
1697 }
1698 }
1699
1704
1705 for(plane_index=0; plane_index < s->nb_planes; plane_index++){
1710 // int bits= put_bits_count(&s->c.pb);
1711
1713 //FIXME optimize
1714 if(pict->
data[plane_index])
//FIXME gray hack
1715 for(y=0; y<h; y++){
1716 for(x=0; x<w; x++){
1718 }
1719 }
1721
1722 if( plane_index==0
1731 goto redo_frame;
1732 }
1733
1735 for(y=0; y<h; y++){
1736 for(x=0; x<w; x++){
1738 }
1739 }
1740 }else{
1741 for(y=0; y<h; y++){
1742 for(x=0; x<w; x++){
1744 }
1745 }
1746 }
1747
1749
1752 if (delta_qlog <= INT_MIN)
1753 return -1;
1754 if(delta_qlog){
1755 //reordering qlog in the bitstream would eliminate this reset
1761 }
1762 }
1763
1765 for(orientation=level ? 1 : 0; orientation<4; orientation++){
1767
1769 if(orientation==0)
1774 if(orientation==0)
1776 }
1777 }
1778
1780 for(orientation=level ? 1 : 0; orientation<4; orientation++){
1782
1784 }
1785 }
1786
1789 for(y=0; y<h; y++){
1790 for(x=0; x<w; x++){
1792 }
1793 }
1794 }
1796 }else{
1797 //ME/MC only
1799 for(y=0; y<h; y++){
1800 for(x=0; x<w; x++){
1802 pict->
data[plane_index][y*pict->
linesize[plane_index] + x];
1803 }
1804 }
1805 }else{
1808 }
1809 }
1811 int64_t error= 0;
1812
1813 if(pict->
data[plane_index])
//FIXME gray hack
1814 for(y=0; y<h; y++){
1815 for(x=0; x<w; x++){
1817 error += d*d;
1818 }
1819 }
1822 }
1823
1824 }
1825
1827
1829
1841 return -1;
1849
1850 emms_c();
1851
1855 *got_packet = 1;
1856
1857 return 0;
1858 }
1859
1861 {
1863
1869
1870 return 0;
1871 }
1872
1873 #define OFFSET(x) offsetof(SnowContext, x)
1874 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
1877 {
"memc_only",
"Only do ME/MC (I frames -> ref, P frame -> ME+MC).",
OFFSET(memc_only),
AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1,
VE },
1878 {
"no_bitstream",
"Skip final bitstream writeout.",
OFFSET(no_bitstream),
AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1,
VE },
1880 };
1881
1887 };
1888
1902 },
1904 };
1905
1906
1907 #ifdef TEST
1908 #undef malloc
1909 #undef free
1910 #undef printf
1911
1914
1916 #define width 256
1917 #define height 256
1920 int i;
1924
1927
1929 fprintf(stderr, "Failed to allocate memory\n");
1930 return 1;
1931 }
1932
1934
1935 printf("testing 5/3 DWT\n");
1937 buffer[0][i] = buffer[1][i] =
av_lfg_get(&prng) % 54321 - 12345;
1938
1941
1943 if(buffer[0][i]!= buffer[1][i]) printf("fsck: %6d %12d %7d\n",i, buffer[0][i], buffer[1][i]);
1944
1945 printf("testing 9/7 DWT\n");
1948 buffer[0][i] = buffer[1][i] =
av_lfg_get(&prng) % 54321 - 12345;
1949
1952
1954 if(
FFABS(buffer[0][i] - buffer[1][i])>20) printf(
"fsck: %6d %12d %7d\n",i, buffer[0][i], buffer[1][i]);
1955
1956 {
1957 int level, orientation, x,
y;
1958 int64_t errors[8][4];
1960
1961 memset(errors, 0, sizeof(errors));
1965 for(orientation=level ? 1 : 0; orientation<4; orientation++){
1970 int64_t error=0;
1971
1972 if(orientation&1) buf+=w;
1973 if(orientation>1) buf+=stride>>1;
1974
1975 memset(buffer[0], 0,
sizeof(
int)*
width*height);
1976 buf[w/2 + h/2*stride]= 256*256;
1979 for(x=0; x<
width; x++){
1980 int64_t d= buffer[0][x + y*
width];
1981 error += d*d;
1982 if(
FFABS(width/2-x)<9 &&
FFABS(height/2-y)<9 && level==2) printf(
"%8"PRId64
" ", d);
1983 }
1984 if(
FFABS(height/2-y)<9 && level==2) printf(
"\n");
1985 }
1986 error= (int)(sqrt(error)+0.5);
1987 errors[
level][orientation]= error;
1988 if(g) g=
av_gcd(g, error);
1989 else g= error;
1990 }
1991 }
1992 printf("static int const visual_weight[][4]={\n");
1994 printf(" {");
1995 for(orientation=0; orientation<4; orientation++){
1996 printf("%8"PRId64",", errors[level][orientation]/g);
1997 }
1998 printf("},\n");
1999 }
2000 printf("};\n");
2001 {
2002 int level=2;
2004 //int h= height >> (s.spatial_decomposition_count-level);
2007 int64_t error=0;
2008
2009 buf+=w;
2010 buf+=stride>>1;
2011
2012 memset(buffer[0], 0, sizeof(int)*width*height);
2014 for(x=0; x<
width; x++){
2015 int tab[4]={0,2,3,1};
2016 buffer[0][x+width*
y]= 256*256*tab[(x&1) + 2*(y&1)];
2017 }
2018 }
2021 for(x=0; x<
width; x++){
2022 int64_t d= buffer[0][x + y*
width];
2023 error += d*d;
2024 if(
FFABS(width/2-x)<9 &&
FFABS(height/2-y)<9) printf(
"%8"PRId64
" ", d);
2025 }
2026 if(
FFABS(height/2-y)<9) printf(
"\n");
2027 }
2028 }
2029
2030 }
2031 return 0;
2032 }
2033 #endif /* TEST */