52 s->spatial_decomposition_type=
s->pred;
57 for(plane_index=0; plane_index<3; plane_index++){
58 s->plane[plane_index].diag_mc= 1;
59 s->plane[plane_index].htaps= 6;
60 s->plane[plane_index].hcoeff[0]= 40;
61 s->plane[plane_index].hcoeff[1]= -10;
62 s->plane[plane_index].hcoeff[2]= 2;
63 s->plane[plane_index].fast_mc= 1;
79 s->m.mb_num = (avctx->
width * avctx->
height + 255) / 256;
82 s->m.me.scratchpad =
av_calloc(avctx->
width + 64, 2*16*2*
sizeof(uint8_t));
86 if (!
s->m.me.scratchpad || !
s->m.me.map || !
s->m.me.score_map || !
s->m.sc.obmc_scratchpad)
114 s->colorspace_type= 0;
118 s->colorspace_type = 1;
131 ff_set_cmp(&
s->mecc,
s->mecc.me_sub_cmp,
s->avctx->me_sub_cmp);
134 if (!
s->input_picture)
141 int size=
s->b_width *
s->b_height << 2*
s->block_max_depth;
142 for(
i=0;
i<
s->max_ref_frames;
i++){
145 if (!
s->ref_mvs[
i] || !
s->ref_scores[
i])
154 static int pix_sum(uint8_t * pix,
int line_size,
int w,
int h)
159 for (
i = 0;
i <
h;
i++) {
160 for (j = 0; j <
w; j++) {
164 pix += line_size -
w;
176 for (
i = 0;
i <
w;
i++) {
177 for (j = 0; j <
w; j ++) {
181 pix += line_size -
w;
213 #define P_TOPRIGHT P[3]
214 #define P_MEDIAN P[4]
216 #define FLAG_QPEL 1 //must be 1
219 uint8_t p_buffer[1024];
220 uint8_t i_buffer[1024];
221 uint8_t p_state[
sizeof(
s->block_state)];
222 uint8_t i_state[
sizeof(
s->block_state)];
224 uint8_t *pbbak=
s->c.bytestream;
225 uint8_t *pbbak_start=
s->c.bytestream_start;
226 int score, score2, iscore, i_len, p_len, block_s, sum, base_bits;
227 const int w=
s->b_width <<
s->block_max_depth;
228 const int h=
s->b_height <<
s->block_max_depth;
229 const int rem_depth=
s->block_max_depth -
level;
230 const int index= (x + y*
w) << rem_depth;
232 int trx= (x+1)<<rem_depth;
233 int try= (y+1)<<rem_depth;
240 int pl =
left->color[0];
241 int pcb=
left->color[1];
242 int pcr=
left->color[2];
246 const int stride=
s->current_picture->linesize[0];
247 const int uvstride=
s->current_picture->linesize[1];
248 uint8_t *current_data[3]= {
s->input_picture->data[0] + (x + y*
stride)*block_w,
249 s->input_picture->data[1] + ((x*block_w)>>
s->chroma_h_shift) + ((y*uvstride*block_w)>>
s->chroma_v_shift),
250 s->input_picture->data[2] + ((x*block_w)>>
s->chroma_h_shift) + ((y*uvstride*block_w)>>
s->chroma_v_shift)};
252 int16_t last_mv[3][2];
254 const int shift= 1+qpel;
260 int ref, best_ref, ref_score, ref_mx, ref_my;
264 set_blocks(
s,
level, x, y, pl, pcb, pcr, 0, 0, 0,
BLOCK_INTRA);
277 last_mv[0][0]=
s->block[
index].mx;
278 last_mv[0][1]=
s->block[
index].my;
279 last_mv[1][0]= right->
mx;
280 last_mv[1][1]= right->
my;
281 last_mv[2][0]= bottom->
mx;
282 last_mv[2][1]= bottom->
my;
295 c->current_mv_penalty=
c->mv_penalty[
s->m.f_code=1] +
MAX_DMV;
297 c->xmin = - x*block_w - 16+3;
298 c->ymin = - y*block_w - 16+3;
299 c->xmax = - (x+1)*block_w + (
w<<(
LOG2_MB_SIZE -
s->block_max_depth)) + 16-3;
300 c->ymax = - (y+1)*block_w + (
h<<(
LOG2_MB_SIZE -
s->block_max_depth)) + 16-3;
324 init_ref(
c, current_data,
s->last_picture[
ref]->data,
NULL, block_w*x, block_w*y, 0);
334 ref_score=
c->sub_motion_search(&
s->m, &ref_mx, &ref_my, ref_score, 0, 0,
level-
LOG2_MB_SIZE+4, block_w);
342 if(score > ref_score){
352 base_bits=
get_rac_count(&
s->c) - 8*(
s->c.bytestream -
s->c.bytestream_start);
355 pc.bytestream= p_buffer;
356 memcpy(p_state,
s->block_state,
sizeof(
s->block_state));
358 if(
level!=
s->block_max_depth)
359 put_rac(&pc, &p_state[4 + s_context], 1);
361 if(
s->ref_frames > 1)
362 put_symbol(&pc, &p_state[128 + 1024 + 32*ref_context], best_ref, 0);
364 put_symbol(&pc, &p_state[128 + 32*(mx_context + 16*!!best_ref)], mx - pmx, 1);
365 put_symbol(&pc, &p_state[128 + 32*(my_context + 16*!!best_ref)], my - pmy, 1);
366 p_len= pc.bytestream - pc.bytestream_start;
369 block_s= block_w*block_w;
371 l= (sum + block_s/2)/block_s;
372 iscore =
pix_norm1(current_data[0],
stride, block_w) - 2*l*sum + l*l*block_s;
374 if (
s->nb_planes > 2) {
375 block_s= block_w*block_w>>(
s->chroma_h_shift +
s->chroma_v_shift);
376 sum =
pix_sum(current_data[1], uvstride, block_w>>
s->chroma_h_shift, block_w>>
s->chroma_v_shift);
377 cb= (sum + block_s/2)/block_s;
379 sum =
pix_sum(current_data[2], uvstride, block_w>>
s->chroma_h_shift, block_w>>
s->chroma_v_shift);
380 cr= (sum + block_s/2)/block_s;
387 ic.bytestream= i_buffer;
388 memcpy(i_state,
s->block_state,
sizeof(
s->block_state));
389 if(
level!=
s->block_max_depth)
390 put_rac(&ic, &i_state[4 + s_context], 1);
393 if (
s->nb_planes > 2) {
397 i_len= ic.bytestream - ic.bytestream_start;
400 av_assert1(iscore < 255*255*256 + s->lambda2*10);
406 int varc= iscore >> 8;
407 int vard= score >> 8;
408 if (vard <= 64 || vard < varc)
411 c->scene_change_score+=
s->m.qscale;
414 if(
level!=
s->block_max_depth){
415 put_rac(&
s->c, &
s->block_state[4 + s_context], 0);
422 if(score2 < score && score2 < iscore)
428 memcpy(pbbak, i_buffer, i_len);
430 s->c.bytestream_start= pbbak_start;
431 s->c.bytestream= pbbak + i_len;
432 set_blocks(
s,
level, x, y, l,
cb,
cr, pmx, pmy, 0,
BLOCK_INTRA);
433 memcpy(
s->block_state, i_state,
sizeof(
s->block_state));
436 memcpy(pbbak, p_buffer, p_len);
438 s->c.bytestream_start= pbbak_start;
439 s->c.bytestream= pbbak + p_len;
440 set_blocks(
s,
level, x, y, pl, pcb, pcr, mx, my, best_ref, 0);
441 memcpy(
s->block_state, p_state,
sizeof(
s->block_state));
447 const int w=
s->b_width <<
s->block_max_depth;
448 const int rem_depth=
s->block_max_depth -
level;
449 const int index= (x + y*
w) << rem_depth;
450 int trx= (x+1)<<rem_depth;
456 int pl =
left->color[0];
457 int pcb=
left->color[1];
458 int pcr=
left->color[2];
466 set_blocks(
s,
level, x, y, pl, pcb, pcr, 0, 0, 0,
BLOCK_INTRA);
470 if(
level!=
s->block_max_depth){
472 put_rac(&
s->c, &
s->block_state[4 + s_context], 1);
474 put_rac(&
s->c, &
s->block_state[4 + s_context], 0);
486 if (
s->nb_planes > 2) {
490 set_blocks(
s,
level, x, y,
b->color[0],
b->color[1],
b->color[2], pmx, pmy, 0,
BLOCK_INTRA);
494 if(
s->ref_frames > 1)
495 put_symbol(&
s->c, &
s->block_state[128 + 1024 + 32*ref_context],
b->ref, 0);
496 put_symbol(&
s->c, &
s->block_state[128 + 32*mx_context],
b->mx - pmx, 1);
497 put_symbol(&
s->c, &
s->block_state[128 + 32*my_context],
b->my - pmy, 1);
498 set_blocks(
s,
level, x, y, pl, pcb, pcr,
b->mx,
b->my,
b->ref, 0);
504 Plane *p= &
s->plane[plane_index];
505 const int block_size =
MB_SIZE >>
s->block_max_depth;
506 const int block_w = plane_index ? block_size>>
s->chroma_h_shift : block_size;
507 const int block_h = plane_index ? block_size>>
s->chroma_v_shift : block_size;
509 const int obmc_stride= plane_index ? (2*block_size)>>
s->chroma_h_shift : 2*block_size;
510 const int ref_stride=
s->current_picture->linesize[plane_index];
511 uint8_t *
src=
s-> input_picture->data[plane_index];
512 IDWTELEM *dst= (
IDWTELEM*)
s->m.sc.obmc_scratchpad + plane_index*block_size*block_size*4;
513 const int b_stride =
s->b_width <<
s->block_max_depth;
516 int index= mb_x + mb_y*b_stride;
525 b->color[plane_index]= 0;
526 memset(dst, 0, obmc_stride*obmc_stride*
sizeof(
IDWTELEM));
529 int mb_x2= mb_x + (
i &1) - 1;
530 int mb_y2= mb_y + (
i>>1) - 1;
531 int x= block_w*mb_x2 + block_w/2;
532 int y= block_h*mb_y2 + block_h/2;
535 x, y, block_w, block_h,
w,
h, obmc_stride, ref_stride, obmc_stride, mb_x2, mb_y2, 0, 0, plane_index);
537 for(y2=
FFMAX(y, 0); y2<
FFMIN(
h, y+block_h); y2++){
538 for(x2=
FFMAX(x, 0); x2<
FFMIN(
w, x+block_w); x2++){
539 int index= x2-(block_w*mb_x - block_w/2) + (y2-(block_h*mb_y - block_h/2))*obmc_stride;
540 int obmc_v= obmc[
index];
542 if(y<0) obmc_v += obmc[
index + block_h*obmc_stride];
543 if(x<0) obmc_v += obmc[
index + block_w];
544 if(y+block_h>
h) obmc_v += obmc[
index - block_h*obmc_stride];
545 if(x+block_w>
w) obmc_v += obmc[
index - block_w];
551 aa += obmc_v * obmc_v;
561 const int b_stride =
s->b_width <<
s->block_max_depth;
562 const int b_height =
s->b_height<<
s->block_max_depth;
563 int index= x + y*b_stride;
573 if(x<0 || x>=b_stride || y>=b_height)
599 Plane *p= &
s->plane[plane_index];
600 const int block_size =
MB_SIZE >>
s->block_max_depth;
601 const int block_w = plane_index ? block_size>>
s->chroma_h_shift : block_size;
602 const int block_h = plane_index ? block_size>>
s->chroma_v_shift : block_size;
603 const int obmc_stride= plane_index ? (2*block_size)>>
s->chroma_h_shift : 2*block_size;
604 const int ref_stride=
s->current_picture->linesize[plane_index];
605 uint8_t *dst=
s->current_picture->data[plane_index];
606 uint8_t *
src=
s-> input_picture->data[plane_index];
608 uint8_t *cur =
s->scratchbuf;
609 uint8_t *
tmp =
s->emu_edge_buffer;
610 const int b_stride =
s->b_width <<
s->block_max_depth;
611 const int b_height =
s->b_height<<
s->block_max_depth;
617 int sx= block_w*mb_x - block_w/2;
618 int sy= block_h*mb_y - block_h/2;
619 int x0=
FFMAX(0,-sx);
620 int y0=
FFMAX(0,-sy);
621 int x1=
FFMIN(block_w*2,
w-sx);
622 int y1=
FFMIN(block_h*2,
h-sy);
627 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);
629 for(y=y0; y<y1; y++){
630 const uint8_t *obmc1= obmc_edged[y];
632 uint8_t *cur1 = cur + y*ref_stride;
633 uint8_t *dst1 = dst + sx + (sy+y)*ref_stride;
634 for(x=x0; x<x1; x++){
635 #if FRAC_BITS >= LOG2_OBMC_MAX
641 if(v&(~255)) v= ~(v>>31);
648 && (mb_x == 0 || mb_x == b_stride-1)
649 && (mb_y == 0 || mb_y == b_height-1)){
659 memcpy(dst + sx+x0 + (sy+y)*ref_stride, cur + x0 + y*ref_stride, x1-x0);
670 distortion =
ff_w97_32_c(&
s->m,
src + sx + sy*ref_stride, dst + sx + sy*ref_stride, ref_stride, 32);
672 distortion =
ff_w53_32_c(&
s->m,
src + sx + sy*ref_stride, dst + sx + sy*ref_stride, ref_stride, 32);
676 int off = sx+16*(
i&1) + (sy+16*(
i>>1))*ref_stride;
677 distortion +=
s->mecc.me_cmp[0](&
s->m,
src + off, dst + off, ref_stride, 16);
682 distortion =
s->mecc.me_cmp[0](&
s->m,
src + sx + sy*ref_stride, dst + sx + sy*ref_stride, ref_stride, block_w*2);
693 if(mb_x == b_stride-2)
696 return distortion + rate*penalty_factor;
701 Plane *p= &
s->plane[plane_index];
702 const int block_size =
MB_SIZE >>
s->block_max_depth;
703 const int block_w = plane_index ? block_size>>
s->chroma_h_shift : block_size;
704 const int block_h = plane_index ? block_size>>
s->chroma_v_shift : block_size;
706 const int obmc_stride= plane_index ? (2*block_size)>>
s->chroma_h_shift : 2*block_size;
707 const int ref_stride=
s->current_picture->linesize[plane_index];
708 uint8_t *dst=
s->current_picture->data[plane_index];
709 uint8_t *
src=
s-> input_picture->data[plane_index];
713 const int b_stride =
s->b_width <<
s->block_max_depth;
723 int mb_x2= mb_x + (
i%3) - 1;
724 int mb_y2= mb_y + (
i/3) - 1;
725 int x= block_w*mb_x2 + block_w/2;
726 int y= block_h*mb_y2 + block_h/2;
729 x, y, block_w, block_h,
w,
h, 0, ref_stride, obmc_stride, mb_x2, mb_y2, 1, 1, plane_index);
732 for(y2= y; y2<0; y2++)
733 memcpy(dst + x + y2*ref_stride,
src + x + y2*ref_stride, block_w);
734 for(y2=
h; y2<y+block_h; y2++)
735 memcpy(dst + x + y2*ref_stride,
src + x + y2*ref_stride, block_w);
737 for(y2= y; y2<y+block_h; y2++)
738 memcpy(dst + x + y2*ref_stride,
src + x + y2*ref_stride, -x);
741 for(y2= y; y2<y+block_h; y2++)
742 memcpy(dst +
w + y2*ref_stride,
src +
w + y2*ref_stride, x+block_w -
w);
746 distortion +=
s->mecc.me_cmp[block_w==8](&
s->m,
src + x + y*ref_stride, dst + x + y*ref_stride, ref_stride, block_h);
760 for(
i=merged?4:0;
i<9;
i++){
761 static const int dxy[9][2] = {{0,0},{1,0},{0,1},{1,1},{2,0},{2,1},{-1,2},{0,2},{1,2}};
765 return distortion + rate*penalty_factor;
769 const int w=
b->width;
770 const int h=
b->height;
775 int *runs =
s->run_buffer;
782 int l=0, lt=0, t=0, rt=0;
804 if(px<b->parent->width && py<b->parent->height)
805 p= parent[px + py*2*
stride];
809 runs[run_index++]=
run;
817 max_index= run_index;
818 runs[run_index++]=
run;
820 run= runs[run_index++];
823 if(run_index <= max_index)
827 if(
s->c.bytestream_end -
s->c.bytestream <
w*40){
833 int l=0, lt=0, t=0, rt=0;
855 if(px<b->parent->width && py<b->parent->height)
856 p= parent[px + py*2*
stride];
864 run= runs[run_index++];
866 if(run_index <= max_index)
876 int l2= 2*
FFABS(l) + (l<0);
896 const int b_stride=
s->b_width <<
s->block_max_depth;
906 block->color[0] = p[0];
907 block->color[1] = p[1];
908 block->color[2] = p[2];
912 value=
s->me_cache_generation + (p[0]>>10) + (p[1]<<6) + (
block->ref<<12);
922 rd=
get_block_rd(
s, mb_x, mb_y, 0, obmc_edged) +
s->intra_penalty * !!intra;
938 return check_block(
s, mb_x, mb_y, p, 0, obmc_edged, best_rd);
942 const int b_stride=
s->b_width <<
s->block_max_depth;
951 backup[0] =
block[0];
952 backup[1] =
block[1];
953 backup[2] =
block[b_stride];
954 backup[3] =
block[b_stride + 1];
961 value=
s->me_cache_generation + (p0>>10) + (p1<<6) + (
block->ref<<12);
981 block[b_stride]= backup[2];
982 block[b_stride+1]= backup[3];
988 int pass, mb_x, mb_y;
989 const int b_width =
s->b_width <<
s->block_max_depth;
990 const int b_height=
s->b_height <<
s->block_max_depth;
991 const int b_stride= b_width;
996 uint8_t
state[
sizeof(
s->block_state)];
997 memcpy(
state,
s->block_state,
sizeof(
s->block_state));
998 for(mb_y= 0; mb_y<
s->b_height; mb_y++)
999 for(mb_x= 0; mb_x<
s->b_width; mb_x++)
1002 memcpy(
s->block_state,
state,
sizeof(
s->block_state));
1008 for(mb_y= 0; mb_y<b_height; mb_y++){
1009 for(mb_x= 0; mb_x<b_width; mb_x++){
1010 int dia_change,
i, j,
ref;
1011 int best_rd= INT_MAX, ref_rd;
1013 const int index= mb_x + mb_y * b_stride;
1023 const int b_w= (
MB_SIZE >>
s->block_max_depth);
1032 if(!
s->me_cache_generation)
1033 memset(
s->me_cache, 0,
sizeof(
s->me_cache));
1034 s->me_cache_generation += 1<<22;
1039 for (y = 0; y < b_w * 2; y++)
1040 memcpy(obmc_edged[y],
ff_obmc_tab[
s->block_max_depth] + y * b_w * 2, b_w * 2);
1042 for(y=0; y<b_w*2; y++)
1043 memset(obmc_edged[y], obmc_edged[y][0] + obmc_edged[y][b_w-1], b_w);
1044 if(mb_x==b_stride-1)
1045 for(y=0; y<b_w*2; y++)
1046 memset(obmc_edged[y]+b_w, obmc_edged[y][b_w] + obmc_edged[y][b_w*2-1], b_w);
1048 for(x=0; x<b_w*2; x++)
1049 obmc_edged[0][x] += obmc_edged[b_w-1][x];
1050 for(y=1; y<b_w; y++)
1051 memcpy(obmc_edged[y], obmc_edged[0], b_w*2);
1053 if(mb_y==b_height-1){
1054 for(x=0; x<b_w*2; x++)
1055 obmc_edged[b_w*2-1][x] += obmc_edged[b_w][x];
1056 for(y=b_w; y<b_w*2-1; y++)
1057 memcpy(obmc_edged[y], obmc_edged[b_w*2-1], b_w*2);
1062 if(mb_x==0 || mb_y==0 || mb_x==b_width-1 || mb_y==b_height-1){
1063 uint8_t *
src=
s-> input_picture->data[0];
1064 uint8_t *dst=
s->current_picture->data[0];
1065 const int stride=
s->current_picture->linesize[0];
1066 const int block_w=
MB_SIZE >>
s->block_max_depth;
1067 const int block_h=
MB_SIZE >>
s->block_max_depth;
1068 const int sx= block_w*mb_x - block_w/2;
1069 const int sy= block_h*mb_y - block_h/2;
1070 const int w=
s->plane[0].width;
1071 const int h=
s->plane[0].height;
1076 for(y=
h; y<sy+block_h*2; y++)
1079 for(y=sy; y<sy+block_h*2; y++)
1082 if(sx+block_w*2 >
w){
1083 for(y=sy; y<sy+block_h*2; y++)
1089 for(
i=0;
i <
s->nb_planes;
i++)
1095 check_block(
s, mb_x, mb_y, color0, 1, obmc_edged, &best_rd);
1102 int16_t (*mvr)[2]= &
s->ref_mvs[
ref][
index];
1111 check_block_inter(
s, mb_x, mb_y, mvr[-b_stride][0], mvr[-b_stride][1], obmc_edged, &best_rd);
1117 check_block_inter(
s, mb_x, mb_y, mvr[b_stride][0], mvr[b_stride][1], obmc_edged, &best_rd);
1122 int newx =
block->mx;
1123 int newy =
block->my;
1124 int dia_size =
s->iterative_dia_size ?
s->iterative_dia_size :
FFMAX(
s->avctx->dia_size, 1);
1126 for(
i=0;
i < dia_size;
i++){
1128 dia_change |=
check_block_inter(
s, mb_x, mb_y, newx+4*(
i-j), newy+(4*j), obmc_edged, &best_rd);
1129 dia_change |=
check_block_inter(
s, mb_x, mb_y, newx-4*(
i-j), newy-(4*j), obmc_edged, &best_rd);
1130 dia_change |=
check_block_inter(
s, mb_x, mb_y, newx-(4*j), newy+4*(
i-j), obmc_edged, &best_rd);
1131 dia_change |=
check_block_inter(
s, mb_x, mb_y, newx+(4*j), newy-4*(
i-j), obmc_edged, &best_rd);
1137 static const int square[8][2]= {{+1, 0},{-1, 0},{ 0,+1},{ 0,-1},{+1,+1},{-1,-1},{+1,-1},{-1,+1},};
1144 mvr[0][0]=
block->mx;
1145 mvr[0][1]=
block->my;
1146 if(ref_rd > best_rd){
1173 if(
s->block_max_depth == 1){
1175 for(mb_y= 0; mb_y<b_height; mb_y+=2){
1176 for(mb_x= 0; mb_x<b_width; mb_x+=2){
1178 int best_rd, init_rd;
1179 const int index= mb_x + mb_y * b_stride;
1184 b[2]=
b[0]+b_stride;
1191 if(!
s->me_cache_generation)
1192 memset(
s->me_cache, 0,
sizeof(
s->me_cache));
1193 s->me_cache_generation += 1<<22;
1199 (
b[0]->mx +
b[1]->mx +
b[2]->mx +
b[3]->mx + 2) >> 2,
1200 (
b[0]->my +
b[1]->my +
b[2]->my +
b[3]->my + 2) >> 2, 0, &best_rd);
1206 if(init_rd != best_rd)
1237 const int w=
b->width;
1238 const int h=
b->height;
1241 int x,y, thres1, thres2;
1250 bias= bias ? 0 : (3*qmul)>>3;
1259 if((
unsigned)(
i+thres1) > thres2){
1279 if((
unsigned)(
i+thres1) > thres2){
1282 i= (
i + bias) / qmul;
1287 i= (
i + bias) / qmul;
1298 const int w=
b->width;
1299 const int h=
b->height;
1320 const int w=
b->width;
1321 const int h=
b->height;
1324 for(y=
h-1; y>=0; y--){
1325 for(x=
w-1; x>=0; x--){
1344 const int w=
b->width;
1345 const int h=
b->height;
1368 int plane_index,
level, orientation;
1370 for(plane_index=0; plane_index<
FFMIN(
s->nb_planes, 2); plane_index++){
1372 for(orientation=
level ? 1:0; orientation<4; orientation++){
1373 if(orientation==2)
continue;
1374 put_symbol(&
s->c,
s->header_state,
s->plane[plane_index].band[
level][orientation].qlog, 1);
1384 memset(kstate,
MID_STATE,
sizeof(kstate));
1387 if(
s->keyframe ||
s->always_reset){
1389 s->last_spatial_decomposition_type=
1393 s->last_block_max_depth= 0;
1394 for(plane_index=0; plane_index<2; plane_index++){
1395 Plane *p= &
s->plane[plane_index];
1403 put_rac(&
s->c,
s->header_state,
s->always_reset);
1404 put_symbol(&
s->c,
s->header_state,
s->temporal_decomposition_type, 0);
1405 put_symbol(&
s->c,
s->header_state,
s->temporal_decomposition_count, 0);
1406 put_symbol(&
s->c,
s->header_state,
s->spatial_decomposition_count, 0);
1408 if (
s->nb_planes > 2) {
1412 put_rac(&
s->c,
s->header_state,
s->spatial_scalability);
1421 for(plane_index=0; plane_index<
FFMIN(
s->nb_planes, 2); plane_index++){
1422 Plane *p= &
s->plane[plane_index];
1427 put_rac(&
s->c,
s->header_state, update_mc);
1429 for(plane_index=0; plane_index<
FFMIN(
s->nb_planes, 2); plane_index++){
1430 Plane *p= &
s->plane[plane_index];
1437 if(
s->last_spatial_decomposition_count !=
s->spatial_decomposition_count){
1439 put_symbol(&
s->c,
s->header_state,
s->spatial_decomposition_count, 0);
1445 put_symbol(&
s->c,
s->header_state,
s->spatial_decomposition_type -
s->last_spatial_decomposition_type, 1);
1447 put_symbol(&
s->c,
s->header_state,
s->mv_scale -
s->last_mv_scale, 1);
1448 put_symbol(&
s->c,
s->header_state,
s->qbias -
s->last_qbias , 1);
1449 put_symbol(&
s->c,
s->header_state,
s->block_max_depth -
s->last_block_max_depth, 1);
1457 for(plane_index=0; plane_index<2; plane_index++){
1458 Plane *p= &
s->plane[plane_index];
1465 s->last_spatial_decomposition_type =
s->spatial_decomposition_type;
1466 s->last_qlog =
s->qlog;
1467 s->last_qbias =
s->qbias;
1468 s->last_mv_scale =
s->mv_scale;
1469 s->last_block_max_depth =
s->block_max_depth;
1470 s->last_spatial_decomposition_count =
s->spatial_decomposition_count;
1483 uint32_t coef_sum= 0;
1484 int level, orientation, delta_qlog;
1487 for(orientation=
level ? 1 : 0; orientation<4; orientation++){
1490 const int w=
b->width;
1491 const int h=
b->height;
1495 const int qdiv= (1<<16)/qmul;
1505 coef_sum+=
abs(buf[x+y*
stride]) * qdiv >> 16;
1511 coef_sum = (uint64_t)coef_sum * coef_sum >> 16;
1514 s->m.current_picture.mb_var_sum= coef_sum;
1515 s->m.current_picture.mc_mb_var_sum= 0;
1517 s->m.current_picture.mc_mb_var_sum= coef_sum;
1518 s->m.current_picture.mb_var_sum= 0;
1526 s->qlog+= delta_qlog;
1533 int level, orientation, x, y;
1536 for(orientation=
level ? 1 : 0; orientation<4; orientation++){
1541 memset(
s->spatial_idwt_buffer, 0,
sizeof(*
s->spatial_idwt_buffer)*
width*
height);
1542 ibuf[
b->width/2 +
b->height/2*
b->stride]= 256*16;
1545 for(x=0; x<
width; x++){
1546 int64_t
d=
s->spatial_idwt_buffer[x + y*
width]*16;
1557 const AVFrame *pict,
int *got_packet)
1562 const int width=
s->avctx->width;
1563 const int height=
s->avctx->height;
1564 int level, orientation, plane_index,
i, y,
ret;
1565 uint8_t rc_header_bak[
sizeof(
s->header_state)];
1566 uint8_t rc_block_bak[
sizeof(
s->block_state)];
1574 for(
i=0;
i <
s->nb_planes;
i++){
1575 int hshift=
i ?
s->chroma_h_shift : 0;
1576 int vshift=
i ?
s->chroma_v_shift : 0;
1578 memcpy(&
s->input_picture->data[
i][y *
s->input_picture->linesize[
i]],
1581 s->mpvencdsp.draw_edges(
s->input_picture->data[
i],
s->input_picture->linesize[
i],
1588 pic =
s->input_picture;
1617 if (
s->current_picture->data[0]) {
1618 int w =
s->avctx->width;
1619 int h =
s->avctx->height;
1621 s->mpvencdsp.draw_edges(
s->current_picture->data[0],
1622 s->current_picture->linesize[0],
w ,
h ,
1624 if (
s->current_picture->data[2]) {
1625 s->mpvencdsp.draw_edges(
s->current_picture->data[1],
1626 s->current_picture->linesize[1],
w>>
s->chroma_h_shift,
h>>
s->chroma_v_shift,
1628 s->mpvencdsp.draw_edges(
s->current_picture->data[2],
1629 s->current_picture->linesize[2],
w>>
s->chroma_h_shift,
h>>
s->chroma_v_shift,
1637 s->m.current_picture_ptr= &
s->m.current_picture;
1638 s->m.current_picture.f =
s->current_picture;
1639 s->m.current_picture.f->pts = pict->
pts;
1641 int block_width = (
width +15)>>4;
1642 int block_height= (
height+15)>>4;
1643 int stride=
s->current_picture->linesize[0];
1648 s->m.avctx=
s->avctx;
1650 s->m. new_picture =
s->input_picture;
1653 s->m.uvlinesize=
s->current_picture->linesize[1];
1656 s->m.mb_width = block_width;
1657 s->m.mb_height= block_height;
1658 s->m.mb_stride=
s->m.mb_width+1;
1659 s->m.b8_stride= 2*
s->m.mb_width+1;
1662 s->m.motion_est=
s->motion_est;
1663 s->m.me.scene_change_score=0;
1667 s->m.unrestricted_mv= 1;
1669 s->m.lambda =
s->lambda;
1675 s->m.hdsp =
s->hdsp;
1677 s->hdsp =
s->m.hdsp;
1682 memcpy(rc_header_bak,
s->header_state,
sizeof(
s->header_state));
1683 memcpy(rc_block_bak,
s->block_state,
sizeof(
s->block_state));
1688 s->spatial_decomposition_count= 5;
1690 while( !(
width >>(
s->chroma_h_shift +
s->spatial_decomposition_count))
1691 || !(
height>>(
s->chroma_v_shift +
s->spatial_decomposition_count)))
1692 s->spatial_decomposition_count--;
1694 if (
s->spatial_decomposition_count <= 0) {
1704 if(
s->last_spatial_decomposition_count !=
s->spatial_decomposition_count){
1705 for(plane_index=0; plane_index <
s->nb_planes; plane_index++){
1711 s->m.misc_bits = 8*(
s->c.bytestream -
s->c.bytestream_start);
1713 s->m.mv_bits = 8*(
s->c.bytestream -
s->c.bytestream_start) -
s->m.misc_bits;
1715 for(plane_index=0; plane_index < s->nb_planes; plane_index++){
1716 Plane *p= &
s->plane[plane_index];
1722 if (!
s->memc_only) {
1724 if(pict->
data[plane_index])
1735 &&
s->m.me.scene_change_score >
s->scenechange_threshold){
1740 s->current_picture->key_frame=1;
1758 ff_spatial_dwt(
s->spatial_dwt_buffer,
s->temp_dwt_buffer,
w,
h,
w,
s->spatial_decomposition_type,
s->spatial_decomposition_count);
1760 if(
s->pass1_rc && plane_index==0){
1762 if (delta_qlog <= INT_MIN)
1767 memcpy(
s->header_state, rc_header_bak,
sizeof(
s->header_state));
1768 memcpy(
s->block_state, rc_block_bak,
sizeof(
s->block_state));
1775 for(orientation=
level ? 1 : 0; orientation<4; orientation++){
1781 if (!
s->no_bitstream)
1790 for(orientation=
level ? 1 : 0; orientation<4; orientation++){
1797 ff_spatial_idwt(
s->spatial_idwt_buffer,
s->temp_idwt_buffer,
w,
h,
w,
s->spatial_decomposition_type,
s->spatial_decomposition_count);
1811 s->current_picture->data[plane_index][y*
s->current_picture->linesize[plane_index] + x]=
1812 pict->
data[plane_index][y*pict->
linesize[plane_index] + x];
1816 memset(
s->spatial_idwt_buffer, 0,
sizeof(
IDWTELEM)*
w*
h);
1823 if(pict->
data[plane_index])
1826 int d=
s->current_picture->data[plane_index][y*
s->current_picture->linesize[plane_index] + x] - pict->
data[plane_index][y*pict->
linesize[plane_index] + x];
1830 s->avctx->error[plane_index] +=
error;
1831 s->encoding_error[plane_index] =
error;
1841 s->current_picture->coded_picture_number = avctx->
frame_number;
1842 s->current_picture->pict_type = pic->
pict_type;
1843 s->current_picture->quality = pic->
quality;
1844 s->m.frame_bits = 8*(
s->c.bytestream -
s->c.bytestream_start);
1845 s->m.p_tex_bits =
s->m.frame_bits -
s->m.misc_bits -
s->m.mv_bits;
1846 s->m.current_picture.f->display_picture_number =
1847 s->m.current_picture.f->coded_picture_number = avctx->
frame_number;
1848 s->m.current_picture.f->quality = pic->
quality;
1849 s->m.total_bits += 8*(
s->c.bytestream -
s->c.bytestream_start);
1855 s->m.last_pict_type =
s->m.pict_type;
1862 s->current_picture->pict_type);
1865 if (
s->current_picture->key_frame)
1884 #define OFFSET(x) offsetof(SnowContext, x)
1885 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
1892 {
"memc_only",
"Only do ME/MC (I frames -> ref, P frame -> ME+MC).",
OFFSET(memc_only),
AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1,
VE },
1893 {
"no_bitstream",
"Skip final bitstream writeout.",
OFFSET(no_bitstream),
AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1,
VE },
1894 {
"intra_penalty",
"Penalty for intra blocks in block decission",
OFFSET(intra_penalty),
AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX,
VE },
1895 {
"iterative_dia_size",
"Dia size for the iterative ME",
OFFSET(iterative_dia_size),
AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX,
VE },
1896 {
"sc_threshold",
"Scene change threshold",
OFFSET(scenechange_threshold),
AV_OPT_TYPE_INT, { .i64 = 0 }, INT_MIN, INT_MAX,
VE },
1900 {
"rc_eq",
"Set rate control equation. When computing the expression, besides the standard functions "
1901 "defined in the section 'Expression Evaluation', the following functions are available: "
1902 "bits2qp(bits), qp2bits(qp). Also the following constants are available: iTex pTex tex mv "
1903 "fCode iCount mcVar var isI isP isB avgQP qComp avgIITex avgPITex avgPPTex avgBPTex avgTex.",