61 for(plane_index=0; plane_index<3; plane_index++){
158 for (i = 0; i <
h; i++) {
159 for (j = 0; j < w; j++) {
163 pix += line_size - w;
175 for (i = 0; i < w; i++) {
176 for (j = 0; j < w; j ++) {
180 pix += line_size - w;
191 return (3*lambda)>>(FF_LAMBDA_SHIFT+1);
212 #define P_TOPRIGHT P[3]
213 #define P_MEDIAN P[4]
215 #define FLAG_QPEL 1 //must be 1
225 int score, score2, iscore, i_len, p_len, block_s, sum, base_bits;
229 const int index= (x + y*w) << rem_depth;
231 int trx= (x+1)<<rem_depth;
232 int try= (y+1)<<rem_depth;
238 const BlockNode *tr = y && trx<w && ((x&1)==0 || level==0) ? &s->
block[index-w+(1<<rem_depth)] : tl;
239 int pl = left->
color[0];
240 int pcb= left->
color[1];
241 int pcr= left->
color[2];
251 int16_t last_mv[3][2];
253 const int shift= 1+qpel;
259 int ref, best_ref, ref_score, ref_mx, ref_my;
263 set_blocks(s, level, x, y, pl, pcb, pcr, 0, 0, 0,
BLOCK_INTRA);
278 last_mv[1][0]= right->
mx;
279 last_mv[1][1]= right->
my;
280 last_mv[2][0]= bottom->
mx;
281 last_mv[2][1]= bottom->
my;
296 c->
xmin = - x*block_w - 16+3;
297 c->
ymin = - y*block_w - 16+3;
341 if(score > ref_score){
354 pc.bytestream= p_buffer;
358 put_rac(&pc, &p_state[4 + s_context], 1);
361 put_symbol(&pc, &p_state[128 + 1024 + 32*ref_context], best_ref, 0);
362 pred_mv(s, &pmx, &pmy, best_ref, left, top, tr);
363 put_symbol(&pc, &p_state[128 + 32*(mx_context + 16*!!best_ref)], mx - pmx, 1);
364 put_symbol(&pc, &p_state[128 + 32*(my_context + 16*!!best_ref)], my - pmy, 1);
365 p_len= pc.bytestream - pc.bytestream_start;
368 block_s= block_w*block_w;
369 sum =
pix_sum(current_data[0], stride, block_w, block_w);
370 l= (sum + block_s/2)/block_s;
371 iscore =
pix_norm1(current_data[0], stride, block_w) - 2*l*sum + l*l*block_s;
376 cb= (sum + block_s/2)/block_s;
379 cr= (sum + block_s/2)/block_s;
386 ic.bytestream= i_buffer;
389 put_rac(&ic, &i_state[4 + s_context], 1);
396 i_len= ic.bytestream - ic.bytestream_start;
399 av_assert1(iscore < 255*255*256 + s->lambda2*10);
405 int varc= iscore >> 8;
406 int vard= score >> 8;
407 if (vard <= 64 || vard < varc)
421 if(score2 < score && score2 < iscore)
426 pred_mv(s, &pmx, &pmy, 0, left, top, tr);
427 memcpy(pbbak, i_buffer, i_len);
431 set_blocks(s, level, x, y, l, cb, cr, pmx, pmy, 0,
BLOCK_INTRA);
435 memcpy(pbbak, p_buffer, p_len);
439 set_blocks(s, level, x, y, pl, pcb, pcr, mx, my, best_ref, 0);
448 const int index= (x + y*w) << rem_depth;
449 int trx= (x+1)<<rem_depth;
454 const BlockNode *tr = y && trx<w && ((x&1)==0 || level==0) ? &s->
block[index-w+(1<<rem_depth)] : tl;
455 int pl = left->
color[0];
456 int pcb= left->
color[1];
457 int pcr= left->
color[2];
465 set_blocks(s, level, x, y, pl, pcb, pcr, 0, 0, 0,
BLOCK_INTRA);
482 pred_mv(s, &pmx, &pmy, 0, left, top, tr);
489 set_blocks(s, level, x, y, b->
color[0], b->
color[1], b->
color[2], pmx, pmy, 0,
BLOCK_INTRA);
491 pred_mv(s, &pmx, &pmy, b->
ref, left, top, tr);
497 set_blocks(s, level, x, y, pl, pcb, pcr, b->
mx, b->
my, b->
ref, 0);
505 const int block_w = plane_index ? block_size>>s->
chroma_h_shift : block_size;
506 const int block_h = plane_index ? block_size>>s->
chroma_v_shift : block_size;
508 const int obmc_stride= plane_index ? (2*block_size)>>s->
chroma_h_shift : 2*block_size;
510 uint8_t *
src= s-> input_picture->data[plane_index];
513 const int w= p->
width;
515 int index= mb_x + mb_y*b_stride;
524 b->
color[plane_index]= 0;
525 memset(dst, 0, obmc_stride*obmc_stride*
sizeof(
IDWTELEM));
528 int mb_x2= mb_x + (i &1) - 1;
529 int mb_y2= mb_y + (i>>1) - 1;
530 int x= block_w*mb_x2 + block_w/2;
531 int y= block_h*mb_y2 + block_h/2;
534 x, y, block_w, block_h, w, h, obmc_stride, ref_stride, obmc_stride, mb_x2, mb_y2, 0, 0, plane_index);
536 for(y2=
FFMAX(y, 0); y2<
FFMIN(h, y+block_h); y2++){
537 for(x2=
FFMAX(x, 0); x2<
FFMIN(w, x+block_w); x2++){
538 int index= x2-(block_w*mb_x - block_w/2) + (y2-(block_h*mb_y - block_h/2))*obmc_stride;
539 int obmc_v= obmc[
index];
541 if(y<0) obmc_v += obmc[index + block_h*obmc_stride];
542 if(x<0) obmc_v += obmc[index + block_w];
543 if(y+block_h>h) obmc_v += obmc[index - block_h*obmc_stride];
544 if(x+block_w>w) obmc_v += obmc[index - block_w];
549 ab += (
src[x2 + y2*ref_stride] - (d>>
FRAC_BITS)) * obmc_v;
550 aa += obmc_v * obmc_v;
562 int index= x + y*b_stride;
566 const BlockNode *tl = y && x ? &s->
block[index-b_stride-1] : left;
567 const BlockNode *tr = y && x+w<b_stride ? &s->
block[index-b_stride+w] : tl;
572 if(x<0 || x>=b_stride || y>=b_height)
588 pred_mv(s, &dmx, &dmy, b->
ref, left, top, tr);
600 const int block_w = plane_index ? block_size>>s->
chroma_h_shift : block_size;
601 const int block_h = plane_index ? block_size>>s->
chroma_v_shift : block_size;
602 const int obmc_stride= plane_index ? (2*block_size)>>s->
chroma_h_shift : 2*block_size;
605 uint8_t *
src= s-> input_picture->data[plane_index];
611 const int w= p->
width;
616 int sx= block_w*mb_x - block_w/2;
617 int sy= block_h*mb_y - block_h/2;
618 int x0=
FFMAX(0,-sx);
619 int y0=
FFMAX(0,-sy);
620 int x1=
FFMIN(block_w*2, w-sx);
621 int y1=
FFMIN(block_h*2, h-sy);
626 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);
628 for(y=y0; y<y1; y++){
629 const uint8_t *obmc1= obmc_edged[
y];
631 uint8_t *cur1 = cur + y*ref_stride;
632 uint8_t *dst1 = dst + sx + (sy+
y)*ref_stride;
633 for(x=x0; x<x1; x++){
634 #if FRAC_BITS >= LOG2_OBMC_MAX
640 if(v&(~255)) v= ~(v>>31);
647 && (mb_x == 0 || mb_x == b_stride-1)
648 && (mb_y == 0 || mb_y == b_height-1)){
658 memcpy(dst + sx+x0 + (sy+y)*ref_stride, cur + x0 + y*ref_stride, x1-x0);
669 distortion =
ff_w97_32_c(&s->
m,
src + sx + sy*ref_stride, dst + sx + sy*ref_stride, ref_stride, 32);
671 distortion =
ff_w53_32_c(&s->
m,
src + sx + sy*ref_stride, dst + sx + sy*ref_stride, ref_stride, 32);
675 int off = sx+16*(i&1) + (sy+16*(i>>1))*ref_stride;
676 distortion += s->
mecc.
me_cmp[0](&s->
m,
src + off, dst + off, ref_stride, 16);
681 distortion = s->
mecc.
me_cmp[0](&s->
m,
src + sx + sy*ref_stride, dst + sx + sy*ref_stride, ref_stride, block_w*2);
690 rate +=
get_block_bits(s, mb_x + (i&1) - (i>>1), mb_y + (i>>1), 1);
692 if(mb_x == b_stride-2)
695 return distortion + rate*penalty_factor;
702 const int block_w = plane_index ? block_size>>s->
chroma_h_shift : block_size;
703 const int block_h = plane_index ? block_size>>s->
chroma_v_shift : block_size;
705 const int obmc_stride= plane_index ? (2*block_size)>>s->
chroma_h_shift : 2*block_size;
708 uint8_t *
src= s-> input_picture->data[plane_index];
713 const int w= p->
width;
722 int mb_x2= mb_x + (i%3) - 1;
723 int mb_y2= mb_y + (i/3) - 1;
724 int x= block_w*mb_x2 + block_w/2;
725 int y= block_h*mb_y2 + block_h/2;
728 x, y, block_w, block_h, w, h, 0, ref_stride, obmc_stride, mb_x2, mb_y2, 1, 1, plane_index);
731 for(y2= y; y2<0; y2++)
732 memcpy(dst + x + y2*ref_stride,
src + x + y2*ref_stride, block_w);
733 for(y2= h; y2<y+block_h; y2++)
734 memcpy(dst + x + y2*ref_stride,
src + x + y2*ref_stride, block_w);
736 for(y2= y; y2<y+block_h; y2++)
737 memcpy(dst + x + y2*ref_stride,
src + x + y2*ref_stride, -x);
740 for(y2= y; y2<y+block_h; y2++)
741 memcpy(dst + w + y2*ref_stride,
src + w + y2*ref_stride, x+block_w - w);
745 distortion += s->
mecc.
me_cmp[block_w==8](&s->
m,
src + x + y*ref_stride, dst + x + y*ref_stride, ref_stride, block_h);
759 for(i=merged?4:0; i<9; i++){
760 static const int dxy[9][2] = {{0,0},{1,0},{0,1},{1,1},{2,0},{2,1},{-1,2},{0,2},{1,2}};
764 return distortion + rate*penalty_factor;
768 const int w= b->
width;
781 int l=0, lt=0, t=0, rt=0;
785 t= src[x + (y-1)*stride];
787 lt= src[x - 1 + (y-1)*stride];
790 rt= src[x + 1 + (y-1)*stride];
803 if(px<b->parent->width && py<b->parent->height)
804 p= parent[px + py*2*
stride];
808 runs[run_index++]=
run;
816 max_index= run_index;
817 runs[run_index++]=
run;
819 run= runs[run_index++];
822 if(run_index <= max_index)
832 int l=0, lt=0, t=0, rt=0;
836 t= src[x + (y-1)*stride];
838 lt= src[x - 1 + (y-1)*stride];
841 rt= src[x + 1 + (y-1)*stride];
854 if(px<b->parent->width && py<b->parent->height)
855 p= parent[px + py*2*
stride];
863 run= runs[run_index++];
865 if(run_index <= max_index)
875 int l2= 2*
FFABS(l) + (l<0);
905 block->
color[0] = p[0];
906 block->
color[1] = p[1];
907 block->
color[2] = p[2];
937 return check_block(s, mb_x, mb_y, p, 0, obmc_edged, best_rd);
950 backup[0] = block[0];
951 backup[1] = block[1];
952 backup[2] = block[b_stride];
953 backup[3] = block[b_stride + 1];
969 block[1]= block[b_stride]= block[b_stride+1]= *
block;
980 block[b_stride]= backup[2];
981 block[b_stride+1]= backup[3];
987 int pass, mb_x, mb_y;
990 const int b_stride= b_width;
997 for(mb_y= 0; mb_y<s->
b_height; mb_y++)
998 for(mb_x= 0; mb_x<s->
b_width; mb_x++)
1004 for(pass=0; pass<25; pass++){
1007 for(mb_y= 0; mb_y<b_height; mb_y++){
1008 for(mb_x= 0; mb_x<b_width; mb_x++){
1009 int dia_change, i, j, ref;
1010 int best_rd= INT_MAX, ref_rd;
1012 const int index= mb_x + mb_y * b_stride;
1021 BlockNode *brb= mb_x+1<b_width && mb_y+1<b_height ? &s->
block[index+b_stride+1] :
NULL;
1038 for (y = 0; y < b_w * 2; y++)
1041 for(y=0; y<b_w*2; y++)
1042 memset(obmc_edged[y], obmc_edged[y][0] + obmc_edged[y][b_w-1], b_w);
1043 if(mb_x==b_stride-1)
1044 for(y=0; y<b_w*2; y++)
1045 memset(obmc_edged[y]+b_w, obmc_edged[y][b_w] + obmc_edged[y][b_w*2-1], b_w);
1047 for(x=0; x<b_w*2; x++)
1048 obmc_edged[0][x] += obmc_edged[b_w-1][x];
1049 for(y=1; y<b_w; y++)
1050 memcpy(obmc_edged[y], obmc_edged[0], b_w*2);
1052 if(mb_y==b_height-1){
1053 for(x=0; x<b_w*2; x++)
1054 obmc_edged[b_w*2-1][x] += obmc_edged[b_w][x];
1055 for(y=b_w; y<b_w*2-1; y++)
1056 memcpy(obmc_edged[y], obmc_edged[b_w*2-1], b_w*2);
1061 if(mb_x==0 || mb_y==0 || mb_x==b_width-1 || mb_y==b_height-1){
1067 const int sx= block_w*mb_x - block_w/2;
1068 const int sy= block_h*mb_y - block_h/2;
1074 memcpy(dst + sx + y*stride, src + sx + y*stride, block_w*2);
1075 for(y=h; y<sy+block_h*2; y++)
1076 memcpy(dst + sx + y*stride, src + sx + y*stride, block_w*2);
1078 for(y=sy; y<sy+block_h*2; y++)
1079 memcpy(dst + sx + y*stride, src + sx + y*stride, -sx);
1081 if(sx+block_w*2 > w){
1082 for(y=sy; y<sy+block_h*2; y++)
1083 memcpy(dst + w + y*stride, src + w + y*stride, sx+block_w*2 - w);
1089 color[i]=
get_dc(s, mb_x, mb_y, i);
1094 check_block(s, mb_x, mb_y, color0, 1, obmc_edged, &best_rd);
1110 check_block_inter(s, mb_x, mb_y, mvr[-b_stride][0], mvr[-b_stride][1], obmc_edged, &best_rd);
1116 check_block_inter(s, mb_x, mb_y, mvr[b_stride][0], mvr[b_stride][1], obmc_edged, &best_rd);
1121 int newx = block->
mx;
1122 int newy = block->
my;
1125 for(i=0; i < dia_size; i++){
1127 dia_change |=
check_block_inter(s, mb_x, mb_y, newx+4*(i-j), newy+(4*j), obmc_edged, &best_rd);
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*j), newy+4*(i-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);
1136 static const int square[8][2]= {{+1, 0},{-1, 0},{ 0,+1},{ 0,-1},{+1,+1},{-1,-1},{+1,-1},{-1,+1},};
1139 dia_change |=
check_block_inter(s, mb_x, mb_y, block->
mx+square[i][0], block->
my+square[i][1], obmc_edged, &best_rd);
1143 mvr[0][0]= block->
mx;
1144 mvr[0][1]= block->
my;
1145 if(ref_rd > best_rd){
1152 check_block(s, mb_x, mb_y, color, 1, obmc_edged, &best_rd);
1174 for(mb_y= 0; mb_y<b_height; mb_y+=2){
1175 for(mb_x= 0; mb_x<b_width; mb_x+=2){
1177 int best_rd, init_rd;
1178 const int index= mb_x + mb_y * b_stride;
1183 b[2]= b[0]+b_stride;
1198 (b[0]->mx + b[1]->mx + b[2]->mx + b[3]->mx + 2) >> 2,
1199 (b[0]->my + b[1]->my + b[2]->my + b[3]->my + 2) >> 2, 0, &best_rd);
1205 if(init_rd != best_rd)
1236 const int w= b->
width;
1240 int x,
y, thres1, thres2;
1245 dst[x + y*stride]= src[x + y*stride];
1249 bias= bias ? 0 : (3*qmul)>>3;
1256 int i= src[x + y*
stride];
1258 if((
unsigned)(i+thres1) > thres2){
1276 int i= src[x + y*
stride];
1278 if((
unsigned)(i+thres1) > thres2){
1281 i= (i + bias) / qmul;
1286 i= (i + bias) / qmul;
1297 const int w= b->
width;
1308 int i= src[x + y*
stride];
1319 const int w= b->
width;
1323 for(y=h-1; y>=0; y--){
1324 for(x=w-1; x>=0; x--){
1329 if(y && x+1<w) src[i] -=
mid_pred(src[i - 1], src[i - stride], src[i - stride + 1]);
1330 else src[i] -= src[i - 1];
1332 if(y) src[i] -=
mid_pred(src[i - 1], src[i - stride], src[i - 1] + src[i - stride] - src[i - 1 - stride]);
1333 else src[i] -= src[i - 1];
1336 if(y) src[i] -= src[i -
stride];
1343 const int w= b->
width;
1353 if(y && x+1<w) src[i] +=
mid_pred(src[i - 1], src[i - stride], src[i - stride + 1]);
1354 else src[i] += src[i - 1];
1356 if(y) src[i] +=
mid_pred(src[i - 1], src[i - stride], src[i - 1] + src[i - stride] - src[i - 1 - stride]);
1357 else src[i] += src[i - 1];
1360 if(y) src[i] += src[i -
stride];
1367 int plane_index,
level, orientation;
1369 for(plane_index=0; plane_index<
FFMIN(s->
nb_planes, 2); plane_index++){
1371 for(orientation=level ? 1:0; orientation<4; orientation++){
1372 if(orientation==2)
continue;
1383 memset(kstate,
MID_STATE,
sizeof(kstate));
1393 for(plane_index=0; plane_index<2; plane_index++){
1420 for(plane_index=0; plane_index<
FFMIN(s->
nb_planes, 2); plane_index++){
1428 for(plane_index=0; plane_index<
FFMIN(s->
nb_planes, 2); plane_index++){
1432 for(i= p->
htaps/2; i; i--)
1456 for(plane_index=0; plane_index<2; plane_index++){
1482 uint32_t coef_sum= 0;
1483 int level, orientation, delta_qlog;
1486 for(orientation=level ? 1 : 0; orientation<4; orientation++){
1489 const int w= b->
width;
1491 const int stride= b->
stride;
1494 const int qdiv= (1<<16)/qmul;
1499 buf[x+y*stride]= b->
buf[x+y*stride];
1504 coef_sum+= abs(buf[x+y*stride]) * qdiv >> 16;
1510 coef_sum = (uint64_t)coef_sum * coef_sum >> 16;
1525 s->
qlog+= delta_qlog;
1532 int level, orientation, x,
y;
1535 for(orientation=level ? 1 : 0; orientation<4; orientation++){
1544 for(x=0; x<
width; x++){
1550 b->
qlog= (int)(log(352256.0/sqrt(error)) / log(pow(2.0, 1.0/
QROOT))+0.5);
1556 const AVFrame *pict,
int *got_packet)
1563 int level, orientation, plane_index, i,
y, ret;
1579 FF_CEIL_RSHIFT(width, hshift));
1645 int block_width = (width +15)>>4;
1646 int block_height= (height+15)>>4;
1655 s->
m. last_picture_ptr= &s->
m. last_picture;
1666 #if FF_API_MOTION_EST
1712 for(plane_index=0; plane_index < s->
nb_planes; plane_index++){
1722 for(plane_index=0; plane_index < s->nb_planes; plane_index++){
1731 if(pict->
data[plane_index])
1769 if (delta_qlog <= INT_MIN)
1782 for(orientation=level ? 1 : 0; orientation<4; orientation++){
1797 for(orientation=level ? 1 : 0; orientation<4; orientation++){
1819 pict->
data[plane_index][y*pict->
linesize[plane_index] + x];
1830 if(pict->
data[plane_index])
1894 #define OFFSET(x) offsetof(SnowContext, x)
1895 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
1899 {
"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 },
1900 {
"no_bitstream",
"Skip final bitstream writeout.",
OFFSET(no_bitstream),
AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1,
VE },
1901 {
"intra_penalty",
"Penalty for intra blocks in block decission",
OFFSET(intra_penalty),
AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX,
VE },
1902 {
"iterative_dia_size",
"Dia size for the iterative ME",
OFFSET(iterative_dia_size),
AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX,
VE },
1955 fprintf(stderr,
"Failed to allocate memory\n");
1961 printf(
"testing 5/3 DWT\n");
1963 buffer[0][i] = buffer[1][i] =
av_lfg_get(&prng) % 54321 - 12345;
1969 if(buffer[0][i]!= buffer[1][i]) printf(
"fsck: %6d %12d %7d\n",i, buffer[0][i], buffer[1][i]);
1971 printf(
"testing 9/7 DWT\n");
1974 buffer[0][i] = buffer[1][i] =
av_lfg_get(&prng) % 54321 - 12345;
1980 if(
FFABS(buffer[0][i] - buffer[1][i])>20) printf(
"fsck: %6d %12d %7d\n",i, buffer[0][i], buffer[1][i]);
1983 int level, orientation, x,
y;
1984 int64_t errors[8][4];
1987 memset(errors, 0,
sizeof(errors));
1991 for(orientation=level ? 1 : 0; orientation<4; orientation++){
1998 if(orientation&1) buf+=w;
1999 if(orientation>1) buf+=stride>>1;
2001 memset(buffer[0], 0,
sizeof(
int)*
width*height);
2002 buf[w/2 + h/2*
stride]= 256*256;
2005 for(x=0; x<
width; x++){
2006 int64_t d= buffer[0][x + y*
width];
2008 if(
FFABS(width/2-x)<9 &&
FFABS(height/2-y)<9 && level==2) printf(
"%8"PRId64
" ", d);
2010 if(
FFABS(height/2-y)<9 && level==2) printf(
"\n");
2012 error= (int)(sqrt(error)+0.5);
2013 errors[
level][orientation]= error;
2014 if(g) g=
av_gcd(g, error);
2018 printf(
"static int const visual_weight[][4]={\n");
2021 for(orientation=0; orientation<4; orientation++){
2022 printf(
"%8"PRId64
",", errors[level][orientation]/g);
2038 memset(buffer[0], 0,
sizeof(
int)*width*height);
2040 for(x=0; x<
width; x++){
2041 int tab[4]={0,2,3,1};
2042 buffer[0][x+width*
y]= 256*256*tab[(x&1) + 2*(y&1)];
2047 for(x=0; x<
width; x++){
2048 int64_t d= buffer[0][x + y*
width];
2050 if(
FFABS(width/2-x)<9 &&
FFABS(height/2-y)<9) printf(
"%8"PRId64
" ", d);
2052 if(
FFABS(height/2-y)<9) printf(
"\n");
uint8_t * scratchpad
data area for the ME algo, so that the ME does not need to malloc/free.
#define FF_CODEC_CAP_INIT_CLEANUP
The codec allows calling the close function for deallocation even if the init function returned a fai...
static const AVClass snowenc_class
static av_cold int encode_end(AVCodecContext *avctx)
int frame_bits
bits used for the current frame
RateControlContext rc_context
contains stuff only accessed in ratecontrol.c
static av_always_inline void predict_plane(SnowContext *s, IDWTELEM *buf, int plane_index, int add)
int ff_snow_frame_start(SnowContext *s)
av_cold void ff_rate_control_uninit(MpegEncContext *s)
int last_spatial_decomposition_count
static int shift(int a, int b)
This structure describes decoded (raw) audio or video data.
int skip
set if ME is skipped for the current MB
static double rint(double x)
int ff_side_data_set_encoder_stats(AVPacket *pkt, int quality, int64_t *error, int error_count, int pict_type)
uint64_t error[AV_NUM_DATA_POINTERS]
error
planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples)
#define LIBAVUTIL_VERSION_INT
void ff_h263_encode_init(MpegEncContext *s)
int ff_epzs_motion_search(struct MpegEncContext *s, int *mx_ptr, int *my_ptr, int P[10][2], int src_index, int ref_index, int16_t(*last_mv)[2], int ref_mv_scale, int size, int h)
static av_cold int init(AVCodecContext *avctx)
uint8_t * current_mv_penalty
#define FF_MPV_COMMON_OPTS
const AVFrame * new_picture
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
uint32_t * score_map
map to store the scores
int8_t last_hcoeff[HTAPS_MAX/2]
int ff_snow_common_init_after_header(AVCodecContext *avctx)
static void update_last_header_values(SnowContext *s)
void ff_snow_reset_contexts(SnowContext *s)
static 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)
attribute_deprecated int me_method
This option does nothing.
int scenechange_threshold
scene change detection threshold 0 is default, larger means fewer detected scene changes.
uint32_t ff_square_tab[512]
static int encode_subband_c0run(SnowContext *s, SubBand *b, const IDWTELEM *src, const IDWTELEM *parent, int stride, int orientation)
int qlog
log(qscale)/log[2^(1/6)]
int ff_rac_terminate(RangeCoder *c)
static int get_penalty_factor(int lambda, int lambda2, int type)
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
#define av_assert0(cond)
assert() equivalent, that is always enabled.
static double cb(void *priv, double x, double y)
av_cold void ff_mpegvideoencdsp_init(MpegvideoEncDSPContext *c, AVCodecContext *avctx)
#define FF_CODEC_CAP_INIT_THREADSAFE
The codec does not modify any global variables in the init function, allowing to call the init functi...
static int encode_frame(AVCodecContext *avctx, AVPacket *pkt, const AVFrame *pict, int *got_packet)
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values.
static av_noinline void put_symbol(RangeCoder *c, uint8_t *state, int v, int is_signed)
#define av_assert2(cond)
assert() equivalent, that does lie in speed critical code.
static float search(FOCContext *foc, int pass, int maxpass, int xmin, int xmax, int ymin, int ymax, int *best_x, int *best_y, float best_score)
enum OutputFormat out_format
output format
uint32_t * ref_scores[MAX_REF_FRAMES]
int ff_get_mb_score(struct MpegEncContext *s, int mx, int my, int src_index, int ref_index, int size, int h, int add_rate)
Motion estimation context.
int av_frame_ref(AVFrame *dst, const AVFrame *src)
Set up a new reference to the data described by the source frame.
int64_t pts
Presentation timestamp in time_base units (time when frame should be shown to user).
int misc_bits
cbp, mb_type
int me_cmp
motion estimation comparison function
Picture current_picture
copy of the current picture structure.
#define ENCODER_EXTRA_BITS
static void calculate_visual_weight(SnowContext *s, Plane *p)
uint8_t(* mv_penalty)[MAX_MV *2+1]
bit amount needed to encode a MV
int ff_w97_32_c(struct MpegEncContext *v, uint8_t *pix1, uint8_t *pix2, ptrdiff_t line_size, int h)
static const BlockNode null_block
static void encode_blocks(SnowContext *s, int search)
int mb_height
number of MBs horizontally & vertically
void ff_snow_release_buffer(AVCodecContext *avctx)
char * stats_out
pass1 encoding statistics output buffer
#define AV_INPUT_BUFFER_MIN_SIZE
minimum encoding buffer size Used to avoid some checks during header writing.
static void put_symbol2(RangeCoder *c, uint8_t *state, int v, int log2)
#define ROUNDED_DIV(a, b)
#define AV_PKT_FLAG_KEY
The packet contains a keyframe.
MpegvideoEncDSPContext mpvencdsp
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
int16_t(*[MAX_REF_FRAMES] ref_mvs)[2]
#define AV_CODEC_FLAG_4MV
4 MV per MB allowed / advanced prediction for H.263.
unsigned me_cache_generation
av_cold int ff_rate_control_init(MpegEncContext *s)
int me_sub_cmp
subpixel motion estimation comparison function
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
void ff_write_pass1_stats(MpegEncContext *s)
int unrestricted_mv
mv can point outside of the coded picture
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
static void pred_mv(DiracBlock *block, int stride, int x, int y, int ref)
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
const uint8_t *const ff_obmc_tab[4]
int flags
AV_CODEC_FLAG_*.
static int get_dc(SnowContext *s, int mb_x, int mb_y, int plane_index)
#define CODEC_FLAG_QSCALE
int64_t av_gcd(int64_t a, int64_t b)
Return the greatest common divisor of a and b.
const char * name
Name of the codec implementation.
static void correlate(SnowContext *s, SubBand *b, IDWTELEM *src, int stride, int inverse, int use_median)
int quarter_sample
1->qpel, 0->half pel ME/MC
Libavcodec external API header.
uint8_t * emu_edge_buffer
int flags
A combination of AV_PKT_FLAG values.
int refs
number of reference frames
int bit_rate
the average bitrate
const int8_t ff_quant3bA[256]
enum AVPictureType pict_type
Picture type of the frame.
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code.
#define AV_CODEC_FLAG_QSCALE
Use fixed qscale.
int display_picture_number
picture number in display order
int me_method
ME algorithm.
static av_always_inline int check_block_inter(SnowContext *s, int mb_x, int mb_y, int p0, int p1, uint8_t(*obmc_edged)[MB_SIZE *2], int *best_rd)
int width
picture width / height.
GLsizei GLboolean const GLfloat * value
Picture * current_picture_ptr
pointer to the current picture
#define FF_CEIL_RSHIFT(a, b)
#define AV_CODEC_FLAG_PSNR
error[?] variables will be set during encoding.
static int encode_q_branch(SnowContext *s, int level, int x, int y)
float ff_rate_estimate_qscale(MpegEncContext *s, int dry_run)
#define AV_CODEC_FLAG_PASS1
Use internal 2pass ratecontrol in first pass mode.
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)
void ff_build_rac_states(RangeCoder *c, int factor, int max_p)
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
int quality
quality (between 1 (good) and FF_LAMBDA_MAX (bad))
void avcodec_get_chroma_sub_sample(enum AVPixelFormat pix_fmt, int *h_shift, int *v_shift)
Utility function to access log2_chroma_w log2_chroma_h from the pixel format AVPixFmtDescriptor.
int penalty_factor
an estimate of the bits required to code a given mv value, e.g.
static const float pred[4]
SubBand band[MAX_DWT_LEVELS][4]
static av_always_inline int same_block(BlockNode *a, BlockNode *b)
uint8_t block_state[128+32 *128]
int coded_picture_number
picture number in bitstream order
uint64_t error[AV_NUM_DATA_POINTERS]
error
int ff_snow_get_buffer(SnowContext *s, AVFrame *frame)
unsigned int lambda2
(lambda*lambda) >> FF_LAMBDA_SHIFT
static void encode_header(SnowContext *s)
ptrdiff_t linesize
line size, in bytes, may be different from width
int spatial_decomposition_count
int linesize[AV_NUM_DATA_POINTERS]
For video, size in bytes of each picture line.
void ff_set_cmp(MECmpContext *c, me_cmp_func *cmp, int type)
int frame_bits
number of bits used for the previously encoded frame
main external API structure.
int8_t hcoeff[HTAPS_MAX/2]
void ff_snow_pred_block(SnowContext *s, uint8_t *dst, uint8_t *tmp, ptrdiff_t stride, int sx, int sy, int b_w, int b_h, const BlockNode *block, int plane_index, int w, int h)
int height
picture size. must be a multiple of 16
int ff_snow_alloc_blocks(SnowContext *s)
static unsigned int av_lfg_get(AVLFG *c)
Get the next random unsigned 32-bit number using an ALFG.
static int get_rac_count(RangeCoder *c)
static void encode_q_branch2(SnowContext *s, int level, int x, int y)
unsigned me_cache[ME_CACHE_SIZE]
BYTE int const BYTE int int int height
planar YUV 4:1:0, 9bpp, (1 Cr & Cb sample per 4x4 Y samples)
Describe the class of an AVClass context structure.
av_cold void ff_init_range_encoder(RangeCoder *c, uint8_t *buf, int buf_size)
int64_t mc_mb_var_sum
motion compensated MB variance for current frame
static int get_block_bits(SnowContext *s, int x, int y, int w)
void ff_spatial_idwt(IDWTELEM *buffer, IDWTELEM *temp, int width, int height, int stride, int type, int decomposition_count)
ptrdiff_t uvlinesize
line size, for chroma in bytes, may be different from width
av_cold void av_lfg_init(AVLFG *c, unsigned int seed)
int ff_w53_32_c(struct MpegEncContext *v, uint8_t *pix1, uint8_t *pix2, ptrdiff_t line_size, int h)
DWTELEM * temp_dwt_buffer
int ff_alloc_packet2(AVCodecContext *avctx, AVPacket *avpkt, int64_t size, int64_t min_size)
Check AVPacket size and/or allocate data.
int f_code
forward MV resolution
int pict_type
AV_PICTURE_TYPE_I, AV_PICTURE_TYPE_P, AV_PICTURE_TYPE_B, ...
static enum AVPixelFormat pix_fmts[]
static int qscale2qlog(int qscale)
static int pix_sum(uint8_t *pix, int line_size, int w, int h)
int ff_snow_common_init(AVCodecContext *avctx)
static void encode_qlogs(SnowContext *s)
int motion_est
ME algorithm.
void av_frame_unref(AVFrame *frame)
Unreference all the buffers referenced by frame and reset the frame fields.
int global_quality
Global quality for codecs which cannot change it per frame.
int ff_init_me(MpegEncContext *s)
#define AV_CODEC_FLAG_QPEL
Use qpel MC.
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
int spatial_decomposition_type
AVFrame * current_picture
static int get_block_rd(SnowContext *s, int mb_x, int mb_y, int plane_index, uint8_t(*obmc_edged)[MB_SIZE *2])
int b8_stride
2*mb_width+1 used for some 8x8 block arrays to allow simple addressing
struct AVCodecContext * avctx
int gop_size
the number of pictures in a group of pictures, or 0 for intra_only
static int get_4block_rd(SnowContext *s, int mb_x, int mb_y, int plane_index)
#define CODEC_FLAG_EMU_EDGE
GLint GLenum GLboolean GLsizei stride
int mb_cmp
macroblock comparison function (not supported yet)
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
int temporal_decomposition_type
#define FF_DISABLE_DEPRECATION_WARNINGS
common internal api header.
int mb_stride
mb_width+1 used for some arrays to allow simple addressing of left & top MBs without sig11 ...
IDWTELEM * temp_idwt_buffer
void ff_spatial_dwt(DWTELEM *buffer, DWTELEM *temp, int width, int height, int stride, int type, int decomposition_count)
int prediction_method
prediction method (needed for huffyuv)
DWTELEM * spatial_dwt_buffer
attribute_deprecated AVFrame * coded_frame
the picture in the bitstream
static av_cold int encode_init(AVCodecContext *avctx)
me_cmp_func me_sub_cmp[6]
static const AVOption options[]
uint32_t * map
map to avoid duplicate evaluations
IDWTELEM * spatial_idwt_buffer
uint8_t * bytestream_start
#define AV_CODEC_FLAG_PASS2
Use internal 2pass ratecontrol in second pass mode.
static av_always_inline int check_4block_inter(SnowContext *s, int mb_x, int mb_y, int p0, int p1, int ref, int *best_rd)
static void dequantize(SnowContext *s, SubBand *b, IDWTELEM *src, int stride)
int dia_size
ME diamond size & shape.
#define FF_ENABLE_DEPRECATION_WARNINGS
uint8_t * obmc_scratchpad
void(* draw_edges)(uint8_t *buf, int wrap, int width, int height, int w, int h, int sides)
static void init_ref(MotionEstContext *c, uint8_t *src[3], uint8_t *ref[3], uint8_t *ref2[3], int x, int y, int ref_index)
int64_t bit_rate
wanted bit rate
int key_frame
1 -> keyframe, 0-> not
#define FF_QP2LAMBDA
factor to convert from H.263 QP to lambda
static const struct twinvq_data tab
av_cold void ff_snow_common_end(SnowContext *s)
static void * av_mallocz_array(size_t nmemb, size_t size)
int frame_number
Frame counter, set by libavcodec.
static uint32_t inverse(uint32_t v)
find multiplicative inverse modulo 2 ^ 32
int main(int argc, char **argv)
static int ratecontrol_1pass(SnowContext *s, AVFrame *pict)
AVFrame * last_picture[MAX_REF_FRAMES]
static double cr(void *priv, double x, double y)
AVFrame * input_picture
new_picture with the internal linesizes
static int pix_norm1(uint8_t *pix, int line_size, int w)
int temporal_decomposition_count
int64_t mb_var_sum
sum of MB variance for current frame
AVPixelFormat
Pixel format.
This structure stores compressed data.
static void decorrelate(SnowContext *s, SubBand *b, IDWTELEM *src, int stride, int inverse, int use_median)
int(* sub_motion_search)(struct MpegEncContext *s, int *mx_ptr, int *my_ptr, int dmin, int src_index, int ref_index, int size, int h)
static void quantize(SnowContext *s, SubBand *b, IDWTELEM *dst, DWTELEM *src, int stride, int bias)
void * av_mallocz(size_t size)
Allocate a block of size bytes with alignment suitable for all memory accesses (including vectors if ...
static int encode_subband(SnowContext *s, SubBand *b, const IDWTELEM *src, const IDWTELEM *parent, int stride, int orientation)
int last_spatial_decomposition_type
unsigned int lambda
lagrange multipler used in rate distortion
static void iterative_me(SnowContext *s)
static av_always_inline int check_block(SnowContext *s, int mb_x, int mb_y, int p[3], int intra, uint8_t(*obmc_edged)[MB_SIZE *2], int *best_rd)