53 for(plane_index=0; plane_index<3; plane_index++){
151 for (i = 0; i <
h; i++) {
152 for (j = 0; j < w; j++) {
156 pix += line_size - w;
168 for (i = 0; i < w; i++) {
169 for (j = 0; j < w; j ++) {
173 pix += line_size - w;
184 return (3*lambda)>>(FF_LAMBDA_SHIFT+1);
205 #define P_TOPRIGHT P[3]
206 #define P_MEDIAN P[4]
208 #define FLAG_QPEL 1 //must be 1
218 int score, score2, iscore, i_len, p_len, block_s, sum, base_bits;
222 const int index= (x + y*w) << rem_depth;
224 int trx= (x+1)<<rem_depth;
225 int try= (y+1)<<rem_depth;
231 const BlockNode *tr = y && trx<w && ((x&1)==0 || level==0) ? &s->
block[index-w+(1<<rem_depth)] : tl;
232 int pl = left->
color[0];
233 int pcb= left->
color[1];
234 int pcr= left->
color[2];
244 int16_t last_mv[3][2];
246 const int shift= 1+qpel;
252 int ref, best_ref, ref_score, ref_mx, ref_my;
256 set_blocks(s, level, x, y, pl, pcb, pcr, 0, 0, 0,
BLOCK_INTRA);
271 last_mv[1][0]= right->
mx;
272 last_mv[1][1]= right->
my;
273 last_mv[2][0]= bottom->
mx;
274 last_mv[2][1]= bottom->
my;
289 c->
xmin = - x*block_w - 16+3;
290 c->
ymin = - y*block_w - 16+3;
334 if(score > ref_score){
347 pc.bytestream= p_buffer;
351 put_rac(&pc, &p_state[4 + s_context], 1);
354 put_symbol(&pc, &p_state[128 + 1024 + 32*ref_context], best_ref, 0);
355 pred_mv(s, &pmx, &pmy, best_ref, left, top, tr);
356 put_symbol(&pc, &p_state[128 + 32*(mx_context + 16*!!best_ref)], mx - pmx, 1);
357 put_symbol(&pc, &p_state[128 + 32*(my_context + 16*!!best_ref)], my - pmy, 1);
358 p_len= pc.bytestream - pc.bytestream_start;
361 block_s= block_w*block_w;
362 sum =
pix_sum(current_data[0], stride, block_w, block_w);
363 l= (sum + block_s/2)/block_s;
364 iscore =
pix_norm1(current_data[0], stride, block_w) - 2*l*sum + l*l*block_s;
369 cb= (sum + block_s/2)/block_s;
372 cr= (sum + block_s/2)/block_s;
379 ic.bytestream= i_buffer;
382 put_rac(&ic, &i_state[4 + s_context], 1);
389 i_len= ic.bytestream - ic.bytestream_start;
392 av_assert1(iscore < 255*255*256 + s->lambda2*10);
398 int varc= iscore >> 8;
399 int vard= score >> 8;
400 if (vard <= 64 || vard < varc)
414 if(score2 < score && score2 < iscore)
419 pred_mv(s, &pmx, &pmy, 0, left, top, tr);
420 memcpy(pbbak, i_buffer, i_len);
424 set_blocks(s, level, x, y, l, cb, cr, pmx, pmy, 0,
BLOCK_INTRA);
428 memcpy(pbbak, p_buffer, p_len);
432 set_blocks(s, level, x, y, pl, pcb, pcr, mx, my, best_ref, 0);
441 const int index= (x + y*w) << rem_depth;
442 int trx= (x+1)<<rem_depth;
447 const BlockNode *tr = y && trx<w && ((x&1)==0 || level==0) ? &s->
block[index-w+(1<<rem_depth)] : tl;
448 int pl = left->
color[0];
449 int pcb= left->
color[1];
450 int pcr= left->
color[2];
458 set_blocks(s, level, x, y, pl, pcb, pcr, 0, 0, 0,
BLOCK_INTRA);
475 pred_mv(s, &pmx, &pmy, 0, left, top, tr);
482 set_blocks(s, level, x, y, b->
color[0], b->
color[1], b->
color[2], pmx, pmy, 0,
BLOCK_INTRA);
484 pred_mv(s, &pmx, &pmy, b->
ref, left, top, tr);
490 set_blocks(s, level, x, y, pl, pcb, pcr, b->
mx, b->
my, b->
ref, 0);
498 const int block_w = plane_index ? block_size>>s->
chroma_h_shift : block_size;
499 const int block_h = plane_index ? block_size>>s->
chroma_v_shift : block_size;
501 const int obmc_stride= plane_index ? (2*block_size)>>s->
chroma_h_shift : 2*block_size;
503 uint8_t *
src= s-> input_picture->data[plane_index];
506 const int w= p->
width;
508 int index= mb_x + mb_y*b_stride;
517 b->
color[plane_index]= 0;
518 memset(dst, 0, obmc_stride*obmc_stride*
sizeof(
IDWTELEM));
521 int mb_x2= mb_x + (i &1) - 1;
522 int mb_y2= mb_y + (i>>1) - 1;
523 int x= block_w*mb_x2 + block_w/2;
524 int y= block_h*mb_y2 + block_h/2;
527 x, y, block_w, block_h, w, h, obmc_stride, ref_stride, obmc_stride, mb_x2, mb_y2, 0, 0, plane_index);
529 for(y2=
FFMAX(y, 0); y2<
FFMIN(h, y+block_h); y2++){
530 for(x2=
FFMAX(x, 0); x2<
FFMIN(w, x+block_w); x2++){
531 int index= x2-(block_w*mb_x - block_w/2) + (y2-(block_h*mb_y - block_h/2))*obmc_stride;
532 int obmc_v= obmc[
index];
534 if(y<0) obmc_v += obmc[index + block_h*obmc_stride];
535 if(x<0) obmc_v += obmc[index + block_w];
536 if(y+block_h>h) obmc_v += obmc[index - block_h*obmc_stride];
537 if(x+block_w>w) obmc_v += obmc[index - block_w];
542 ab += (
src[x2 + y2*ref_stride] - (d>>
FRAC_BITS)) * obmc_v;
543 aa += obmc_v * obmc_v;
555 int index= x + y*b_stride;
559 const BlockNode *tl = y && x ? &s->
block[index-b_stride-1] : left;
560 const BlockNode *tr = y && x+w<b_stride ? &s->
block[index-b_stride+w] : tl;
565 if(x<0 || x>=b_stride || y>=b_height)
581 pred_mv(s, &dmx, &dmy, b->
ref, left, top, tr);
593 const int block_w = plane_index ? block_size>>s->
chroma_h_shift : block_size;
594 const int block_h = plane_index ? block_size>>s->
chroma_v_shift : block_size;
595 const int obmc_stride= plane_index ? (2*block_size)>>s->
chroma_h_shift : 2*block_size;
598 uint8_t *
src= s-> input_picture->data[plane_index];
604 const int w= p->
width;
609 int sx= block_w*mb_x - block_w/2;
610 int sy= block_h*mb_y - block_h/2;
611 int x0=
FFMAX(0,-sx);
612 int y0=
FFMAX(0,-sy);
613 int x1=
FFMIN(block_w*2, w-sx);
614 int y1=
FFMIN(block_h*2, h-sy);
619 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);
621 for(y=y0; y<y1; y++){
622 const uint8_t *obmc1= obmc_edged[
y];
624 uint8_t *cur1 = cur + y*ref_stride;
625 uint8_t *dst1 = dst + sx + (sy+
y)*ref_stride;
626 for(x=x0; x<x1; x++){
627 #if FRAC_BITS >= LOG2_OBMC_MAX
633 if(v&(~255)) v= ~(v>>31);
640 && (mb_x == 0 || mb_x == b_stride-1)
641 && (mb_y == 0 || mb_y == b_height-1)){
651 memcpy(dst + sx+x0 + (sy+y)*ref_stride, cur + x0 + y*ref_stride, x1-x0);
662 distortion =
ff_w97_32_c(&s->
m,
src + sx + sy*ref_stride, dst + sx + sy*ref_stride, ref_stride, 32);
664 distortion =
ff_w53_32_c(&s->
m,
src + sx + sy*ref_stride, dst + sx + sy*ref_stride, ref_stride, 32);
668 int off = sx+16*(i&1) + (sy+16*(i>>1))*ref_stride;
669 distortion += s->
mecc.
me_cmp[0](&s->
m,
src + off, dst + off, ref_stride, 16);
674 distortion = s->
mecc.
me_cmp[0](&s->
m,
src + sx + sy*ref_stride, dst + sx + sy*ref_stride, ref_stride, block_w*2);
683 rate +=
get_block_bits(s, mb_x + (i&1) - (i>>1), mb_y + (i>>1), 1);
685 if(mb_x == b_stride-2)
688 return distortion + rate*penalty_factor;
695 const int block_w = plane_index ? block_size>>s->
chroma_h_shift : block_size;
696 const int block_h = plane_index ? block_size>>s->
chroma_v_shift : block_size;
698 const int obmc_stride= plane_index ? (2*block_size)>>s->
chroma_h_shift : 2*block_size;
701 uint8_t *
src= s-> input_picture->data[plane_index];
706 const int w= p->
width;
715 int mb_x2= mb_x + (i%3) - 1;
716 int mb_y2= mb_y + (i/3) - 1;
717 int x= block_w*mb_x2 + block_w/2;
718 int y= block_h*mb_y2 + block_h/2;
721 x, y, block_w, block_h, w, h, 0, ref_stride, obmc_stride, mb_x2, mb_y2, 1, 1, plane_index);
724 for(y2= y; y2<0; y2++)
725 memcpy(dst + x + y2*ref_stride,
src + x + y2*ref_stride, block_w);
726 for(y2= h; y2<y+block_h; y2++)
727 memcpy(dst + x + y2*ref_stride,
src + x + y2*ref_stride, block_w);
729 for(y2= y; y2<y+block_h; y2++)
730 memcpy(dst + x + y2*ref_stride,
src + x + y2*ref_stride, -x);
733 for(y2= y; y2<y+block_h; y2++)
734 memcpy(dst + w + y2*ref_stride,
src + w + y2*ref_stride, x+block_w - w);
738 distortion += s->
mecc.
me_cmp[block_w==8](&s->
m,
src + x + y*ref_stride, dst + x + y*ref_stride, ref_stride, block_h);
752 for(i=merged?4:0; i<9; i++){
753 static const int dxy[9][2] = {{0,0},{1,0},{0,1},{1,1},{2,0},{2,1},{-1,2},{0,2},{1,2}};
757 return distortion + rate*penalty_factor;
761 const int w= b->
width;
774 int l=0, lt=0, t=0, rt=0;
778 t= src[x + (y-1)*stride];
780 lt= src[x - 1 + (y-1)*stride];
783 rt= src[x + 1 + (y-1)*stride];
796 if(px<b->parent->width && py<b->parent->height)
797 p= parent[px + py*2*
stride];
801 runs[run_index++]=
run;
809 max_index= run_index;
810 runs[run_index++]=
run;
812 run= runs[run_index++];
815 if(run_index <= max_index)
825 int l=0, lt=0, t=0, rt=0;
829 t= src[x + (y-1)*stride];
831 lt= src[x - 1 + (y-1)*stride];
834 rt= src[x + 1 + (y-1)*stride];
847 if(px<b->parent->width && py<b->parent->height)
848 p= parent[px + py*2*
stride];
856 run= runs[run_index++];
858 if(run_index <= max_index)
868 int l2= 2*
FFABS(l) + (l<0);
898 block->
color[0] = p[0];
899 block->
color[1] = p[1];
900 block->
color[2] = p[2];
930 return check_block(s, mb_x, mb_y, p, 0, obmc_edged, best_rd);
943 backup[0] = block[0];
944 backup[1] = block[1];
945 backup[2] = block[b_stride];
946 backup[3] = block[b_stride + 1];
962 block[1]= block[b_stride]= block[b_stride+1]= *
block;
973 block[b_stride]= backup[2];
974 block[b_stride+1]= backup[3];
980 int pass, mb_x, mb_y;
983 const int b_stride= b_width;
990 for(mb_y= 0; mb_y<s->
b_height; mb_y++)
991 for(mb_x= 0; mb_x<s->
b_width; mb_x++)
997 for(pass=0; pass<25; pass++){
1000 for(mb_y= 0; mb_y<b_height; mb_y++){
1001 for(mb_x= 0; mb_x<b_width; mb_x++){
1002 int dia_change, i, j, ref;
1003 int best_rd= INT_MAX, ref_rd;
1005 const int index= mb_x + mb_y * b_stride;
1014 BlockNode *brb= mb_x+1<b_width && mb_y+1<b_height ? &s->
block[index+b_stride+1] :
NULL;
1031 for (y = 0; y < b_w * 2; y++)
1034 for(y=0; y<b_w*2; y++)
1035 memset(obmc_edged[y], obmc_edged[y][0] + obmc_edged[y][b_w-1], b_w);
1036 if(mb_x==b_stride-1)
1037 for(y=0; y<b_w*2; y++)
1038 memset(obmc_edged[y]+b_w, obmc_edged[y][b_w] + obmc_edged[y][b_w*2-1], b_w);
1040 for(x=0; x<b_w*2; x++)
1041 obmc_edged[0][x] += obmc_edged[b_w-1][x];
1042 for(y=1; y<b_w; y++)
1043 memcpy(obmc_edged[y], obmc_edged[0], b_w*2);
1045 if(mb_y==b_height-1){
1046 for(x=0; x<b_w*2; x++)
1047 obmc_edged[b_w*2-1][x] += obmc_edged[b_w][x];
1048 for(y=b_w; y<b_w*2-1; y++)
1049 memcpy(obmc_edged[y], obmc_edged[b_w*2-1], b_w*2);
1054 if(mb_x==0 || mb_y==0 || mb_x==b_width-1 || mb_y==b_height-1){
1060 const int sx= block_w*mb_x - block_w/2;
1061 const int sy= block_h*mb_y - block_h/2;
1067 memcpy(dst + sx + y*stride, src + sx + y*stride, block_w*2);
1068 for(y=h; y<sy+block_h*2; y++)
1069 memcpy(dst + sx + y*stride, src + sx + y*stride, block_w*2);
1071 for(y=sy; y<sy+block_h*2; y++)
1072 memcpy(dst + sx + y*stride, src + sx + y*stride, -sx);
1074 if(sx+block_w*2 > w){
1075 for(y=sy; y<sy+block_h*2; y++)
1076 memcpy(dst + w + y*stride, src + w + y*stride, sx+block_w*2 - w);
1082 color[i]=
get_dc(s, mb_x, mb_y, i);
1087 check_block(s, mb_x, mb_y, color0, 1, obmc_edged, &best_rd);
1103 check_block_inter(s, mb_x, mb_y, mvr[-b_stride][0], mvr[-b_stride][1], obmc_edged, &best_rd);
1109 check_block_inter(s, mb_x, mb_y, mvr[b_stride][0], mvr[b_stride][1], obmc_edged, &best_rd);
1114 int newx = block->
mx;
1115 int newy = block->
my;
1119 dia_change |=
check_block_inter(s, mb_x, mb_y, newx+4*(i-j), newy+(4*j), obmc_edged, &best_rd);
1120 dia_change |=
check_block_inter(s, mb_x, mb_y, newx-4*(i-j), newy-(4*j), obmc_edged, &best_rd);
1121 dia_change |=
check_block_inter(s, mb_x, mb_y, newx-(4*j), newy+4*(i-j), obmc_edged, &best_rd);
1122 dia_change |=
check_block_inter(s, mb_x, mb_y, newx+(4*j), newy-4*(i-j), obmc_edged, &best_rd);
1128 static const int square[8][2]= {{+1, 0},{-1, 0},{ 0,+1},{ 0,-1},{+1,+1},{-1,-1},{+1,-1},{-1,+1},};
1131 dia_change |=
check_block_inter(s, mb_x, mb_y, block->
mx+square[i][0], block->
my+square[i][1], obmc_edged, &best_rd);
1135 mvr[0][0]= block->
mx;
1136 mvr[0][1]= block->
my;
1137 if(ref_rd > best_rd){
1144 check_block(s, mb_x, mb_y, color, 1, obmc_edged, &best_rd);
1166 for(mb_y= 0; mb_y<b_height; mb_y+=2){
1167 for(mb_x= 0; mb_x<b_width; mb_x+=2){
1169 int best_rd, init_rd;
1170 const int index= mb_x + mb_y * b_stride;
1175 b[2]= b[0]+b_stride;
1190 (b[0]->mx + b[1]->mx + b[2]->mx + b[3]->mx + 2) >> 2,
1191 (b[0]->my + b[1]->my + b[2]->my + b[3]->my + 2) >> 2, 0, &best_rd);
1197 if(init_rd != best_rd)
1228 const int w= b->
width;
1232 int x,
y, thres1, thres2;
1237 dst[x + y*stride]= src[x + y*stride];
1241 bias= bias ? 0 : (3*qmul)>>3;
1248 int i= src[x + y*
stride];
1250 if((
unsigned)(i+thres1) > thres2){
1268 int i= src[x + y*
stride];
1270 if((
unsigned)(i+thres1) > thres2){
1273 i= (i + bias) / qmul;
1278 i= (i + bias) / qmul;
1289 const int w= b->
width;
1300 int i= src[x + y*
stride];
1311 const int w= b->
width;
1315 for(y=h-1; y>=0; y--){
1316 for(x=w-1; x>=0; x--){
1321 if(y && x+1<w) src[i] -=
mid_pred(src[i - 1], src[i - stride], src[i - stride + 1]);
1322 else src[i] -= src[i - 1];
1324 if(y) src[i] -=
mid_pred(src[i - 1], src[i - stride], src[i - 1] + src[i - stride] - src[i - 1 - stride]);
1325 else src[i] -= src[i - 1];
1328 if(y) src[i] -= src[i -
stride];
1335 const int w= b->
width;
1345 if(y && x+1<w) src[i] +=
mid_pred(src[i - 1], src[i - stride], src[i - stride + 1]);
1346 else src[i] += src[i - 1];
1348 if(y) src[i] +=
mid_pred(src[i - 1], src[i - stride], src[i - 1] + src[i - stride] - src[i - 1 - stride]);
1349 else src[i] += src[i - 1];
1352 if(y) src[i] += src[i -
stride];
1359 int plane_index,
level, orientation;
1361 for(plane_index=0; plane_index<
FFMIN(s->
nb_planes, 2); plane_index++){
1363 for(orientation=level ? 1:0; orientation<4; orientation++){
1364 if(orientation==2)
continue;
1375 memset(kstate,
MID_STATE,
sizeof(kstate));
1385 for(plane_index=0; plane_index<2; plane_index++){
1412 for(plane_index=0; plane_index<
FFMIN(s->
nb_planes, 2); plane_index++){
1420 for(plane_index=0; plane_index<
FFMIN(s->
nb_planes, 2); plane_index++){
1424 for(i= p->
htaps/2; i; i--)
1448 for(plane_index=0; plane_index<2; plane_index++){
1474 uint32_t coef_sum= 0;
1475 int level, orientation, delta_qlog;
1478 for(orientation=level ? 1 : 0; orientation<4; orientation++){
1481 const int w= b->
width;
1483 const int stride= b->
stride;
1486 const int qdiv= (1<<16)/qmul;
1491 buf[x+y*stride]= b->
buf[x+y*stride];
1496 coef_sum+= abs(buf[x+y*stride]) * qdiv >> 16;
1502 coef_sum = (uint64_t)coef_sum * coef_sum >> 16;
1517 s->
qlog+= delta_qlog;
1524 int level, orientation, x,
y;
1527 for(orientation=level ? 1 : 0; orientation<4; orientation++){
1536 for(x=0; x<
width; x++){
1542 b->
qlog= (int)(log(352256.0/sqrt(error)) / log(pow(2.0, 1.0/
QROOT))+0.5);
1548 const AVFrame *pict,
int *got_packet)
1555 int level, orientation, plane_index, i,
y,
ret;
1571 FF_CEIL_RSHIFT(width, hshift));
1633 int block_width = (width +15)>>4;
1634 int block_height= (height+15)>>4;
1643 s->
m. last_picture_ptr= &s->
m. last_picture;
1697 for(plane_index=0; plane_index < s->
nb_planes; plane_index++){
1707 for(plane_index=0; plane_index < s->nb_planes; plane_index++){
1716 if(pict->
data[plane_index])
1754 if (delta_qlog <= INT_MIN)
1767 for(orientation=level ? 1 : 0; orientation<4; orientation++){
1782 for(orientation=level ? 1 : 0; orientation<4; orientation++){
1804 pict->
data[plane_index][y*pict->
linesize[plane_index] + x];
1815 if(pict->
data[plane_index])
1875 #define OFFSET(x) offsetof(SnowContext, x)
1876 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
1879 {
"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 },
1880 {
"no_bitstream",
"Skip final bitstream writeout.",
OFFSET(no_bitstream),
AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1,
VE },
1881 {
"intra_penalty",
"Penalty for intra blocks in block decission",
OFFSET(intra_penalty),
AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX,
VE },
1934 fprintf(stderr,
"Failed to allocate memory\n");
1940 printf(
"testing 5/3 DWT\n");
1942 buffer[0][i] = buffer[1][i] =
av_lfg_get(&prng) % 54321 - 12345;
1948 if(buffer[0][i]!= buffer[1][i]) printf(
"fsck: %6d %12d %7d\n",i, buffer[0][i], buffer[1][i]);
1950 printf(
"testing 9/7 DWT\n");
1953 buffer[0][i] = buffer[1][i] =
av_lfg_get(&prng) % 54321 - 12345;
1959 if(
FFABS(buffer[0][i] - buffer[1][i])>20) printf(
"fsck: %6d %12d %7d\n",i, buffer[0][i], buffer[1][i]);
1962 int level, orientation, x,
y;
1963 int64_t errors[8][4];
1966 memset(errors, 0,
sizeof(errors));
1970 for(orientation=level ? 1 : 0; orientation<4; orientation++){
1977 if(orientation&1) buf+=w;
1978 if(orientation>1) buf+=stride>>1;
1980 memset(buffer[0], 0,
sizeof(
int)*
width*height);
1981 buf[w/2 + h/2*
stride]= 256*256;
1984 for(x=0; x<
width; x++){
1985 int64_t d= buffer[0][x + y*
width];
1987 if(
FFABS(width/2-x)<9 &&
FFABS(height/2-y)<9 && level==2) printf(
"%8"PRId64
" ", d);
1989 if(
FFABS(height/2-y)<9 && level==2) printf(
"\n");
1991 error= (int)(sqrt(error)+0.5);
1992 errors[
level][orientation]= error;
1993 if(g) g=
av_gcd(g, error);
1997 printf(
"static int const visual_weight[][4]={\n");
2000 for(orientation=0; orientation<4; orientation++){
2001 printf(
"%8"PRId64
",", errors[level][orientation]/g);
2017 memset(buffer[0], 0,
sizeof(
int)*width*height);
2019 for(x=0; x<
width; x++){
2020 int tab[4]={0,2,3,1};
2021 buffer[0][x+width*
y]= 256*256*tab[(x&1) + 2*(y&1)];
2026 for(x=0; x<
width; x++){
2027 int64_t d= buffer[0][x + y*
width];
2029 if(
FFABS(width/2-x)<9 &&
FFABS(height/2-y)<9) printf(
"%8"PRId64
" ", d);
2031 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
int ff_alloc_packet2(AVCodecContext *avctx, AVPacket *avpkt, int64_t size)
Check AVPacket size and/or allocate data.
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)
uint64_t error[AV_NUM_DATA_POINTERS]
error
#define CODEC_FLAG_PASS2
Use internal 2pass ratecontrol in second pass mode.
planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples)
#define LIBAVUTIL_VERSION_INT
#define CODEC_FLAG_PASS1
Use internal 2pass ratecontrol in first pass mode.
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)
AVFrame * coded_frame
the picture in the bitstream
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)
#define CODEC_FLAG_QPEL
Use qpel MC.
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)
#define CODEC_FLAG_PSNR
error[?] variables will be set during encoding.
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
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]
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]
static int get_dc(SnowContext *s, int mb_x, int mb_y, int plane_index)
#define CODEC_FLAG_QSCALE
Use fixed 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.
int display_picture_number
picture number in display order
#define FF_MIN_BUFFER_SIZE
minimum encoding buffer size Used to avoid some checks during header writing.
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)
static int encode_q_branch(SnowContext *s, int level, int x, int y)
float ff_rate_estimate_qscale(MpegEncContext *s, int dry_run)
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)
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 f_code
forward MV resolution
int pict_type
AV_PICTURE_TYPE_I, AV_PICTURE_TYPE_P, AV_PICTURE_TYPE_B, ...
int bit_rate
wanted bit rate
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)
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)
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
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
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
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.
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)
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 me_method
Motion estimation algorithm used for video coding.
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
#define CODEC_FLAG_4MV
4 MV per MB allowed / advanced prediction for H.263.
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)