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
29
32
35
37 {
40
42 av_log(avctx,
AV_LOG_ERROR,
"This codec is under development, files encoded with it may not be decodable with future versions!!!\n"
43 "Use vstrict=-2 / -strict -2 to use it anyway.\n");
44 return -1;
45 }
46
51 return -1;
52 }
53
55
58
59 for(plane_index=0; plane_index<3; plane_index++){
66 }
67
71 }
73
75
79
87
89
91
95
98 }
101 return -1;
102 }
104
107 // case AV_PIX_FMT_YUV422P:
109 // case AV_PIX_FMT_YUV411P:
113 break;
117 break;
118 /* case AV_PIX_FMT_RGB32:
119 s->colorspace= 1;
120 break;*/
121 default:
123 return -1;
124 }
126
129
135
137 int i;
144 }
145 }
146
147 return 0;
148 }
149
150 //near copy & paste from dsputil, FIXME
152 {
154
155 s = 0;
156 for (i = 0; i < h; i++) {
157 for (j = 0; j < w; j++) {
158 s += pix[0];
159 pix ++;
160 }
161 pix += line_size - w;
162 }
164 }
165
166 //near copy & paste from dsputil, FIXME
168 {
171
172 s = 0;
173 for (i = 0; i < w; i++) {
174 for (j = 0; j < w; j ++) {
175 s += sq[pix[0]];
176 pix ++;
177 }
178 pix += line_size - w;
179 }
181 }
182
184 switch(type&0xFF){
185 default:
189 return (3*lambda)>>(FF_LAMBDA_SHIFT+1);
203 return 1;
204 }
205 }
206
207 //FIXME copy&paste
210 #define P_TOPRIGHT P[3]
211 #define P_MEDIAN P[4]
213 #define FLAG_QPEL 1 //must be 1
214
223 int score, score2, iscore, i_len, p_len, block_s, sum, base_bits;
227 const int index= (x + y*w) << rem_depth;
229 int trx= (x+1)<<rem_depth;
230 int try= (y+1)<<rem_depth;
236 const BlockNode *tr = y && trx<w && ((x&1)==0 || level==0) ? &s->
block[index-w+(1<<rem_depth)] : tl;
//FIXME use lt
237 int pl = left->
color[0];
238 int pcb= left->
color[1];
239 int pcr= left->
color[2];
240 int pmx, pmy;
241 int mx=0, my=0;
248 int P[10][2];
249 int16_t last_mv[3][2];
251 const int shift= 1+qpel;
257 int ref, best_ref, ref_score, ref_mx, ref_my;
258
261 set_blocks(s, level, x, y, pl, pcb, pcr, 0, 0, 0,
BLOCK_INTRA);
262 return 0;
263 }
264
265 // clip predictors / edge ?
266
273
276 last_mv[1][0]= right->
mx;
277 last_mv[1][1]= right->
my;
278 last_mv[2][0]= bottom->
mx;
279 last_mv[2][1]= bottom->
my;
280
285
288
293
294 c->
xmin = - x*block_w - 16+3;
295 c->
ymin = - y*block_w - 16+3;
298
306
309
310 if (!y) {
313 } else {
316 }
317
318 score= INT_MAX;
319 best_ref= 0;
322
325
330
338 }
339 if(score > ref_score){
340 score= ref_score;
341 best_ref= ref;
342 mx= ref_mx;
343 my= ref_my;
344 }
345 }
346 //FIXME if mb_cmp != SSE then intra cannot be compared currently and mb_penalty vs. lambda2
347
348 // subpel search
352 pc.bytestream= p_buffer; //FIXME end/start? and at the other stoo
354
356 put_rac(&pc, &p_state[4 + s_context], 1);
359 put_symbol(&pc, &p_state[128 + 1024 + 32*ref_context], best_ref, 0);
360 pred_mv(s, &pmx, &pmy, best_ref, left, top, tr);
361 put_symbol(&pc, &p_state[128 + 32*(mx_context + 16*!!best_ref)], mx - pmx, 1);
362 put_symbol(&pc, &p_state[128 + 32*(my_context + 16*!!best_ref)], my - pmy, 1);
363 p_len= pc.bytestream - pc.bytestream_start;
365
366 block_s= block_w*block_w;
367 sum =
pix_sum(current_data[0], stride, block_w, block_w);
368 l= (sum + block_s/2)/block_s;
369 iscore =
pix_norm1(current_data[0], stride, block_w) - 2*l*sum + l*l*block_s;
370
374 cb= (sum + block_s/2)/block_s;
375 // iscore += pix_norm1(¤t_mb[1][0], uvstride, block_w>>1) - 2*cb*sum + cb*cb*block_s;
377 cr= (sum + block_s/2)/block_s;
378 // iscore += pix_norm1(¤t_mb[2][0], uvstride, block_w>>1) - 2*cr*sum + cr*cr*block_s;
379 }else
380 cb = cr = 0;
381
384 ic.bytestream= i_buffer; //FIXME end/start? and at the other stoo
387 put_rac(&ic, &i_state[4 + s_context], 1);
393 }
394 i_len= ic.bytestream - ic.bytestream_start;
396
397 // assert(score==256*256*256*64-1);
398 av_assert1(iscore < 255*255*256 + s->lambda2*10);
402
403 if(level==0){
404 int varc= iscore >> 8;
405 int vard= score >> 8;
406 if (vard <= 64 || vard < varc)
408 else
410 }
411
419
420 if(score2 < score && score2 < iscore)
421 return score2;
422 }
423
424 if(iscore < score){
425 pred_mv(s, &pmx, &pmy, 0, left, top, tr);
426 memcpy(pbbak, i_buffer, i_len);
430 set_blocks(s, level, x, y, l, cb, cr, pmx, pmy, 0,
BLOCK_INTRA);
432 return iscore;
433 }else{
434 memcpy(pbbak, p_buffer, p_len);
438 set_blocks(s, level, x, y, pl, pcb, pcr, mx, my, best_ref, 0);
440 return score;
441 }
442 }
443
447 const int index= (x + y*w) << rem_depth;
448 int trx= (x+1)<<rem_depth;
453 const BlockNode *tr = y && trx<w && ((x&1)==0 || level==0) ? &s->
block[index-w+(1<<rem_depth)] : tl;
//FIXME use lt
454 int pl = left->
color[0];
455 int pcb= left->
color[1];
456 int pcr= left->
color[2];
457 int pmx, pmy;
462
464 set_blocks(s, level, x, y, pl, pcb, pcr, 0, 0, 0,
BLOCK_INTRA);
465 return;
466 }
467
471 }else{
477 return;
478 }
479 }
481 pred_mv(s, &pmx, &pmy, 0, left, top, tr);
487 }
488 set_blocks(s, level, x, y, b->
color[0], b->
color[1], b->
color[2], pmx, pmy, 0,
BLOCK_INTRA);
489 }else{
490 pred_mv(s, &pmx, &pmy, b->
ref, left, top, tr);
496 set_blocks(s, level, x, y, pl, pcb, pcr, b->
mx, b->
my, b->
ref, 0);
497 }
498 }
499
501 int i, x2, y2;
504 const int block_w = plane_index ? block_size>>s->
chroma_h_shift : block_size;
505 const int block_h = plane_index ? block_size>>s->
chroma_v_shift : block_size;
507 const int obmc_stride= plane_index ? (2*block_size)>>s->
chroma_h_shift : 2*block_size;
509 uint8_t *
src= s-> input_picture->data[plane_index];
512 const int w= p->
width;
514 int index= mb_x + mb_y*b_stride;
517 int ab=0;
518 int aa=0;
519
521
523 b->
color[plane_index]= 0;
524 memset(dst, 0, obmc_stride*obmc_stride*
sizeof(
IDWTELEM));
525
526 for(i=0; i<4; i++){
527 int mb_x2= mb_x + (i &1) - 1;
528 int mb_y2= mb_y + (i>>1) - 1;
529 int x= block_w*mb_x2 + block_w/2;
530 int y= block_h*mb_y2 + block_h/2;
531
532 add_yblock(s, 0, NULL, dst + (i&1)*block_w + (i>>1)*obmc_stride*block_h, NULL, obmc,
533 x, y, block_w, block_h, w, h, obmc_stride, ref_stride, obmc_stride, mb_x2, mb_y2, 0, 0, plane_index);
534
535 for(y2=
FFMAX(y, 0); y2<
FFMIN(h, y+block_h); y2++){
536 for(x2=
FFMAX(x, 0); x2<
FFMIN(w, x+block_w); x2++){
537 int index= x2-(block_w*mb_x - block_w/2) + (y2-(block_h*mb_y - block_h/2))*obmc_stride;
538 int obmc_v= obmc[
index];
539 int d;
540 if(y<0) obmc_v += obmc[index + block_h*obmc_stride];
541 if(x<0) obmc_v += obmc[index + block_w];
542 if(y+block_h>h) obmc_v += obmc[index - block_h*obmc_stride];
543 if(x+block_w>w) obmc_v += obmc[index - block_w];
544 //FIXME precalculate this or simplify it somehow else
545
548 ab += (
src[x2 + y2*ref_stride] - (d>>
FRAC_BITS)) * obmc_v;
549 aa += obmc_v * obmc_v; //FIXME precalculate this
550 }
551 }
552 }
553 *b= backup;
554
556 }
557
561 int index= x + y*b_stride;
565 const BlockNode *tl = y && x ? &s->
block[index-b_stride-1] : left;
566 const BlockNode *tr = y && x+w<b_stride ? &s->
block[index-b_stride+w] : tl;
567 int dmx, dmy;
568 // int mx_context= av_log2(2*FFABS(left->mx - top->mx));
569 // int my_context= av_log2(2*FFABS(left->my - top->my));
570
571 if(x<0 || x>=b_stride || y>=b_height)
572 return 0;
573 /*
574 1 0 0
575 01X 1-2 1
576 001XX 3-6 2-3
577 0001XXX 7-14 4-7
578 00001XXXX 15-30 8-15
579 */
580 //FIXME try accurate rate
581 //FIXME intra and inter predictors if surrounding blocks are not the same type
586 }else{
587 pred_mv(s, &dmx, &dmy, b->
ref, left, top, tr);
590 return 2*(1 +
av_log2(2*
FFABS(dmx))
//FIXME kill the 2* can be merged in lambda
593 }
594 }
595
599 const int block_w = plane_index ? block_size>>s->
chroma_h_shift : block_size;
600 const int block_h = plane_index ? block_size>>s->
chroma_v_shift : block_size;
601 const int obmc_stride= plane_index ? (2*block_size)>>s->
chroma_h_shift : 2*block_size;
604 uint8_t *
src= s-> input_picture->data[plane_index];
610 const int w= p->
width;
612 int distortion;
613 int rate= 0;
615 int sx= block_w*mb_x - block_w/2;
616 int sy= block_h*mb_y - block_h/2;
617 int x0=
FFMAX(0,-sx);
618 int y0=
FFMAX(0,-sy);
619 int x1=
FFMIN(block_w*2, w-sx);
620 int y1=
FFMIN(block_h*2, h-sy);
622
624
625 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);
626
627 for(y=y0; y<y1; y++){
628 const uint8_t *obmc1= obmc_edged[
y];
630 uint8_t *cur1 = cur + y*ref_stride;
631 uint8_t *dst1 = dst + sx + (sy+
y)*ref_stride;
632 for(x=x0; x<x1; x++){
633 #if FRAC_BITS >= LOG2_OBMC_MAX
635 #else
637 #endif
639 if(v&(~255)) v= ~(v>>31);
641 }
642 }
643
644 /* copy the regions where obmc[] = (uint8_t)256 */
646 && (mb_x == 0 || mb_x == b_stride-1)
647 && (mb_y == 0 || mb_y == b_height-1)){
648 if(mb_x == 0)
649 x1 = block_w;
650 else
651 x0 = block_w;
652 if(mb_y == 0)
653 y1 = block_h;
654 else
655 y0 = block_h;
656 for(y=y0; y<y1; y++)
657 memcpy(dst + sx+x0 + (sy+y)*ref_stride, cur + x0 + y*ref_stride, x1-x0);
658 }
659
660 if(block_w==16){
661 /* FIXME rearrange dsputil to fit 32x32 cmp functions */
662 /* FIXME check alignment of the cmp wavelet vs the encoding wavelet */
663 /* FIXME cmps overlap but do not cover the wavelet's whole support.
664 * So improving the score of one block is not strictly guaranteed
665 * to improve the score of the whole frame, thus iterative motion
666 * estimation does not always converge. */
668 distortion =
ff_w97_32_c(&s->
m,
src + sx + sy*ref_stride, dst + sx + sy*ref_stride, ref_stride, 32);
670 distortion =
ff_w53_32_c(&s->
m,
src + sx + sy*ref_stride, dst + sx + sy*ref_stride, ref_stride, 32);
671 else{
672 distortion = 0;
673 for(i=0; i<4; i++){
674 int off = sx+16*(i&1) + (sy+16*(i>>1))*ref_stride;
676 }
677 }
678 }else{
680 distortion = s->
dsp.
me_cmp[0](&s->
m,
src + sx + sy*ref_stride, dst + sx + sy*ref_stride, ref_stride, block_w*2);
681 }
682
683 if(plane_index==0){
684 for(i=0; i<4; i++){
685 /* ..RRr
686 * .RXx.
687 * rxx..
688 */
689 rate +=
get_block_bits(s, mb_x + (i&1) - (i>>1), mb_y + (i>>1), 1);
690 }
691 if(mb_x == b_stride-2)
693 }
694 return distortion + rate*penalty_factor;
695 }
696
698 int i, y2;
701 const int block_w = plane_index ? block_size>>s->
chroma_h_shift : block_size;
702 const int block_h = plane_index ? block_size>>s->
chroma_v_shift : block_size;
704 const int obmc_stride= plane_index ? (2*block_size)>>s->
chroma_h_shift : 2*block_size;
707 uint8_t *
src= s-> input_picture->data[plane_index];
708 //FIXME zero_dst is const but add_yblock changes dst if add is 0 (this is never the case for dst=zero_dst
709 // const has only been removed from zero_dst to suppress a warning
710 static IDWTELEM zero_dst[4096];
//FIXME
712 const int w= p->
width;
714 int distortion= 0;
715 int rate= 0;
717
719
720 for(i=0; i<9; i++){
721 int mb_x2= mb_x + (i%3) - 1;
722 int mb_y2= mb_y + (i/3) - 1;
723 int x= block_w*mb_x2 + block_w/2;
724 int y= block_h*mb_y2 + block_h/2;
725
727 x, y, block_w, block_h, w, h, /*dst_stride*/0, ref_stride, obmc_stride, mb_x2, mb_y2, 1, 1, plane_index);
728
729 //FIXME find a cleaner/simpler way to skip the outside stuff
730 for(y2= y; y2<0; y2++)
731 memcpy(dst + x + y2*ref_stride,
src + x + y2*ref_stride, block_w);
732 for(y2= h; y2<y+block_h; y2++)
733 memcpy(dst + x + y2*ref_stride,
src + x + y2*ref_stride, block_w);
734 if(x<0){
735 for(y2= y; y2<y+block_h; y2++)
736 memcpy(dst + x + y2*ref_stride,
src + x + y2*ref_stride, -x);
737 }
738 if(x+block_w > w){
739 for(y2= y; y2<y+block_h; y2++)
740 memcpy(dst + w + y2*ref_stride,
src + w + y2*ref_stride, x+block_w - w);
741 }
742
744 distortion += s->
dsp.
me_cmp[block_w==8](&s->
m,
src + x + y*ref_stride, dst + x + y*ref_stride, ref_stride, block_h);
745 }
746
747 if(plane_index==0){
750
751 /* ..RRRr
752 * .RXXx.
753 * .RXXx.
754 * rxxx.
755 */
756 if(merged)
758 for(i=merged?4:0; i<9; i++){
759 static const int dxy[9][2] = {{0,0},{1,0},{0,1},{1,1},{2,0},{2,1},{-1,2},{0,2},{1,2}};
761 }
762 }
763 return distortion + rate*penalty_factor;
764 }
765
767 const int w= b->
width;
770
771 if(1){
774 int run_index=0;
775 int max_index;
776
777 for(y=0; y<h; y++){
778 for(x=0; x<w; x++){
780 int /*ll=0, */l=0, lt=0,
t=0, rt=0;
782
783 if(y){
784 t= src[x + (y-1)*stride];
785 if(x){
786 lt= src[x - 1 + (y-1)*stride];
787 }
788 if(x + 1 < w){
789 rt= src[x + 1 + (y-1)*stride];
790 }
791 }
792 if(x){
794 /*if(x > 1){
795 if(orientation==1) ll= src[y + (x-2)*stride];
796 else ll= src[x - 2 + y*stride];
797 }*/
798 }
799 if(parent){
800 int px= x>>1;
801 int py= y>>1;
802 if(px<b->parent->width && py<b->parent->height)
803 p= parent[px + py*2*
stride];
804 }
805 if(!(
/*ll|*/l|lt|
t|rt|p)){
806 if(v){
807 runs[run_index++]=
run;
808 run=0;
809 }else{
810 run++;
811 }
812 }
813 }
814 }
815 max_index= run_index;
816 runs[run_index++]=
run;
817 run_index=0;
818 run= runs[run_index++];
819
821 if(run_index <= max_index)
823
824 for(y=0; y<h; y++){
827 return -1;
828 }
829 for(x=0; x<w; x++){
831 int /*ll=0, */l=0, lt=0,
t=0, rt=0;
833
834 if(y){
835 t= src[x + (y-1)*stride];
836 if(x){
837 lt= src[x - 1 + (y-1)*stride];
838 }
839 if(x + 1 < w){
840 rt= src[x + 1 + (y-1)*stride];
841 }
842 }
843 if(x){
845 /*if(x > 1){
846 if(orientation==1) ll= src[y + (x-2)*stride];
847 else ll= src[x - 2 + y*stride];
848 }*/
849 }
850 if(parent){
851 int px= x>>1;
852 int py= y>>1;
853 if(px<b->parent->width && py<b->parent->height)
854 p= parent[px + py*2*
stride];
855 }
856 if(
/*ll|*/l|lt|
t|rt|p){
858
860 }else{
861 if(!run){
862 run= runs[run_index++];
863
864 if(run_index <= max_index)
867 }else{
868 run--;
870 }
871 }
872 if(v){
874 int l2= 2*
FFABS(l) + (l<0);
876
879 }
880 }
881 }
882 }
883 return 0;
884 }
885
887 // encode_subband_qtree(s, b, src, parent, stride, orientation);
888 // encode_subband_z0run(s, b, src, parent, stride, orientation);
890 // encode_subband_dzr(s, b, src, parent, stride, orientation);
891 }
892
899
902
903 if(intra){
904 block->
color[0] = p[0];
905 block->
color[1] = p[1];
906 block->
color[2] = p[2];
908 }else{
912 return 0;
914
918 }
919
921
922 //FIXME chroma
923 if(rd < *best_rd){
924 *best_rd= rd;
925 return 1;
926 }else{
927 *block= backup;
928 return 0;
929 }
930 }
931
932 /* special case for int[2] args we discard afterwards,
933 * fixes compilation problem with gcc 2.95 */
935 int p[2] = {p0, p1};
936 return check_block(s, mb_x, mb_y, p, 0, obmc_edged, best_rd);
937 }
938
945
946 /* We don't initialize backup[] during variable declaration, because
947 * that fails to compile on MSVC: "cannot convert from 'BlockNode' to
948 * 'int16_t'". */
949 backup[0] = block[0];
950 backup[1] = block[1];
951 backup[2] = block[b_stride];
952 backup[3] = block[b_stride + 1];
953
957
961 return 0;
963
968 block[1]= block[b_stride]= block[b_stride+1]= *
block;
969
971
972 //FIXME chroma
973 if(rd < *best_rd){
974 *best_rd= rd;
975 return 1;
976 }else{
977 block[0]= backup[0];
978 block[1]= backup[1];
979 block[b_stride]= backup[2];
980 block[b_stride+1]= backup[3];
981 return 0;
982 }
983 }
984
986 int pass, mb_x, mb_y;
989 const int b_stride= b_width;
991
992 {
996 for(mb_y= 0; mb_y<s->
b_height; mb_y++)
997 for(mb_x= 0; mb_x<s->
b_width; mb_x++)
1001 }
1002
1003 for(pass=0; pass<25; pass++){
1004 int change= 0;
1005
1006 for(mb_y= 0; mb_y<b_height; mb_y++){
1007 for(mb_x= 0; mb_x<b_width; mb_x++){
1008 int dia_change, i, j, ref;
1009 int best_rd= INT_MAX, ref_rd;
1011 const int index= mb_x + mb_y * b_stride;
1016 BlockNode *bb = mb_y+1<b_height ? &s->
block[index+b_stride ] : NULL;
1017 BlockNode *tlb= mb_x && mb_y ? &s->
block[index-b_stride-1] : NULL;
1018 BlockNode *trb= mb_x+1<b_width && mb_y ? &s->
block[index-b_stride+1] : NULL;
1019 BlockNode *blb= mb_x && mb_y+1<b_height ? &s->
block[index+b_stride-1] : NULL;
1020 BlockNode *brb= mb_x+1<b_width && mb_y+1<b_height ? &s->
block[index+b_stride+1] : NULL;
1023
1025 continue;
1027
1029
1033
1034 //FIXME precalculate
1035 {
1037 for (y = 0; y < b_w * 2; y++)
1039 if(mb_x==0)
1040 for(y=0; y<b_w*2; y++)
1041 memset(obmc_edged[y], obmc_edged[y][0] + obmc_edged[y][b_w-1], b_w);
1042 if(mb_x==b_stride-1)
1043 for(y=0; y<b_w*2; y++)
1044 memset(obmc_edged[y]+b_w, obmc_edged[y][b_w] + obmc_edged[y][b_w*2-1], b_w);
1045 if(mb_y==0){
1046 for(x=0; x<b_w*2; x++)
1047 obmc_edged[0][x] += obmc_edged[b_w-1][x];
1048 for(y=1; y<b_w; y++)
1049 memcpy(obmc_edged[y], obmc_edged[0], b_w*2);
1050 }
1051 if(mb_y==b_height-1){
1052 for(x=0; x<b_w*2; x++)
1053 obmc_edged[b_w*2-1][x] += obmc_edged[b_w][x];
1054 for(y=b_w; y<b_w*2-1; y++)
1055 memcpy(obmc_edged[y], obmc_edged[b_w*2-1], b_w*2);
1056 }
1057 }
1058
1059 //skip stuff outside the picture
1060 if(mb_x==0 || mb_y==0 || mb_x==b_width-1 || mb_y==b_height-1){
1066 const int sx= block_w*mb_x - block_w/2;
1067 const int sy= block_h*mb_y - block_h/2;
1071
1072 for(y=sy; y<0; y++)
1073 memcpy(dst + sx + y*stride, src + sx + y*stride, block_w*2);
1074 for(y=h; y<sy+block_h*2; y++)
1075 memcpy(dst + sx + y*stride, src + sx + y*stride, block_w*2);
1076 if(sx<0){
1077 for(y=sy; y<sy+block_h*2; y++)
1078 memcpy(dst + sx + y*stride, src + sx + y*stride, -sx);
1079 }
1080 if(sx+block_w*2 > w){
1081 for(y=sy; y<sy+block_h*2; y++)
1082 memcpy(dst + w + y*stride, src + w + y*stride, sx+block_w*2 - w);
1083 }
1084 }
1085
1086 // intra(black) = neighbors' contribution to the current block
1088 color[i]=
get_dc(s, mb_x, mb_y, i);
1089
1090 // get previous score (cannot be cached due to OBMC)
1093 check_block(s, mb_x, mb_y, color0, 1, obmc_edged, &best_rd);
1094 }else
1096
1098 ref_rd= best_rd;
1102 continue;
1104 best_rd= INT_MAX;
1105
1108 if(tb)
1109 check_block_inter(s, mb_x, mb_y, mvr[-b_stride][0], mvr[-b_stride][1], obmc_edged, &best_rd);
1110 if(lb)
1112 if(rb)
1114 if(bb)
1115 check_block_inter(s, mb_x, mb_y, mvr[b_stride][0], mvr[b_stride][1], obmc_edged, &best_rd);
1116
1117 /* fullpel ME */
1118 //FIXME avoid subpel interpolation / round to nearest integer
1119 do{
1120 dia_change=0;
1122 for(j=0; j<i; j++){
1123 dia_change |=
check_block_inter(s, mb_x, mb_y, block->
mx+4*(i-j), block->
my+(4*j), obmc_edged, &best_rd);
1124 dia_change |=
check_block_inter(s, mb_x, mb_y, block->
mx-4*(i-j), block->
my-(4*j), obmc_edged, &best_rd);
1125 dia_change |=
check_block_inter(s, mb_x, mb_y, block->
mx+4*(i-j), block->
my-(4*j), obmc_edged, &best_rd);
1126 dia_change |=
check_block_inter(s, mb_x, mb_y, block->
mx-4*(i-j), block->
my+(4*j), obmc_edged, &best_rd);
1127 }
1128 }
1129 }while(dia_change);
1130 /* subpel ME */
1131 do{
1132 static const int square[8][2]= {{+1, 0},{-1, 0},{ 0,+1},{ 0,-1},{+1,+1},{-1,-1},{+1,-1},{-1,+1},};
1133 dia_change=0;
1134 for(i=0; i<8; i++)
1135 dia_change |=
check_block_inter(s, mb_x, mb_y, block->
mx+square[i][0], block->
my+square[i][1], obmc_edged, &best_rd);
1136 }while(dia_change);
1137 //FIXME or try the standard 2 pass qpel or similar
1138
1139 mvr[0][0]= block->
mx;
1140 mvr[0][1]= block->
my;
1141 if(ref_rd > best_rd){
1142 ref_rd= best_rd;
1144 }
1145 }
1146 best_rd= ref_rd;
1147 *block= ref_b;
1148 check_block(s, mb_x, mb_y, color, 1, obmc_edged, &best_rd);
1149 //FIXME RD style color selection
1159 change ++;
1160 }
1161 }
1162 }
1164 if(!change)
1165 break;
1166 }
1167
1169 int change= 0;
1170 for(mb_y= 0; mb_y<b_height; mb_y+=2){
1171 for(mb_x= 0; mb_x<b_width; mb_x+=2){
1172 int i;
1173 int best_rd, init_rd;
1174 const int index= mb_x + mb_y * b_stride;
1176
1178 b[1]= b[0]+1;
1179 b[2]= b[0]+b_stride;
1180 b[3]= b[2]+1;
1184 continue;
1185
1189
1191
1192 //FIXME more multiref search?
1194 (b[0]->mx + b[1]->mx + b[2]->mx + b[3]->mx + 2) >> 2,
1195 (b[0]->my + b[1]->my + b[2]->my + b[3]->my + 2) >> 2, 0, &best_rd);
1196
1197 for(i=0; i<4; i++)
1200
1201 if(init_rd != best_rd)
1202 change++;
1203 }
1204 }
1206 }
1207 }
1208
1213
1216
1217 for(y=0; y<h; y++){
1220 return;
1221 }
1222 for(x=0; x<w; x++){
1225 else
1227 }
1228 }
1229 }
1230
1232 const int w= b->
width;
1237
1239 for(y=0; y<h; y++)
1240 for(x=0; x<w; x++)
1241 dst[x + y*stride]= src[x + y*stride];
1242 return;
1243 }
1244
1245 bias= bias ? 0 : (3*qmul)>>3;
1247 thres2= 2*thres1;
1248
1249 if(!bias){
1250 for(y=0; y<h; y++){
1251 for(x=0; x<w; x++){
1252 int i= src[x + y*
stride];
1253
1254 if((unsigned)(i+thres1) > thres2){
1255 if(i>=0){
1257 i/= qmul; //FIXME optimize
1259 }else{
1260 i= -i;
1262 i/= qmul; //FIXME optimize
1264 }
1265 }else
1267 }
1268 }
1269 }else{
1270 for(y=0; y<h; y++){
1271 for(x=0; x<w; x++){
1272 int i= src[x + y*
stride];
1273
1274 if((unsigned)(i+thres1) > thres2){
1275 if(i>=0){
1277 i= (i + bias) / qmul; //FIXME optimize
1279 }else{
1280 i= -i;
1282 i= (i + bias) / qmul; //FIXME optimize
1284 }
1285 }else
1287 }
1288 }
1289 }
1290 }
1291
1293 const int w= b->
width;
1299
1301
1302 for(y=0; y<h; y++){
1303 for(x=0; x<w; x++){
1304 int i= src[x + y*
stride];
1305 if(i<0){
1306 src[x + y*
stride]= -((-i*qmul + qadd)>>(
QEXPSHIFT));
//FIXME try different bias
1307 }else if(i>0){
1309 }
1310 }
1311 }
1312 }
1313
1315 const int w= b->
width;
1318
1319 for(y=h-1; y>=0; y--){
1320 for(x=w-1; x>=0; x--){
1322
1323 if(x){
1324 if(use_median){
1325 if(y && x+1<w) src[i] -=
mid_pred(src[i - 1], src[i - stride], src[i - stride + 1]);
1326 else src[i] -= src[i - 1];
1327 }else{
1328 if(y) src[i] -=
mid_pred(src[i - 1], src[i - stride], src[i - 1] + src[i - stride] - src[i - 1 - stride]);
1329 else src[i] -= src[i - 1];
1330 }
1331 }else{
1332 if(y) src[i] -= src[i -
stride];
1333 }
1334 }
1335 }
1336 }
1337
1339 const int w= b->
width;
1342
1343 for(y=0; y<h; y++){
1344 for(x=0; x<w; x++){
1346
1347 if(x){
1348 if(use_median){
1349 if(y && x+1<w) src[i] +=
mid_pred(src[i - 1], src[i - stride], src[i - stride + 1]);
1350 else src[i] += src[i - 1];
1351 }else{
1352 if(y) src[i] +=
mid_pred(src[i - 1], src[i - stride], src[i - 1] + src[i - stride] - src[i - 1 - stride]);
1353 else src[i] += src[i - 1];
1354 }
1355 }else{
1356 if(y) src[i] += src[i -
stride];
1357 }
1358 }
1359 }
1360 }
1361
1363 int plane_index,
level, orientation;
1364
1365 for(plane_index=0; plane_index<
FFMIN(s->
nb_planes, 2); plane_index++){
1367 for(orientation=level ? 1:0; orientation<4; orientation++){
1368 if(orientation==2) continue;
1370 }
1371 }
1372 }
1373 }
1374
1376 int plane_index, i;
1378
1379 memset(kstate,
MID_STATE,
sizeof(kstate));
1380
1389 for(plane_index=0; plane_index<2; plane_index++){
1394 }
1395 }
1406 }
1408 // put_rac(&s->c, s->header_state, s->rate_scalability);
1410
1412 }
1413
1415 int update_mc=0;
1416 for(plane_index=0; plane_index<
FFMIN(s->
nb_planes, 2); plane_index++){
1421 }
1423 if(update_mc){
1424 for(plane_index=0; plane_index<
FFMIN(s->
nb_planes, 2); plane_index++){
1428 for(i= p->
htaps/2; i; i--)
1430 }
1431 }
1436 }else
1438 }
1439
1445
1446 }
1447
1449 int plane_index;
1450
1452 for(plane_index=0; plane_index<2; plane_index++){
1457 }
1458 }
1459
1466 }
1467
1470 + 61*
QROOT/8;
///< 64 > 60
1471 }
1472
1474 {
1475 /* Estimate the frame's complexity as a sum of weighted dwt coefficients.
1476 * FIXME we know exact mv bits at this point,
1477 * but ratecontrol isn't set up to include them. */
1478 uint32_t coef_sum= 0;
1479 int level, orientation, delta_qlog;
1480
1482 for(orientation=level ? 1 : 0; orientation<4; orientation++){
1485 const int w= b->
width;
1487 const int stride= b->
stride;
1490 const int qdiv= (1<<16)/qmul;
1492 //FIXME this is ugly
1493 for(y=0; y<h; y++)
1494 for(x=0; x<w; x++)
1495 buf[x+y*stride]= b->
buf[x+y*stride];
1496 if(orientation==0)
1498 for(y=0; y<h; y++)
1499 for(x=0; x<w; x++)
1500 coef_sum+= abs(buf[x+y*stride]) * qdiv >> 16;
1501 }
1502 }
1503
1504 /* ugly, ratecontrol just takes a sqrt again */
1505 coef_sum = (uint64_t)coef_sum * coef_sum >> 16;
1507
1511 }else{
1514 }
1515
1518 return INT_MIN;
1521 s->
qlog+= delta_qlog;
1522 return delta_qlog;
1523 }
1524
1528 int level, orientation, x,
y;
1529
1531 for(orientation=level ? 1 : 0; orientation<4; orientation++){
1534 int64_t error=0;
1535
1540 for(x=0; x<
width; x++){
1542 error += d*d;
1543 }
1544 }
1545
1546 b->
qlog= (int)(log(352256.0/sqrt(error)) / log(pow(2.0, 1.0/
QROOT))+0.5);
1547 }
1548 }
1549 }
1550
1552 AVFrame *pict,
int *got_packet)
1553 {
1559 int level, orientation, plane_index, i,
y,
ret;
1562
1565
1568
1572 for(y=0; y<(height>>vshift); y++)
1575 width>>hshift);
1577 width >> hshift, height >> vshift,
1580
1581 }
1584
1592 return -1;
1593 }
1594 }else{
1597 }
1598
1604 }
1608 }//else keep previous frame's qlog until after motion estimation
1609
1612
1617 int block_width = (width +15)>>4;
1618 int block_height= (height+15)>>4;
1620
1623
1627 s->
m. new_picture.f.data[0] = s-> input_picture->data[0];
1628 s->
m. last_picture_ptr= &s->
m. last_picture;
1648
1652
1658 }
1659
1663 }
1664
1665 redo_frame:
1666
1669 else
1671
1675
1679 }
1680
1683
1685
1687 for(plane_index=0; plane_index < s->
nb_planes; plane_index++){
1689 }
1690 }
1691
1696
1697 for(plane_index=0; plane_index < s->nb_planes; plane_index++){
1702 // int bits= put_bits_count(&s->c.pb);
1703
1705 //FIXME optimize
1706 if(pict->
data[plane_index])
//FIXME gray hack
1707 for(y=0; y<h; y++){
1708 for(x=0; x<w; x++){
1710 }
1711 }
1713
1714 if( plane_index==0
1723 goto redo_frame;
1724 }
1725
1727 for(y=0; y<h; y++){
1728 for(x=0; x<w; x++){
1730 }
1731 }
1732 }else{
1733 for(y=0; y<h; y++){
1734 for(x=0; x<w; x++){
1736 }
1737 }
1738 }
1739
1741
1744 if (delta_qlog <= INT_MIN)
1745 return -1;
1746 if(delta_qlog){
1747 //reordering qlog in the bitstream would eliminate this reset
1753 }
1754 }
1755
1757 for(orientation=level ? 1 : 0; orientation<4; orientation++){
1759
1761 if(orientation==0)
1766 if(orientation==0)
1768 }
1769 }
1770
1772 for(orientation=level ? 1 : 0; orientation<4; orientation++){
1774
1776 }
1777 }
1778
1781 for(y=0; y<h; y++){
1782 for(x=0; x<w; x++){
1784 }
1785 }
1786 }
1788 }else{
1789 //ME/MC only
1791 for(y=0; y<h; y++){
1792 for(x=0; x<w; x++){
1794 pict->
data[plane_index][y*pict->
linesize[plane_index] + x];
1795 }
1796 }
1797 }else{
1800 }
1801 }
1803 int64_t error= 0;
1804
1805 if(pict->
data[plane_index])
//FIXME gray hack
1806 for(y=0; y<h; y++){
1807 for(x=0; x<w; x++){
1809 error += d*d;
1810 }
1811 }
1814 }
1815
1816 }
1817
1819
1821
1833 return -1;
1841
1843
1847 *got_packet = 1;
1848
1849 return 0;
1850 }
1851
1853 {
1855
1860
1861 return 0;
1862 }
1863
1864 #define OFFSET(x) offsetof(SnowContext, x)
1865 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
1867 {
"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 },
1868 {
"no_bitstream",
"Skip final bitstream writeout.",
OFFSET(no_bitstream),
AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1,
VE },
1869 { NULL },
1870 };
1871
1877 };
1878
1892 },
1894 };
1895
1896
1897 #ifdef TEST
1898 #undef malloc
1899 #undef free
1900 #undef printf
1901
1904
1906 #define width 256
1907 #define height 256
1910 int i;
1914
1917
1919
1920 printf("testing 5/3 DWT\n");
1922 buffer[0][i] = buffer[1][i] =
av_lfg_get(&prng) % 54321 - 12345;
1923
1926
1928 if(buffer[0][i]!= buffer[1][i]) printf("fsck: %6d %12d %7d\n",i, buffer[0][i], buffer[1][i]);
1929
1930 printf("testing 9/7 DWT\n");
1933 buffer[0][i] = buffer[1][i] =
av_lfg_get(&prng) % 54321 - 12345;
1934
1937
1939 if(
FFABS(buffer[0][i] - buffer[1][i])>20) printf(
"fsck: %6d %12d %7d\n",i, buffer[0][i], buffer[1][i]);
1940
1941 {
1942 int level, orientation, x,
y;
1943 int64_t errors[8][4];
1945
1946 memset(errors, 0, sizeof(errors));
1950 for(orientation=level ? 1 : 0; orientation<4; orientation++){
1955 int64_t error=0;
1956
1957 if(orientation&1) buf+=w;
1958 if(orientation>1) buf+=stride>>1;
1959
1960 memset(buffer[0], 0,
sizeof(
int)*
width*height);
1961 buf[w/2 + h/2*
stride]= 256*256;
1964 for(x=0; x<
width; x++){
1965 int64_t d= buffer[0][x + y*
width];
1966 error += d*d;
1967 if(
FFABS(width/2-x)<9 &&
FFABS(height/2-y)<9 && level==2) printf(
"%8"PRId64
" ", d);
1968 }
1969 if(
FFABS(height/2-y)<9 && level==2) printf(
"\n");
1970 }
1971 error= (int)(sqrt(error)+0.5);
1972 errors[
level][orientation]= error;
1973 if(g) g=
av_gcd(g, error);
1974 else g= error;
1975 }
1976 }
1977 printf("static int const visual_weight[][4]={\n");
1979 printf(" {");
1980 for(orientation=0; orientation<4; orientation++){
1981 printf("%8"PRId64",", errors[level][orientation]/g);
1982 }
1983 printf("},\n");
1984 }
1985 printf("};\n");
1986 {
1987 int level=2;
1989 //int h= height >> (s.spatial_decomposition_count-level);
1992 int64_t error=0;
1993
1994 buf+=w;
1995 buf+=stride>>1;
1996
1997 memset(buffer[0], 0, sizeof(int)*width*height);
1999 for(x=0; x<
width; x++){
2000 int tab[4]={0,2,3,1};
2001 buffer[0][x+width*
y]= 256*256*tab[(x&1) + 2*(y&1)];
2002 }
2003 }
2006 for(x=0; x<
width; x++){
2007 int64_t d= buffer[0][x + y*
width];
2008 error += d*d;
2009 if(
FFABS(width/2-x)<9 &&
FFABS(height/2-y)<9) printf(
"%8"PRId64
" ", d);
2010 }
2011 if(
FFABS(height/2-y)<9) printf(
"\n");
2012 }
2013 }
2014
2015 }
2016 return 0;
2017 }
2018 #endif /* TEST */