1 /*
2 * Copyright (C) 2004 Michael Niedermayer <michaelni@gmx.at>
3 * Copyright (C) 2006 Robert Edele <yartrebo@earthlink.net>
4 *
5 * This file is part of FFmpeg.
6 *
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 */
21
22 #ifndef AVCODEC_SNOW_H
23 #define AVCODEC_SNOW_H
24
28
33
35
38 #define QROOT (1<<QSHIFT)
39 #define LOSSLESS_QLOG -128
41 #define MAX_REF_FRAMES 8
42
43 #define LOG2_OBMC_MAX 8
44 #define OBMC_MAX (1<<(LOG2_OBMC_MAX))
51 //#define TYPE_SPLIT 1
54 //#define TYPE_NOCOLOR 4
57
59 .
color= {128,128,128},
60 .mx= 0,
61 .my= 0,
62 .ref= 0,
63 .type= 0,
64 .level= 0,
65 };
66
67 #define LOG2_MB_SIZE 4
68 #define MB_SIZE (1<<LOG2_MB_SIZE)
69 #define ENCODER_EXTRA_BITS 4
71
76
82 int qlog;
///< log(qscale)/log[2^(1/6)]
92
97
102
107
123 // uint8_t q_context[16];
157 #define QBIAS_SHIFT 3
165 #define ME_CACHE_SIZE 1024
171
172 MpegEncContext m;
// needed for motion estimation, should not be used for anything else, the idea is to eventually make the motion estimation independent of MpegEncContext, so this will be removed then (FIXME/XXX)
173
177
178 /* Tables */
182
183 /* C bits used by mmx/sse2/altivec */
184
187
188 if (width & 1){
189 low[(*i)+1] = low[((*i)+1)>>1];
190 (*i)--;
191 }
192 }
193
195 for (; (*i)>=0; (*i)-=2){
196 low[(*i)+1] = high[(*i)>>1];
197 low[*i] = low[(*i)>>1];
198 }
199 }
200
202 for(; i<w; i++){
203 dst[i] = src[i] - ((mul * (ref[i] + ref[i + 1]) + add) >>
shift);
204 }
205
206 if((width^lift_high)&1){
207 dst[w] = src[w] - ((mul * 2 * ref[w] + add) >> shift);
208 }
209 }
210
212 for(; i<w; i++){
213 dst[i] = src[i] + ((ref[i] + ref[(i+1)]+
W_BO + 4 * src[i]) >>
W_BS);
214 }
215
216 if(width&1){
217 dst[w] = src[w] + ((2 * ref[w] +
W_BO + 4 * src[w]) >>
W_BS);
218 }
219 }
220
221 /* common code */
222
232 int plane_index, int w, int h);
233 /* common inline functions */
234 //XXX doublecheck all of them should stay inlined
235
236 static inline void snow_set_blocks(
SnowContext *
s,
int level,
int x,
int y,
int l,
int cb,
int cr,
int mx,
int my,
int ref,
int type){
239 const int index= (x + y*w) << rem_depth;
240 const int block_w= 1<<rem_depth;
242 int i,j;
243
252
253 for(j=0; j<block_w; j++){
254 for(i=0; i<block_w; i++){
256 }
257 }
258 }
259
265 }else{
268 (top ->
mx * scale[top ->
ref] + 128) >>8,
269 (tr ->
mx * scale[tr ->
ref] + 128) >>8);
271 (top ->
my * scale[top ->
ref] + 128) >>8,
272 (tr ->
my * scale[tr ->
ref] + 128) >>8);
273 }
274 }
275
279 }else{
281 }
282 }
283
284 //FIXME name cleanup (b_w, block_w, b_width stuff)
285 //XXX should we really inline it?
286 static av_always_inline void add_yblock(
SnowContext *
s,
int sliced,
slice_buffer *sb,
IDWTELEM *dst,
uint8_t *dst8,
const uint8_t *obmc,
int src_x,
int src_y,
int b_w,
int b_h,
int w,
int h,
int dst_stride,
int src_stride,
int obmc_stride,
int b_x,
int b_y,
int add,
int offset_dst,
int plane_index){
289 const int b_stride= b_width;
299
300 if(b_x<0){
301 lt= rt;
302 lb= rb;
303 }else if(b_x + 1 >= b_width){
304 rt= lt;
305 rb= lb;
306 }
307 if(b_y<0){
308 lt= lb;
309 rt= rb;
310 }else if(b_y + 1 >= b_height){
311 lb= lt;
312 rb= rt;
313 }
314
315 if(src_x<0){ //FIXME merge with prev & always round internal width up to *16
316 obmc -= src_x;
317 b_w += src_x;
318 if(!sliced && !offset_dst)
319 dst -= src_x;
320 src_x=0;
321 }else if(src_x + b_w > w){
322 b_w = w - src_x;
323 }
324 if(src_y<0){
325 obmc -= src_y*obmc_stride;
326 b_h += src_y;
327 if(!sliced && !offset_dst)
328 dst -= src_y*dst_stride;
329 src_y=0;
330 }else if(src_y + b_h> h){
331 b_h = h - src_y;
332 }
333
334 if(b_w<=0 || b_h<=0) return;
335
337
338 if(!sliced && offset_dst)
339 dst += src_x + src_y*dst_stride;
340 dst8+= src_x + src_y*src_stride;
341 // src += src_x + src_y*src_stride;
342
343 ptmp= tmp + 3*tmp_step;
344 block[0]= ptmp;
345 ptmp+=tmp_step;
346 ff_snow_pred_block(s, block[0], tmp, src_stride, src_x, src_y, b_w, b_h, lt, plane_index, w, h);
347
349 block[1]= block[0];
350 }else{
351 block[1]= ptmp;
352 ptmp+=tmp_step;
353 ff_snow_pred_block(s, block[1], tmp, src_stride, src_x, src_y, b_w, b_h, rt, plane_index, w, h);
354 }
355
357 block[2]= block[0];
359 block[2]= block[1];
360 }else{
361 block[2]= ptmp;
362 ptmp+=tmp_step;
363 ff_snow_pred_block(s, block[2], tmp, src_stride, src_x, src_y, b_w, b_h, lb, plane_index, w, h);
364 }
365
367 block[3]= block[0];
369 block[3]= block[1];
371 block[3]= block[2];
372 }else{
373 block[3]= ptmp;
374 ff_snow_pred_block(s, block[3], tmp, src_stride, src_x, src_y, b_w, b_h, rb, plane_index, w, h);
375 }
376 if(sliced){
377 s->
dwt.
inner_add_yblock(obmc, obmc_stride, block, b_w, b_h, src_x,src_y, src_stride, sb, add, dst8);
378 }else{
379 for(y=0; y<b_h; y++){
380 //FIXME ugly misuse of obmc_stride
381 const uint8_t *obmc1= obmc + y*obmc_stride;
382 const uint8_t *obmc2= obmc1+ (obmc_stride>>1);
383 const uint8_t *obmc3= obmc1+ obmc_stride*(obmc_stride>>1);
385 for(x=0; x<b_w; x++){
386 int v= obmc1[x] * block[3][x + y*src_stride]
387 +obmc2[x] * block[2][x + y*src_stride]
388 +obmc3[x] * block[1][x + y*src_stride]
389 +obmc4[x] * block[0][x + y*src_stride];
390
394 }
395 if(add){
396 v += dst[x + y*dst_stride];
398 if(v&(~255)) v= ~(v>>31);
399 dst8[x + y*src_stride] =
v;
400 }else{
401 dst[x + y*dst_stride] -=
v;
402 }
403 }
404 }
405 }
406 }
407
414 int block_w = plane_index ? block_size>>s->
chroma_h_shift : block_size;
415 int block_h = plane_index ? block_size>>s->
chroma_v_shift : block_size;
417 const int obmc_stride= plane_index ? (2*block_size)>>s->
chroma_h_shift : 2*block_size;
424 if(mb_y==mb_h)
425 return;
426
427 if(add){
428 for(y=block_h*mb_y; y<
FFMIN(h,block_h*(mb_y+1)); y++){
429 for(x=0; x<w; x++){
432 if(v&(~255)) v= ~(v>>31);
433 dst8[x + y*ref_stride]=
v;
434 }
435 }
436 }else{
437 for(y=block_h*mb_y; y<
FFMIN(h,block_h*(mb_y+1)); y++){
438 for(x=0; x<w; x++){
440 }
441 }
442 }
443
444 return;
445 }
446
447 for(mb_x=0; mb_x<=mb_w; mb_x++){
449 block_w*mb_x - block_w/2,
450 block_h*mb_y - block_h/2,
451 block_w, block_h,
452 w, h,
453 w, ref_stride, obmc_stride,
454 mb_x - 1, mb_y - 1,
455 add, 1, plane_index);
456 }
457 }
458
461 int mb_y;
462 for(mb_y=0; mb_y<=mb_h; mb_y++)
464 }
465
466 static inline void set_blocks(
SnowContext *
s,
int level,
int x,
int y,
int l,
int cb,
int cr,
int mx,
int my,
int ref,
int type){
469 const int index= (x + y*w) << rem_depth;
470 const int block_w= 1<<rem_depth;
471 const int block_h= 1<<rem_depth; //FIXME "w!=h"
473 int i,j;
474
483
484 for(j=0; j<block_h; j++){
485 for(i=0; i<block_w; i++){
487 }
488 }
489 }
490
497 };
498 int i;
499 for(i=0; i<3; i++){
500 c->
src[0][i]= src [i];
501 c->
ref[0][i]= ref [i] + offset[i];
502 }
504 }
505
506
507 /* bitstream functions */
508
510
511 #define QEXPSHIFT (7-FRAC_BITS+8) //FIXME try to change this to 0
512
514 int i;
515
516 if(v){
519 const int el=
FFMIN(e, 10);
521
522 for(i=0; i<el; i++){
523 put_rac(c, state+1+i, 1);
//1..10
524 }
525 for(; i<e; i++){
526 put_rac(c, state+1+9, 1);
//1..10
527 }
529
530 for(i=e-1; i>=el; i--){
531 put_rac(c, state+22+9, (a>>i)&1);
//22..31
532 }
533 for(; i>=0; i--){
534 put_rac(c, state+22+i, (a>>i)&1);
//22..31
535 }
536
537 if(is_signed)
538 put_rac(c, state+11 + el, v < 0);
//11..21
539 }else{
541 }
542 }
543
546 return 0;
547 else{
549 e= 0;
551 e++;
552 }
553
554 a= 1;
555 for(i=e-1; i>=0; i--){
557 }
558
559 e= -(is_signed &&
get_rac(c, state+11 +
FFMIN(e,10)));
//11..21
560 return (a^e)-e;
561 }
562 }
563
565 int i;
566 int r= log2>=0 ? 1<<log2 : 1;
567
570
571 while(v >= r){
574 log2++;
576 }
578
579 for(i=log2-1; i>=0; i--){
580 put_rac(c, state+31-i, (v>>i)&1);
581 }
582 }
583
585 int i;
586 int r= log2>=0 ? 1<<log2 : 1;
588
590
591 while(log2<28 &&
get_rac(c, state+4+log2)){
593 log2++;
595 }
596
597 for(i=log2-1; i>=0; i--){
599 }
600
602 }
603
605 const int w= b->
width;
608
615
618 else run= INT_MAX;
619
620 for(y=0; y<h; y++){
623
624 if(y && prev_xc->
x == 0){
626 }
627 for(x=0; x<w; x++){
628 int p=0;
630
632
633 if(y){
635 prev_xc++;
636 if(prev_xc->
x == x + 1)
638 else
639 rt=0;
640 }
641 if(parent_xc){
642 if(x>>1 > parent_xc->
x){
643 parent_xc++;
644 }
645 if(x>>1 == parent_xc->
x){
647 }
648 }
649 if(
/*ll|*/l|lt|
t|rt|p){
650 int context=
av_log2(
/*FFABS(ll) + */3*(l>>1) + (lt>>1) + (
t&~1) + (rt>>1) + (p>>1));
651
653 if(v){
656
659 }
660 }else{
661 if(!run){
663 else run= INT_MAX;
666
669 }else{
670 int max_run;
671 run--;
672 v=0;
674 if(y) max_run=
FFMIN(run, prev_xc->
x - x - 2);
675 else max_run=
FFMIN(run, w-x-1);
676 if(parent_xc)
677 max_run=
FFMIN(max_run, 2*parent_xc->
x - x - 1);
679
680 x+= max_run;
681 run-= max_run;
682 }
683 }
684 }
685 (xc++)->x= w+1; //end marker
686 prev_xc= prev2_xc;
687 prev2_xc= xc;
688
689 if(parent_xc){
690 if(y&1){
691 while(parent_xc->
x != parent->
width+1)
692 parent_xc++;
693 parent_xc++;
694 prev_parent_xc= parent_xc;
695 }else{
696 parent_xc= prev_parent_xc;
697 }
698 }
699 }
700
701 (xc++)->x= w+1; //end marker
702 }
703
704 #endif /* AVCODEC_SNOW_H */