44 #if FF_API_PRIVATE_OPT
69 for(plane_index=0; plane_index<3; plane_index++){
166 for (i = 0; i <
h; i++) {
167 for (j = 0; j < w; j++) {
171 pix += line_size - w;
183 for (i = 0; i < w; i++) {
184 for (j = 0; j < w; j ++) {
188 pix += line_size - w;
199 return (3*lambda)>>(FF_LAMBDA_SHIFT+1);
220 #define P_TOPRIGHT P[3]
221 #define P_MEDIAN P[4]
223 #define FLAG_QPEL 1 //must be 1
233 int score, score2, iscore, i_len, p_len, block_s, sum, base_bits;
237 const int index= (x + y*w) << rem_depth;
239 int trx= (x+1)<<rem_depth;
240 int try= (y+1)<<rem_depth;
246 const BlockNode *tr = y && trx<w && ((x&1)==0 || level==0) ? &s->
block[index-w+(1<<rem_depth)] : tl;
247 int pl = left->
color[0];
248 int pcb= left->
color[1];
249 int pcr= left->
color[2];
259 int16_t last_mv[3][2];
261 const int shift= 1+qpel;
267 int ref, best_ref, ref_score, ref_mx, ref_my;
271 set_blocks(s, level, x, y, pl, pcb, pcr, 0, 0, 0,
BLOCK_INTRA);
286 last_mv[1][0]= right->
mx;
287 last_mv[1][1]= right->
my;
288 last_mv[2][0]= bottom->
mx;
289 last_mv[2][1]= bottom->
my;
304 c->
xmin = - x*block_w - 16+3;
305 c->
ymin = - y*block_w - 16+3;
349 if(score > ref_score){
362 pc.bytestream= p_buffer;
366 put_rac(&pc, &p_state[4 + s_context], 1);
369 put_symbol(&pc, &p_state[128 + 1024 + 32*ref_context], best_ref, 0);
370 pred_mv(s, &pmx, &pmy, best_ref, left, top, tr);
371 put_symbol(&pc, &p_state[128 + 32*(mx_context + 16*!!best_ref)], mx - pmx, 1);
372 put_symbol(&pc, &p_state[128 + 32*(my_context + 16*!!best_ref)], my - pmy, 1);
373 p_len= pc.bytestream - pc.bytestream_start;
376 block_s= block_w*block_w;
377 sum =
pix_sum(current_data[0], stride, block_w, block_w);
378 l= (sum + block_s/2)/block_s;
379 iscore =
pix_norm1(current_data[0], stride, block_w) - 2*l*sum + l*l*block_s;
384 cb= (sum + block_s/2)/block_s;
387 cr= (sum + block_s/2)/block_s;
394 ic.bytestream= i_buffer;
397 put_rac(&ic, &i_state[4 + s_context], 1);
404 i_len= ic.bytestream - ic.bytestream_start;
407 av_assert1(iscore < 255*255*256 + s->lambda2*10);
413 int varc= iscore >> 8;
414 int vard= score >> 8;
415 if (vard <= 64 || vard < varc)
429 if(score2 < score && score2 < iscore)
434 pred_mv(s, &pmx, &pmy, 0, left, top, tr);
435 memcpy(pbbak, i_buffer, i_len);
439 set_blocks(s, level, x, y, l, cb, cr, pmx, pmy, 0,
BLOCK_INTRA);
443 memcpy(pbbak, p_buffer, p_len);
447 set_blocks(s, level, x, y, pl, pcb, pcr, mx, my, best_ref, 0);
456 const int index= (x + y*w) << rem_depth;
457 int trx= (x+1)<<rem_depth;
462 const BlockNode *tr = y && trx<w && ((x&1)==0 || level==0) ? &s->
block[index-w+(1<<rem_depth)] : tl;
463 int pl = left->
color[0];
464 int pcb= left->
color[1];
465 int pcr= left->
color[2];
473 set_blocks(s, level, x, y, pl, pcb, pcr, 0, 0, 0,
BLOCK_INTRA);
490 pred_mv(s, &pmx, &pmy, 0, left, top, tr);
497 set_blocks(s, level, x, y, b->
color[0], b->
color[1], b->
color[2], pmx, pmy, 0,
BLOCK_INTRA);
499 pred_mv(s, &pmx, &pmy, b->
ref, left, top, tr);
505 set_blocks(s, level, x, y, pl, pcb, pcr, b->
mx, b->
my, b->
ref, 0);
513 const int block_w = plane_index ? block_size>>s->
chroma_h_shift : block_size;
514 const int block_h = plane_index ? block_size>>s->
chroma_v_shift : block_size;
516 const int obmc_stride= plane_index ? (2*block_size)>>s->
chroma_h_shift : 2*block_size;
518 uint8_t *
src= s-> input_picture->data[plane_index];
521 const int w= p->
width;
523 int index= mb_x + mb_y*b_stride;
532 b->
color[plane_index]= 0;
533 memset(dst, 0, obmc_stride*obmc_stride*
sizeof(
IDWTELEM));
536 int mb_x2= mb_x + (i &1) - 1;
537 int mb_y2= mb_y + (i>>1) - 1;
538 int x= block_w*mb_x2 + block_w/2;
539 int y= block_h*mb_y2 + block_h/2;
542 x, y, block_w, block_h, w, h, obmc_stride, ref_stride, obmc_stride, mb_x2, mb_y2, 0, 0, plane_index);
544 for(y2=
FFMAX(y, 0); y2<
FFMIN(h, y+block_h); y2++){
545 for(x2=
FFMAX(x, 0); x2<
FFMIN(w, x+block_w); x2++){
546 int index= x2-(block_w*mb_x - block_w/2) + (y2-(block_h*mb_y - block_h/2))*obmc_stride;
547 int obmc_v= obmc[
index];
549 if(y<0) obmc_v += obmc[index + block_h*obmc_stride];
550 if(x<0) obmc_v += obmc[index + block_w];
551 if(y+block_h>h) obmc_v += obmc[index - block_h*obmc_stride];
552 if(x+block_w>w) obmc_v += obmc[index - block_w];
557 ab += (
src[x2 + y2*ref_stride] - (d>>
FRAC_BITS)) * obmc_v;
558 aa += obmc_v * obmc_v;
570 int index= x + y*b_stride;
574 const BlockNode *tl = y && x ? &s->
block[index-b_stride-1] : left;
575 const BlockNode *tr = y && x+w<b_stride ? &s->
block[index-b_stride+w] : tl;
580 if(x<0 || x>=b_stride || y>=b_height)
596 pred_mv(s, &dmx, &dmy, b->
ref, left, top, tr);
608 const int block_w = plane_index ? block_size>>s->
chroma_h_shift : block_size;
609 const int block_h = plane_index ? block_size>>s->
chroma_v_shift : block_size;
610 const int obmc_stride= plane_index ? (2*block_size)>>s->
chroma_h_shift : 2*block_size;
613 uint8_t *
src= s-> input_picture->data[plane_index];
619 const int w= p->
width;
624 int sx= block_w*mb_x - block_w/2;
625 int sy= block_h*mb_y - block_h/2;
626 int x0=
FFMAX(0,-sx);
627 int y0=
FFMAX(0,-sy);
628 int x1=
FFMIN(block_w*2, w-sx);
629 int y1=
FFMIN(block_h*2, h-sy);
634 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);
636 for(y=y0; y<y1; y++){
637 const uint8_t *obmc1= obmc_edged[y];
639 uint8_t *cur1 = cur + y*ref_stride;
640 uint8_t *dst1 = dst + sx + (sy+y)*ref_stride;
641 for(x=x0; x<x1; x++){
642 #if FRAC_BITS >= LOG2_OBMC_MAX
648 if(v&(~255)) v= ~(v>>31);
655 && (mb_x == 0 || mb_x == b_stride-1)
656 && (mb_y == 0 || mb_y == b_height-1)){
666 memcpy(dst + sx+x0 + (sy+y)*ref_stride, cur + x0 + y*ref_stride, x1-x0);
677 distortion =
ff_w97_32_c(&s->
m,
src + sx + sy*ref_stride, dst + sx + sy*ref_stride, ref_stride, 32);
679 distortion =
ff_w53_32_c(&s->
m,
src + sx + sy*ref_stride, dst + sx + sy*ref_stride, ref_stride, 32);
683 int off = sx+16*(i&1) + (sy+16*(i>>1))*ref_stride;
684 distortion += s->
mecc.
me_cmp[0](&s->
m,
src + off, dst + off, ref_stride, 16);
689 distortion = s->
mecc.
me_cmp[0](&s->
m,
src + sx + sy*ref_stride, dst + sx + sy*ref_stride, ref_stride, block_w*2);
698 rate +=
get_block_bits(s, mb_x + (i&1) - (i>>1), mb_y + (i>>1), 1);
700 if(mb_x == b_stride-2)
703 return distortion + rate*penalty_factor;
710 const int block_w = plane_index ? block_size>>s->
chroma_h_shift : block_size;
711 const int block_h = plane_index ? block_size>>s->
chroma_v_shift : block_size;
713 const int obmc_stride= plane_index ? (2*block_size)>>s->
chroma_h_shift : 2*block_size;
716 uint8_t *
src= s-> input_picture->data[plane_index];
721 const int w= p->
width;
730 int mb_x2= mb_x + (i%3) - 1;
731 int mb_y2= mb_y + (i/3) - 1;
732 int x= block_w*mb_x2 + block_w/2;
733 int y= block_h*mb_y2 + block_h/2;
736 x, y, block_w, block_h, w, h, 0, ref_stride, obmc_stride, mb_x2, mb_y2, 1, 1, plane_index);
739 for(y2= y; y2<0; y2++)
740 memcpy(dst + x + y2*ref_stride,
src + x + y2*ref_stride, block_w);
741 for(y2= h; y2<y+block_h; y2++)
742 memcpy(dst + x + y2*ref_stride,
src + x + y2*ref_stride, block_w);
744 for(y2= y; y2<y+block_h; y2++)
745 memcpy(dst + x + y2*ref_stride,
src + x + y2*ref_stride, -x);
748 for(y2= y; y2<y+block_h; y2++)
749 memcpy(dst + w + y2*ref_stride,
src + w + y2*ref_stride, x+block_w - w);
753 distortion += s->
mecc.
me_cmp[block_w==8](&s->
m,
src + x + y*ref_stride, dst + x + y*ref_stride, ref_stride, block_h);
767 for(i=merged?4:0; i<9; i++){
768 static const int dxy[9][2] = {{0,0},{1,0},{0,1},{1,1},{2,0},{2,1},{-1,2},{0,2},{1,2}};
772 return distortion + rate*penalty_factor;
776 const int w= b->
width;
789 int l=0, lt=0, t=0, rt=0;
793 t= src[x + (y-1)*stride];
795 lt= src[x - 1 + (y-1)*stride];
798 rt= src[x + 1 + (y-1)*stride];
811 if(px<b->parent->width && py<b->parent->height)
812 p= parent[px + py*2*
stride];
816 runs[run_index++]=
run;
824 max_index= run_index;
825 runs[run_index++]=
run;
827 run= runs[run_index++];
830 if(run_index <= max_index)
840 int l=0, lt=0, t=0, rt=0;
844 t= src[x + (y-1)*stride];
846 lt= src[x - 1 + (y-1)*stride];
849 rt= src[x + 1 + (y-1)*stride];
862 if(px<b->parent->width && py<b->parent->height)
863 p= parent[px + py*2*
stride];
871 run= runs[run_index++];
873 if(run_index <= max_index)
883 int l2= 2*
FFABS(l) + (l<0);
913 block->
color[0] = p[0];
914 block->
color[1] = p[1];
915 block->
color[2] = p[2];
945 return check_block(s, mb_x, mb_y, p, 0, obmc_edged, best_rd);
958 backup[0] = block[0];
959 backup[1] = block[1];
960 backup[2] = block[b_stride];
961 backup[3] = block[b_stride + 1];
977 block[1]= block[b_stride]= block[b_stride+1]= *
block;
988 block[b_stride]= backup[2];
989 block[b_stride+1]= backup[3];
995 int pass, mb_x, mb_y;
998 const int b_stride= b_width;
1005 for(mb_y= 0; mb_y<s->
b_height; mb_y++)
1006 for(mb_x= 0; mb_x<s->
b_width; mb_x++)
1012 for(pass=0; pass<25; pass++){
1015 for(mb_y= 0; mb_y<b_height; mb_y++){
1016 for(mb_x= 0; mb_x<b_width; mb_x++){
1017 int dia_change, i, j, ref;
1018 int best_rd= INT_MAX, ref_rd;
1020 const int index= mb_x + mb_y * b_stride;
1029 BlockNode *brb= mb_x+1<b_width && mb_y+1<b_height ? &s->
block[index+b_stride+1] :
NULL;
1046 for (y = 0; y < b_w * 2; y++)
1049 for(y=0; y<b_w*2; y++)
1050 memset(obmc_edged[y], obmc_edged[y][0] + obmc_edged[y][b_w-1], b_w);
1051 if(mb_x==b_stride-1)
1052 for(y=0; y<b_w*2; y++)
1053 memset(obmc_edged[y]+b_w, obmc_edged[y][b_w] + obmc_edged[y][b_w*2-1], b_w);
1055 for(x=0; x<b_w*2; x++)
1056 obmc_edged[0][x] += obmc_edged[b_w-1][x];
1057 for(y=1; y<b_w; y++)
1058 memcpy(obmc_edged[y], obmc_edged[0], b_w*2);
1060 if(mb_y==b_height-1){
1061 for(x=0; x<b_w*2; x++)
1062 obmc_edged[b_w*2-1][x] += obmc_edged[b_w][x];
1063 for(y=b_w; y<b_w*2-1; y++)
1064 memcpy(obmc_edged[y], obmc_edged[b_w*2-1], b_w*2);
1069 if(mb_x==0 || mb_y==0 || mb_x==b_width-1 || mb_y==b_height-1){
1075 const int sx= block_w*mb_x - block_w/2;
1076 const int sy= block_h*mb_y - block_h/2;
1082 memcpy(dst + sx + y*stride, src + sx + y*stride, block_w*2);
1083 for(y=h; y<sy+block_h*2; y++)
1084 memcpy(dst + sx + y*stride, src + sx + y*stride, block_w*2);
1086 for(y=sy; y<sy+block_h*2; y++)
1087 memcpy(dst + sx + y*stride, src + sx + y*stride, -sx);
1089 if(sx+block_w*2 > w){
1090 for(y=sy; y<sy+block_h*2; y++)
1091 memcpy(dst + w + y*stride, src + w + y*stride, sx+block_w*2 - w);
1097 color[i]=
get_dc(s, mb_x, mb_y, i);
1102 check_block(s, mb_x, mb_y, color0, 1, obmc_edged, &best_rd);
1118 check_block_inter(s, mb_x, mb_y, mvr[-b_stride][0], mvr[-b_stride][1], obmc_edged, &best_rd);
1124 check_block_inter(s, mb_x, mb_y, mvr[b_stride][0], mvr[b_stride][1], obmc_edged, &best_rd);
1129 int newx = block->
mx;
1130 int newy = block->
my;
1133 for(i=0; i < dia_size; i++){
1135 dia_change |=
check_block_inter(s, mb_x, mb_y, newx+4*(i-j), newy+(4*j), obmc_edged, &best_rd);
1136 dia_change |=
check_block_inter(s, mb_x, mb_y, newx-4*(i-j), newy-(4*j), obmc_edged, &best_rd);
1137 dia_change |=
check_block_inter(s, mb_x, mb_y, newx-(4*j), newy+4*(i-j), obmc_edged, &best_rd);
1138 dia_change |=
check_block_inter(s, mb_x, mb_y, newx+(4*j), newy-4*(i-j), obmc_edged, &best_rd);
1144 static const int square[8][2]= {{+1, 0},{-1, 0},{ 0,+1},{ 0,-1},{+1,+1},{-1,-1},{+1,-1},{-1,+1},};
1147 dia_change |=
check_block_inter(s, mb_x, mb_y, block->
mx+square[i][0], block->
my+square[i][1], obmc_edged, &best_rd);
1151 mvr[0][0]= block->
mx;
1152 mvr[0][1]= block->
my;
1153 if(ref_rd > best_rd){
1160 check_block(s, mb_x, mb_y, color, 1, obmc_edged, &best_rd);
1182 for(mb_y= 0; mb_y<b_height; mb_y+=2){
1183 for(mb_x= 0; mb_x<b_width; mb_x+=2){
1185 int best_rd, init_rd;
1186 const int index= mb_x + mb_y * b_stride;
1191 b[2]= b[0]+b_stride;
1206 (b[0]->mx + b[1]->mx + b[2]->mx + b[3]->mx + 2) >> 2,
1207 (b[0]->my + b[1]->my + b[2]->my + b[3]->my + 2) >> 2, 0, &best_rd);
1213 if(init_rd != best_rd)
1244 const int w= b->
width;
1248 int x,y, thres1, thres2;
1253 dst[x + y*stride]= src[x + y*stride];
1257 bias= bias ? 0 : (3*qmul)>>3;
1264 int i= src[x + y*
stride];
1266 if((
unsigned)(i+thres1) > thres2){
1284 int i= src[x + y*
stride];
1286 if((
unsigned)(i+thres1) > thres2){
1289 i= (i + bias) / qmul;
1294 i= (i + bias) / qmul;
1305 const int w= b->
width;
1316 int i= src[x + y*
stride];
1327 const int w= b->
width;
1331 for(y=h-1; y>=0; y--){
1332 for(x=w-1; x>=0; x--){
1337 if(y && x+1<w) src[i] -=
mid_pred(src[i - 1], src[i - stride], src[i - stride + 1]);
1338 else src[i] -= src[i - 1];
1340 if(y) src[i] -=
mid_pred(src[i - 1], src[i - stride], src[i - 1] + src[i - stride] - src[i - 1 - stride]);
1341 else src[i] -= src[i - 1];
1344 if(y) src[i] -= src[i -
stride];
1351 const int w= b->
width;
1361 if(y && x+1<w) src[i] +=
mid_pred(src[i - 1], src[i - stride], src[i - stride + 1]);
1362 else src[i] += src[i - 1];
1364 if(y) src[i] +=
mid_pred(src[i - 1], src[i - stride], src[i - 1] + src[i - stride] - src[i - 1 - stride]);
1365 else src[i] += src[i - 1];
1368 if(y) src[i] += src[i -
stride];
1375 int plane_index,
level, orientation;
1377 for(plane_index=0; plane_index<
FFMIN(s->
nb_planes, 2); plane_index++){
1379 for(orientation=level ? 1:0; orientation<4; orientation++){
1380 if(orientation==2)
continue;
1391 memset(kstate,
MID_STATE,
sizeof(kstate));
1401 for(plane_index=0; plane_index<2; plane_index++){
1428 for(plane_index=0; plane_index<
FFMIN(s->
nb_planes, 2); plane_index++){
1436 for(plane_index=0; plane_index<
FFMIN(s->
nb_planes, 2); plane_index++){
1440 for(i= p->
htaps/2; i; i--)
1464 for(plane_index=0; plane_index<2; plane_index++){
1490 uint32_t coef_sum= 0;
1491 int level, orientation, delta_qlog;
1494 for(orientation=level ? 1 : 0; orientation<4; orientation++){
1497 const int w= b->
width;
1499 const int stride= b->
stride;
1502 const int qdiv= (1<<16)/qmul;
1507 buf[x+y*stride]= b->
buf[x+y*stride];
1512 coef_sum+= abs(buf[x+y*stride]) * qdiv >> 16;
1518 coef_sum = (uint64_t)coef_sum * coef_sum >> 16;
1533 s->
qlog+= delta_qlog;
1540 int level, orientation, x, y;
1543 for(orientation=level ? 1 : 0; orientation<4; orientation++){
1552 for(x=0; x<
width; x++){
1564 const AVFrame *pict,
int *got_packet)
1571 int level, orientation, plane_index, i, y, ret;
1587 AV_CEIL_RSHIFT(width, hshift));
1655 int block_width = (width +15)>>4;
1656 int block_height= (height+15)>>4;
1676 #if FF_API_MOTION_EST
1722 for(plane_index=0; plane_index < s->
nb_planes; plane_index++){
1732 for(plane_index=0; plane_index < s->nb_planes; plane_index++){
1741 if(pict->
data[plane_index])
1749 #if FF_API_PRIVATE_OPT
1786 if (delta_qlog <= INT_MIN)
1799 for(orientation=level ? 1 : 0; orientation<4; orientation++){
1814 for(orientation=level ? 1 : 0; orientation<4; orientation++){
1836 pict->
data[plane_index][y*pict->
linesize[plane_index] + x];
1847 if(pict->
data[plane_index])
1891 #if FF_API_ERROR_FRAME
1917 #define OFFSET(x) offsetof(SnowContext, x)
1918 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
1922 {
"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 },
1923 {
"no_bitstream",
"Skip final bitstream writeout.",
OFFSET(no_bitstream),
AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1,
VE },
1924 {
"intra_penalty",
"Penalty for intra blocks in block decission",
OFFSET(intra_penalty),
AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX,
VE },
1925 {
"iterative_dia_size",
"Dia size for the iterative ME",
OFFSET(iterative_dia_size),
AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX,
VE },
1926 {
"sc_threshold",
"Scene change threshold",
OFFSET(scenechange_threshold),
AV_OPT_TYPE_INT, { .i64 = 0 }, INT_MIN, INT_MAX,
VE },
1982 fprintf(stderr,
"Failed to allocate memory\n");
1988 printf(
"testing 5/3 DWT\n");
1990 buffer[0][i] = buffer[1][i] =
av_lfg_get(&prng) % 54321 - 12345;
1996 if(buffer[0][i]!= buffer[1][i]) printf(
"fsck: %6d %12d %7d\n",i, buffer[0][i], buffer[1][i]);
1998 printf(
"testing 9/7 DWT\n");
2001 buffer[0][i] = buffer[1][i] =
av_lfg_get(&prng) % 54321 - 12345;
2007 if(
FFABS(buffer[0][i] - buffer[1][i])>20) printf(
"fsck: %6d %12d %7d\n",i, buffer[0][i], buffer[1][i]);
2010 int level, orientation, x, y;
2011 int64_t errors[8][4];
2014 memset(errors, 0,
sizeof(errors));
2018 for(orientation=level ? 1 : 0; orientation<4; orientation++){
2025 if(orientation&1) buf+=w;
2026 if(orientation>1) buf+=stride>>1;
2028 memset(buffer[0], 0,
sizeof(
int)*
width*height);
2029 buf[w/2 + h/2*
stride]= 256*256;
2032 for(x=0; x<
width; x++){
2033 int64_t d= buffer[0][x + y*
width];
2035 if(
FFABS(width/2-x)<9 &&
FFABS(height/2-y)<9 && level==2) printf(
"%8"PRId64
" ", d);
2037 if(
FFABS(height/2-y)<9 && level==2) printf(
"\n");
2039 error= (int)(sqrt(error)+0.5);
2040 errors[
level][orientation]= error;
2041 if(g) g=
av_gcd(g, error);
2045 printf(
"static int const visual_weight[][4]={\n");
2048 for(orientation=0; orientation<4; orientation++){
2049 printf(
"%8"PRId64
",", errors[level][orientation]/g);
2065 memset(buffer[0], 0,
sizeof(
int)*width*height);
2067 for(x=0; x<
width; x++){
2068 int tab[4]={0,2,3,1};
2069 buffer[0][x+width*y]= 256*256*tab[(x&1) + 2*(y&1)];
2074 for(x=0; x<
width; x++){
2075 int64_t d= buffer[0][x + y*
width];
2077 if(
FFABS(width/2-x)<9 &&
FFABS(height/2-y)<9) printf(
"%8"PRId64
" ", d);
2079 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
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)
int64_t bit_rate
the average bitrate
#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
int scenechange_threshold
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)
uint8_t(* mv_penalty)[MAX_DMV *2+1]
bit amount needed to encode a MV
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.
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)
attribute_deprecated int mv_bits
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)
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.
attribute_deprecated uint64_t error[AV_NUM_DATA_POINTERS]
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)
Compute 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
uint8_t * emu_edge_buffer
int flags
A combination of AV_PKT_FLAG values.
int refs
number of reference frames
SubBand band[DWT_LEVELS][4]
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
enum AVPictureType last_picture
#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]
static av_always_inline int same_block(BlockNode *a, BlockNode *b)
attribute_deprecated int misc_bits
uint8_t block_state[128+32 *128]
int coded_picture_number
picture number in bitstream order
int ff_snow_get_buffer(SnowContext *s, AVFrame *frame)
unsigned int lambda2
(lambda*lambda) >> FF_LAMBDA_SHIFT
Libavcodec external API header.
static void encode_header(SnowContext *s)
attribute_deprecated int scenechange_threshold
ptrdiff_t linesize
line size, in bytes, may be different from width
int spatial_decomposition_count
attribute_deprecated int prediction_method
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)
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)
Replacements for frequently missing libm functions.
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
uint64_t encoding_error[AV_NUM_DATA_POINTERS]
attribute_deprecated int p_tex_bits
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)
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.
attribute_deprecated int frame_bits
#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
#define AV_CEIL_RSHIFT(a, b)
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)