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
30
34
35
40 for(y=0; y<b_h; y++){
41 //FIXME ugly misuse of obmc_stride
42 const uint8_t *obmc1= obmc + y*obmc_stride;
43 const uint8_t *obmc2= obmc1+ (obmc_stride>>1);
44 const uint8_t *obmc3= obmc1+ obmc_stride*(obmc_stride>>1);
47 for(x=0; x<b_w; x++){
48 int v= obmc1[x] * block[3][x + y*src_stride]
49 +obmc2[x] * block[2][x + y*src_stride]
50 +obmc3[x] * block[1][x + y*src_stride]
51 +obmc4[x] * block[0][x + y*src_stride];
52
56 }
57 if(add){
58 v += dst[x + src_x];
60 if(v&(~255)) v= ~(v>>31);
61 dst8[x + y*src_stride] =
v;
62 }else{
64 }
65 }
66 }
67 }
68
70 int plane_index,
level, orientation;
71
72 for(plane_index=0; plane_index<3; plane_index++){
74 for(orientation=level ? 1:0; orientation<4; orientation++){
76 }
77 }
78 }
81 }
82
86
89
92 return 0;
93 }
94
96 int i;
98
99 for(i=0; i<
QROOT; i++){
101 v *= pow(2, 1.0 / QROOT);
102 }
103 }
106 8,7,6,5,4,3,2,1,
107 7,7,0,0,0,0,0,1,
108 6,0,6,0,0,0,2,0,
109 5,0,0,5,0,3,0,0,
110 4,0,0,0,4,0,0,0,
111 3,0,0,5,0,3,0,0,
112 2,0,6,0,0,0,2,0,
113 1,7,0,0,0,0,0,1,
114 };
115
116 static const uint8_t brane[256]={
117 0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x11,0x12,0x12,0x12,0x12,0x12,0x12,0x12,
118 0x04,0x05,0xcc,0xcc,0xcc,0xcc,0xcc,0x41,0x15,0x16,0xcc,0xcc,0xcc,0xcc,0xcc,0x52,
119 0x04,0xcc,0x05,0xcc,0xcc,0xcc,0x41,0xcc,0x15,0xcc,0x16,0xcc,0xcc,0xcc,0x52,0xcc,
120 0x04,0xcc,0xcc,0x05,0xcc,0x41,0xcc,0xcc,0x15,0xcc,0xcc,0x16,0xcc,0x52,0xcc,0xcc,
121 0x04,0xcc,0xcc,0xcc,0x41,0xcc,0xcc,0xcc,0x15,0xcc,0xcc,0xcc,0x16,0xcc,0xcc,0xcc,
122 0x04,0xcc,0xcc,0x41,0xcc,0x05,0xcc,0xcc,0x15,0xcc,0xcc,0x52,0xcc,0x16,0xcc,0xcc,
123 0x04,0xcc,0x41,0xcc,0xcc,0xcc,0x05,0xcc,0x15,0xcc,0x52,0xcc,0xcc,0xcc,0x16,0xcc,
124 0x04,0x41,0xcc,0xcc,0xcc,0xcc,0xcc,0x05,0x15,0x52,0xcc,0xcc,0xcc,0xcc,0xcc,0x16,
125 0x44,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x55,0x56,0x56,0x56,0x56,0x56,0x56,0x56,
126 0x48,0x49,0xcc,0xcc,0xcc,0xcc,0xcc,0x85,0x59,0x5A,0xcc,0xcc,0xcc,0xcc,0xcc,0x96,
127 0x48,0xcc,0x49,0xcc,0xcc,0xcc,0x85,0xcc,0x59,0xcc,0x5A,0xcc,0xcc,0xcc,0x96,0xcc,
128 0x48,0xcc,0xcc,0x49,0xcc,0x85,0xcc,0xcc,0x59,0xcc,0xcc,0x5A,0xcc,0x96,0xcc,0xcc,
129 0x48,0xcc,0xcc,0xcc,0x49,0xcc,0xcc,0xcc,0x59,0xcc,0xcc,0xcc,0x96,0xcc,0xcc,0xcc,
130 0x48,0xcc,0xcc,0x85,0xcc,0x49,0xcc,0xcc,0x59,0xcc,0xcc,0x96,0xcc,0x5A,0xcc,0xcc,
131 0x48,0xcc,0x85,0xcc,0xcc,0xcc,0x49,0xcc,0x59,0xcc,0x96,0xcc,0xcc,0xcc,0x5A,0xcc,
132 0x48,0x85,0xcc,0xcc,0xcc,0xcc,0xcc,0x49,0x59,0x96,0xcc,0xcc,0xcc,0xcc,0xcc,0x5A,
133 };
134
135 static const uint8_t needs[16]={
136 0,1,0,0,
137 2,4,2,0,
138 0,1,0,0,
139 15
140 };
141
145 int16_t *tmpI= tmpIt;
149 r= brane[dx + 16*dy]&15;
150 l= brane[dx + 16*dy]>>4;
151
152 b= needs[l] | needs[
r];
154 b= 15;
155
156 if(b&5){
158 for(x=0; x < b_w; x++){
159 int a_1=src[x + HTAPS_MAX/2-4];
160 int a0= src[x + HTAPS_MAX/2-3];
161 int a1= src[x + HTAPS_MAX/2-2];
162 int a2= src[x + HTAPS_MAX/2-1];
163 int a3= src[x + HTAPS_MAX/2+0];
164 int a4= src[x + HTAPS_MAX/2+1];
165 int a5= src[x + HTAPS_MAX/2+2];
166 int a6= src[x + HTAPS_MAX/2+3];
167 int am=0;
169 am= 20*(a2+
a3) - 5*(a1+a4) + (a0+
a5);
170 tmpI[x]= am;
171 am= (am+16)>>5;
172 }else{
174 tmpI[x]= am;
175 am= (am+32)>>6;
176 }
177
178 if(am&(~255)) am= ~(am>>31);
179 tmp2[x]= am;
180 }
181 tmpI+= 64;
182 tmp2+= 64;
184 }
186 }
188 tmp2= tmp2t[1];
189
190 if(b&2){
191 for(y=0; y < b_h; y++){
192 for(x=0; x < b_w+1; x++){
201 int am=0;
203 am= (20*(a2+
a3) - 5*(a1+a4) + (a0+
a5) + 16)>>5;
204 else
206
207 if(am&(~255)) am= ~(am>>31);
208 tmp2[x]= am;
209 }
211 tmp2+= 64;
212 }
214 }
216 tmp2= tmp2t[2];
217 tmpI= tmpIt;
218 if(b&4){
219 for(y=0; y < b_h; y++){
220 for(x=0; x < b_w; x++){
229 int am=0;
231 am= (20*(a2+
a3) - 5*(a1+a4) + (a0+
a5) + 512)>>10;
232 else
234 if(am&(~255)) am= ~(am>>31);
235 tmp2[x]= am;
236 }
237 tmpI+= 64;
238 tmp2+= 64;
239 }
240 }
241
244 hpel[ 2]= src + 1;
245
246 hpel[ 4]= tmp2t[1];
247 hpel[ 5]= tmp2t[2];
248 hpel[ 6]= tmp2t[1] + 1;
249
251 hpel[ 9]= hpel[1] + 64;
252 hpel[10]= hpel[8] + 1;
253
254 #define MC_STRIDE(x) (needs[x] ? 64 : stride)
255
256 if(b==15){
257 int dxy = dx / 8 + dy / 8 * 4;
258 const uint8_t *src1 = hpel[dxy ];
259 const uint8_t *src2 = hpel[dxy + 1];
260 const uint8_t *src3 = hpel[dxy + 4];
261 const uint8_t *src4 = hpel[dxy + 5];
266 dx&=7;
267 dy&=7;
268 for(y=0; y < b_h; y++){
269 for(x=0; x < b_w; x++){
270 dst[x]= ((8-dx)*(8-dy)*src1[x] + dx*(8-dy)*src2[x]+
271 (8-dx)* dy *src3[x] + dx* dy *src4[x]+32)>>6;
272 }
273 src1+=stride1;
274 src2+=stride2;
275 src3+=stride3;
276 src4+=stride4;
278 }
279 }else{
284 int a= weight[((dx&7) + (8*(dy&7)))];
286 for(y=0; y < b_h; y++){
287 for(x=0; x < b_w; x++){
288 dst[x]= (a*src1[x] + b*src2[x] + 4)>>3;
289 }
290 src1+=stride1;
291 src2+=stride2;
293 }
294 }
295 }
296
297 void ff_snow_pred_block(
SnowContext *
s,
uint8_t *dst,
uint8_t *tmp,
int stride,
int sx,
int sy,
int b_w,
int b_h,
BlockNode *
block,
int plane_index,
int w,
int h){
300 const unsigned color = block->
color[plane_index];
301 const unsigned color4 = color*0x01010101;
302 if(b_w==32){
303 for(y=0; y < b_h; y++){
304 *(uint32_t*)&dst[0 + y*stride]= color4;
305 *(uint32_t*)&dst[4 + y*stride]= color4;
306 *(uint32_t*)&dst[8 + y*stride]= color4;
307 *(uint32_t*)&dst[12+ y*stride]= color4;
308 *(uint32_t*)&dst[16+ y*stride]= color4;
309 *(uint32_t*)&dst[20+ y*stride]= color4;
310 *(uint32_t*)&dst[24+ y*stride]= color4;
311 *(uint32_t*)&dst[28+ y*stride]= color4;
312 }
313 }else if(b_w==16){
314 for(y=0; y < b_h; y++){
315 *(uint32_t*)&dst[0 + y*stride]= color4;
316 *(uint32_t*)&dst[4 + y*stride]= color4;
317 *(uint32_t*)&dst[8 + y*stride]= color4;
318 *(uint32_t*)&dst[12+ y*stride]= color4;
319 }
320 }else if(b_w==8){
321 for(y=0; y < b_h; y++){
322 *(uint32_t*)&dst[0 + y*stride]= color4;
323 *(uint32_t*)&dst[4 + y*stride]= color4;
324 }
325 }else if(b_w==4){
326 for(y=0; y < b_h; y++){
327 *(uint32_t*)&dst[0 + y*stride]= color4;
328 }
329 }else{
330 for(y=0; y < b_h; y++){
331 for(x=0; x < b_w; x++){
333 }
334 }
335 }
336 }else{
339 int mx= block->
mx*scale;
340 int my= block->
my*scale;
341 const int dx= mx&15;
342 const int dy= my&15;
343 const int tab_index= 3 - (b_w>>2) + (b_w>>4);
351 }
352
354
356 av_assert2((tab_index>=0 && tab_index<4) || b_w==32);
357 if((dx&3) || (dy&3) || !(b_w == b_h || 2*b_w == b_h || b_w == 2*b_h) || (b_w&(b_w-1)) || !s->
plane[plane_index].
fast_mc )
358 mc_block(&s->
plane[plane_index], dst, src, stride, b_w, b_h, dx, dy);
359 else if(b_w==32){
361 for(y=0; y<b_h; y+=16){
364 }
365 }else if(b_w==b_h)
367 else if(b_w==2*b_h){
370 }else{
374 }
375 }
376 }
377
378 #define mca(dx,dy,b_w)\
379 static void mc_block_hpel ## dx ## dy ## b_w(uint8_t *dst, const uint8_t *src, ptrdiff_t stride, int h){\
380 av_assert2(h==b_w);\
381 mc_block(NULL, dst, src-(HTAPS_MAX/2-1)-(HTAPS_MAX/2-1)*stride, stride, b_w, b_w, dx, dy);\
382 }
383
392
396 int i, j;
397
399 s->
max_ref_frames=1;
//just make sure it's not an invalid value in case of no initial keyframe
400
406
407 #define mcf(dx,dy)\
408 s->dsp.put_qpel_pixels_tab [0][dy+dx/4]=\
409 s->dsp.put_no_rnd_qpel_pixels_tab[0][dy+dx/4]=\
410 s->h264qpel.put_h264_qpel_pixels_tab[0][dy+dx/4];\
411 s->dsp.put_qpel_pixels_tab [1][dy+dx/4]=\
412 s->dsp.put_no_rnd_qpel_pixels_tab[1][dy+dx/4]=\
413 s->h264qpel.put_h264_qpel_pixels_tab[1][dy+dx/4];
414
431
432 #define mcfh(dx,dy)\
433 s->hdsp.put_pixels_tab [0][dy/4+dx/8]=\
434 s->hdsp.put_no_rnd_pixels_tab[0][dy/4+dx/8]=\
435 mc_block_hpel ## dx ## dy ## 16;\
436 s->hdsp.put_pixels_tab [1][dy/4+dx/8]=\
437 s->hdsp.put_no_rnd_pixels_tab[1][dy/4+dx/8]=\
438 mc_block_hpel ## dx ## dy ## 8;
439
444
446
447 // dec += FFMAX(s->chroma_h_shift, s->chroma_v_shift);
448
451
457
462 }
463
466
467 return 0;
468 fail:
470 }
471
474 int plane_index,
level, orientation;
475 int ret, emu_buf_size;
476
484 }
485
489 }
490
491 for(plane_index=0; plane_index<3; plane_index++){
494
495 if(plane_index){
498 }
501
503 for(orientation=level ? 1 : 0; orientation<4; orientation++){
505
509 b->
width = (w + !(orientation&1))>>1;
510 b->
height= (h + !(orientation>1))>>1;
511
515
516 if(orientation&1){
519 }
520 if(orientation>1){
523 }
525
526 if(level)
528 //FIXME avoid this realloc
531 }
532 w= (w+1)>>1;
533 h= (h+1)>>1;
534 }
535 }
536
537 return 0;
538 fail:
540 }
541
542 #define USE_HALFPEL_PLANE 0
543
546
547 for(p=0; p<3; p++){
548 int is_chroma= !!p;
553
557
559 for(y=0; y<h; y++){
560 for(x=0; x<w; x++){
561 int i= y*ls + x;
562
563 halfpel[1][p][i]= (20*(src[i] + src[i+1]) - 5*(src[i-1] + src[i+2]) + (src[i-2] + src[i+3]) + 16 )>>5;
564 }
565 }
566 for(y=0; y<h; y++){
567 for(x=0; x<w; x++){
568 int i= y*ls + x;
569
570 halfpel[2][p][i]= (20*(src[i] + src[i+ls]) - 5*(src[i-ls] + src[i+2*ls]) + (src[i-2*ls] + src[i+3*ls]) + 16 )>>5;
571 }
572 }
573 src= halfpel[1][p];
574 for(y=0; y<h; y++){
575 for(x=0; x<w; x++){
576 int i= y*ls + x;
577
578 halfpel[3][p][i]= (20*(src[i] + src[i+ls]) - 5*(src[i-ls] + src[i+2*ls]) + (src[i-2*ls] + src[i+3*ls]) + 16 )>>5;
579 }
580 }
581
582 //FIXME border!
583 }
584 }
585
587 {
589 int i;
590
593 for(i=0; i<9; i++)
596 }
597 }
598
602 int w= s->
avctx->
width;
//FIXME round up to x16 ?
604
615 }
616
618
627
630 }else{
631 int i;
634 break;
638 return -1;
639 }
640 }
641
644
646
647 return 0;
648 }
649
651 {
652 int plane_index,
level, orientation, i;
653
659
665
669
676 }
677 }
678
679 for(plane_index=0; plane_index<3; plane_index++){
681 for(orientation=level ? 1 : 0; orientation<4; orientation++){
683
685 }
686 }
687 }
690 }