66#define ME_CACHE_SIZE 1024
77#define PTR_ADD(ptr, off) ((ptr) ? (ptr) + (off) : NULL)
80 uint8_t *
const ref[3], uint8_t *
const ref2[3],
81 int x,
int y,
int ref_index)
86 ((y*
c->uvstride + x) >>
s->chroma_h_shift),
87 ((y*
c->uvstride + x) >>
s->chroma_h_shift),
89 for (
int i = 0;
i < 3;
i++) {
101 const int el =
FFMIN(e, 10);
106 for (
i = 0;
i < el;
i++)
112 for (
i = e - 1;
i >= el;
i--)
139 for (
int i =
log2 - 1;
i >= 0;
i--)
153 for (
int i = 0;
frame->data[
i];
i++) {
159 frame->width =
s->avctx->width;
160 frame->height =
s->avctx->height;
170 int plane_index, ret;
180 s->spatial_decomposition_type = enc->
pred;
185 for(plane_index=0; plane_index<3; plane_index++){
186 s->plane[plane_index].diag_mc= 1;
187 s->plane[plane_index].htaps= 6;
188 s->plane[plane_index].hcoeff[0]= 40;
189 s->plane[plane_index].hcoeff[1]= -10;
190 s->plane[plane_index].hcoeff[2]= 2;
191 s->plane[plane_index].fast_mc= 1;
201 enc->qdsp.put_qpel_pixels_tab [0][dy+dx/4]=\
202 enc->qdsp.put_no_rnd_qpel_pixels_tab[0][dy+dx/4]=\
203 s->h264qpel.put_h264_qpel_pixels_tab[0][dy+dx/4];\
204 enc->qdsp.put_qpel_pixels_tab [1][dy+dx/4]=\
205 enc->qdsp.put_no_rnd_qpel_pixels_tab[1][dy+dx/4]=\
206 s->h264qpel.put_h264_qpel_pixels_tab[1][dy+dx/4];
271 s->colorspace_type= 0;
275 s->colorspace_type = 1;
288 if (!
s->input_picture)
299 int size=
s->b_width *
s->b_height << 2*
s->block_max_depth;
300 for(
i=0;
i<
s->max_ref_frames;
i++){
303 if (!
s->ref_mvs[
i] || !
s->ref_scores[
i])
317 for (
i = 0;
i <
h;
i++) {
318 for (j = 0; j <
w; j++) {
322 pix += line_size -
w;
334 for (
i = 0;
i <
w;
i++) {
335 for (j = 0; j <
w; j ++) {
339 pix += line_size -
w;
371#define P_TOPRIGHT P[3]
380 uint8_t p_buffer[1024];
381 uint8_t i_buffer[1024];
382 uint8_t p_state[
sizeof(
s->block_state)];
383 uint8_t i_state[
sizeof(
s->block_state)];
385 uint8_t *pbbak=
s->c.bytestream;
386 uint8_t *pbbak_start=
s->c.bytestream_start;
387 int score, score2, iscore, i_len, p_len, block_s, sum, base_bits;
388 const int w=
s->b_width <<
s->block_max_depth;
389 const int h=
s->b_height <<
s->block_max_depth;
390 const int rem_depth=
s->block_max_depth -
level;
391 const int index= (x + y*
w) << rem_depth;
393 int trx= (x+1)<<rem_depth;
394 int try= (y+1)<<rem_depth;
401 int pl =
left->color[0];
402 int pcb=
left->color[1];
403 int pcr=
left->color[2];
407 const int stride=
s->current_picture->linesize[0];
408 const int uvstride=
s->current_picture->linesize[1];
409 const uint8_t *
const current_data[3] = {
s->input_picture->data[0] + (x + y*
stride)*block_w,
410 PTR_ADD(
s->input_picture->data[1], ((x*block_w)>>
s->chroma_h_shift) + ((y*uvstride*block_w)>>
s->chroma_v_shift)),
411 PTR_ADD(
s->input_picture->data[2], ((x*block_w)>>
s->chroma_h_shift) + ((y*uvstride*block_w)>>
s->chroma_v_shift))};
413 int16_t last_mv[3][2];
415 const int shift= 1+qpel;
420 int ref, best_ref, ref_score, ref_mx, ref_my;
425 set_blocks(
s,
level, x, y, pl, pcb, pcr, 0, 0, 0,
BLOCK_INTRA);
438 last_mv[0][0]=
s->block[
index].mx;
439 last_mv[0][1]=
s->block[
index].my;
440 last_mv[1][0]= right->
mx;
441 last_mv[1][1]= right->
my;
442 last_mv[2][0]= bottom->
mx;
443 last_mv[2][1]= bottom->
my;
458 c->xmin = - x*block_w - 16+3;
459 c->ymin = - y*block_w - 16+3;
460 c->xmax = - (x+1)*block_w + (
w<<(
LOG2_MB_SIZE -
s->block_max_depth)) + 16-3;
461 c->ymax = - (y+1)*block_w + (
h<<(
LOG2_MB_SIZE -
s->block_max_depth)) + 16-3;
490 init_ref(
c, current_data,
s->last_picture[
ref]->data,
NULL, block_w*x, block_w*y, 0);
500 ref_score =
c->sub_motion_search(&enc->
m.
s, &ref_mx, &ref_my, ref_score,
510 if(score > ref_score){
520 base_bits=
get_rac_count(&
s->c) - 8*(
s->c.bytestream -
s->c.bytestream_start);
523 pc.bytestream= p_buffer;
524 memcpy(p_state,
s->block_state,
sizeof(
s->block_state));
526 if(
level!=
s->block_max_depth)
527 put_rac(&pc, &p_state[4 + s_context], 1);
529 if(
s->ref_frames > 1)
530 put_symbol(&pc, &p_state[128 + 1024 + 32*ref_context], best_ref, 0);
532 put_symbol(&pc, &p_state[128 + 32*(mx_context + 16*!!best_ref)],
mx - pmx, 1);
533 put_symbol(&pc, &p_state[128 + 32*(my_context + 16*!!best_ref)],
my - pmy, 1);
534 p_len= pc.bytestream - pc.bytestream_start;
537 block_s= block_w*block_w;
539 l= (sum + block_s/2)/block_s;
540 iscore =
pix_norm1(current_data[0],
stride, block_w) - 2*l*sum + l*l*block_s;
542 if (
s->nb_planes > 2) {
543 block_s= block_w*block_w>>(
s->chroma_h_shift +
s->chroma_v_shift);
544 sum =
pix_sum(current_data[1], uvstride, block_w>>
s->chroma_h_shift, block_w>>
s->chroma_v_shift);
545 cb= (sum + block_s/2)/block_s;
547 sum =
pix_sum(current_data[2], uvstride, block_w>>
s->chroma_h_shift, block_w>>
s->chroma_v_shift);
548 cr= (sum + block_s/2)/block_s;
555 ic.bytestream= i_buffer;
556 memcpy(i_state,
s->block_state,
sizeof(
s->block_state));
557 if(
level!=
s->block_max_depth)
558 put_rac(&ic, &i_state[4 + s_context], 1);
561 if (
s->nb_planes > 2) {
565 i_len= ic.bytestream - ic.bytestream_start;
568 av_assert1(iscore < 255*255*256 + enc->lambda2*10);
574 int varc= iscore >> 8;
575 int vard= score >> 8;
576 if (vard <= 64 || vard < varc)
582 if(
level!=
s->block_max_depth){
583 put_rac(&
s->c, &
s->block_state[4 + s_context], 0);
590 if(score2 < score && score2 < iscore)
596 memcpy(pbbak, i_buffer, i_len);
598 s->c.bytestream_start= pbbak_start;
599 s->c.bytestream= pbbak + i_len;
600 set_blocks(
s,
level, x, y, l,
cb,
cr, pmx, pmy, 0,
BLOCK_INTRA);
601 memcpy(
s->block_state, i_state,
sizeof(
s->block_state));
604 memcpy(pbbak, p_buffer, p_len);
606 s->c.bytestream_start= pbbak_start;
607 s->c.bytestream= pbbak + p_len;
608 set_blocks(
s,
level, x, y, pl, pcb, pcr,
mx,
my, best_ref, 0);
609 memcpy(
s->block_state, p_state,
sizeof(
s->block_state));
615 const int w=
s->b_width <<
s->block_max_depth;
616 const int rem_depth=
s->block_max_depth -
level;
617 const int index= (x + y*
w) << rem_depth;
618 int trx= (x+1)<<rem_depth;
624 int pl =
left->color[0];
625 int pcb=
left->color[1];
626 int pcr=
left->color[2];
634 set_blocks(
s,
level, x, y, pl, pcb, pcr, 0, 0, 0,
BLOCK_INTRA);
638 if(
level!=
s->block_max_depth){
640 put_rac(&
s->c, &
s->block_state[4 + s_context], 1);
642 put_rac(&
s->c, &
s->block_state[4 + s_context], 0);
654 if (
s->nb_planes > 2) {
658 set_blocks(
s,
level, x, y,
b->color[0],
b->color[1],
b->color[2], pmx, pmy, 0,
BLOCK_INTRA);
662 if(
s->ref_frames > 1)
663 put_symbol(&
s->c, &
s->block_state[128 + 1024 + 32*ref_context],
b->ref, 0);
664 put_symbol(&
s->c, &
s->block_state[128 + 32*mx_context],
b->mx - pmx, 1);
665 put_symbol(&
s->c, &
s->block_state[128 + 32*my_context],
b->my - pmy, 1);
666 set_blocks(
s,
level, x, y, pl, pcb, pcr,
b->mx,
b->my,
b->ref, 0);
674 Plane *p= &
s->plane[plane_index];
675 const int block_size =
MB_SIZE >>
s->block_max_depth;
676 const int block_w = plane_index ? block_size>>
s->chroma_h_shift : block_size;
677 const int block_h = plane_index ? block_size>>
s->chroma_v_shift : block_size;
679 const int obmc_stride= plane_index ? (2*block_size)>>
s->chroma_h_shift : 2*block_size;
680 const int ref_stride=
s->current_picture->linesize[plane_index];
681 const uint8_t *
src =
s->input_picture->data[plane_index];
683 const int b_stride =
s->b_width <<
s->block_max_depth;
684 const int w= p->width;
685 const int h= p->height;
686 int index= mb_x + mb_y*b_stride;
695 b->color[plane_index]= 0;
696 memset(
dst, 0, obmc_stride*obmc_stride*
sizeof(
IDWTELEM));
699 int mb_x2= mb_x + (
i &1) - 1;
700 int mb_y2= mb_y + (
i>>1) - 1;
701 int x= block_w*mb_x2 + block_w/2;
702 int y= block_h*mb_y2 + block_h/2;
705 x, y, block_w, block_h,
w,
h, obmc_stride, ref_stride, obmc_stride, mb_x2, mb_y2, 0, 0, plane_index);
707 for(y2=
FFMAX(y, 0); y2<
FFMIN(
h, y+block_h); y2++){
708 for(x2=
FFMAX(x, 0); x2<
FFMIN(
w, x+block_w); x2++){
709 int col= x2-(block_w*mb_x - block_w/2);
710 int row= y2-(block_h*mb_y - block_h/2);
711 int index= col + row*obmc_stride;
712 int obmc_v= obmc[
index];
714 if(y<0) obmc_v += obmc[
index + block_h*obmc_stride];
715 if(x<0) obmc_v += obmc[
index + block_w];
716 if(y+block_h>
h && row-block_h >= 0) obmc_v += obmc[
index - block_h*obmc_stride];
717 if(x+block_w>
w && col-block_w >= 0) obmc_v += obmc[
index - block_w];
722 ab += (
src[x2 + y2*ref_stride] - (d>>
FRAC_BITS)) * obmc_v;
723 aa += obmc_v * obmc_v;
736 const int b_stride =
s->b_width <<
s->block_max_depth;
737 const int b_height =
s->b_height<<
s->block_max_depth;
738 int index= x + y*b_stride;
748 if(x<0 || x>=b_stride || y>=b_height)
774 int plane_index, uint8_t (*obmc_edged)[
MB_SIZE * 2])
777 Plane *p= &
s->plane[plane_index];
778 const int block_size =
MB_SIZE >>
s->block_max_depth;
779 const int block_w = plane_index ? block_size>>
s->chroma_h_shift : block_size;
780 const int block_h = plane_index ? block_size>>
s->chroma_v_shift : block_size;
781 const int obmc_stride= plane_index ? (2*block_size)>>
s->chroma_h_shift : 2*block_size;
782 const int ref_stride=
s->current_picture->linesize[plane_index];
783 uint8_t *
dst=
s->current_picture->data[plane_index];
784 const uint8_t *
src =
s->input_picture->data[plane_index];
786 uint8_t *cur =
s->scratchbuf;
788 const int b_stride =
s->b_width <<
s->block_max_depth;
789 const int b_height =
s->b_height<<
s->block_max_depth;
790 const int w= p->width;
791 const int h= p->height;
795 int sx= block_w*mb_x - block_w/2;
796 int sy= block_h*mb_y - block_h/2;
797 int x0=
FFMAX(0,-sx);
798 int y0=
FFMAX(0,-sy);
799 int x1=
FFMIN(block_w*2,
w-sx);
800 int y1=
FFMIN(block_h*2,
h-sy);
805 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);
807 for(y=y0; y<y1; y++){
808 const uint8_t *obmc1= obmc_edged[y];
810 uint8_t *cur1 = cur + y*ref_stride;
811 uint8_t *dst1 =
dst + sx + (sy+y)*ref_stride;
812 for(x=x0; x<x1; x++){
813#if FRAC_BITS >= LOG2_OBMC_MAX
819 if(v&(~255)) v= ~(v>>31);
825 if ((mb_x == 0 || mb_x == b_stride-1) &&
826 (mb_y == 0 || mb_y == b_height-1)){
828 x1 =
FFMIN(x1, block_w);
830 x0 =
FFMAX(x0, block_w);
832 y1 =
FFMIN(y1, block_h);
834 y0 =
FFMAX(y0, block_h);
837 memcpy(
dst + sx+x0 + (sy+y)*ref_stride, cur + x0 + y*ref_stride, x1-x0);
848 distortion =
ff_w97_32_c(&enc->
m.
s,
src + sx + sy*ref_stride,
dst + sx + sy*ref_stride, ref_stride, 32);
850 distortion =
ff_w53_32_c(&enc->
m.
s,
src + sx + sy*ref_stride,
dst + sx + sy*ref_stride, ref_stride, 32);
854 int off = sx+16*(
i&1) + (sy+16*(
i>>1))*ref_stride;
860 distortion = enc->
m.
s.
me.
me_cmp[0](&enc->
m.
s,
src + sx + sy*ref_stride,
dst + sx + sy*ref_stride, ref_stride, block_w*2);
871 if(mb_x == b_stride-2)
874 return distortion + rate*penalty_factor;
881 Plane *p= &
s->plane[plane_index];
882 const int block_size =
MB_SIZE >>
s->block_max_depth;
883 const int block_w = plane_index ? block_size>>
s->chroma_h_shift : block_size;
884 const int block_h = plane_index ? block_size>>
s->chroma_v_shift : block_size;
886 const int obmc_stride= plane_index ? (2*block_size)>>
s->chroma_h_shift : 2*block_size;
887 const int ref_stride=
s->current_picture->linesize[plane_index];
888 uint8_t *
dst=
s->current_picture->data[plane_index];
889 const uint8_t *
src =
s->input_picture->data[plane_index];
893 const int b_stride =
s->b_width <<
s->block_max_depth;
894 const int w= p->width;
895 const int h= p->height;
903 int mb_x2= mb_x + (
i%3) - 1;
904 int mb_y2= mb_y + (
i/3) - 1;
905 int x= block_w*mb_x2 + block_w/2;
906 int y= block_h*mb_y2 + block_h/2;
909 x, y, block_w, block_h,
w,
h, 0, ref_stride, obmc_stride, mb_x2, mb_y2, 1, 1, plane_index);
912 for(y2= y; y2<0; y2++)
913 memcpy(
dst + x + y2*ref_stride,
src + x + y2*ref_stride, block_w);
914 for(y2=
h; y2<y+block_h; y2++)
915 memcpy(
dst + x + y2*ref_stride,
src + x + y2*ref_stride, block_w);
917 for(y2= y; y2<y+block_h; y2++)
918 memcpy(
dst + x + y2*ref_stride,
src + x + y2*ref_stride, -x);
921 for(y2= y; y2<y+block_h; y2++)
922 memcpy(
dst +
w + y2*ref_stride,
src +
w + y2*ref_stride, x+block_w -
w);
926 distortion += enc->
m.
s.
me.
me_cmp[block_w==8](&enc->
m.
s,
src + x + y*ref_stride,
dst + x + y*ref_stride, ref_stride, block_h);
940 for(
i=merged?4:0;
i<9;
i++){
941 static const int dxy[9][2] = {{0,0},{1,0},{0,1},{1,1},{2,0},{2,1},{-1,2},{0,2},{1,2}};
945 return distortion + rate*penalty_factor;
949 const int w=
b->width;
950 const int h=
b->height;
955 int *runs =
s->run_buffer;
962 int l=0, lt=0, t=0, rt=0;
984 if(px<b->parent->width && py<b->parent->height)
985 p= parent[px + py*2*
stride];
989 runs[run_index++]=
run;
997 max_index= run_index;
998 runs[run_index++]=
run;
1000 run= runs[run_index++];
1003 if(run_index <= max_index)
1007 if(
s->c.bytestream_end -
s->c.bytestream <
w*40){
1013 int l=0, lt=0, t=0, rt=0;
1035 if(px<b->parent->width && py<b->parent->height)
1036 p= parent[px + py*2*
stride];
1041 put_rac(&
s->c, &
b->state[0][context], !!v);
1044 run= runs[run_index++];
1046 if(run_index <= max_index)
1056 int l2= 2*
FFABS(l) + (l<0);
1057 int t2= 2*
FFABS(t) + (t<0);
1076 uint8_t (*obmc_edged)[
MB_SIZE * 2],
int *best_rd)
1079 const int b_stride=
s->b_width <<
s->block_max_depth;
1087 block->color[0] = p[0];
1088 block->color[1] = p[1];
1089 block->color[2] = p[2];
1107 int mb_x,
int mb_y,
int p0,
int p1,
1108 uint8_t (*obmc_edged)[
MB_SIZE * 2],
int *best_rd)
1111 const int b_stride =
s->b_width <<
s->block_max_depth;
1133 if (rd < *best_rd) {
1143 int p0,
int p1,
int ref,
int *best_rd)
1146 const int b_stride=
s->b_width <<
s->block_max_depth;
1155 backup[0] =
block[0];
1156 backup[1] =
block[1];
1157 backup[2] =
block[b_stride];
1158 backup[3] =
block[b_stride + 1];
1183 block[0]= backup[0];
1184 block[1]= backup[1];
1185 block[b_stride]= backup[2];
1186 block[b_stride+1]= backup[3];
1194 int pass, mb_x, mb_y;
1195 const int b_width =
s->b_width <<
s->block_max_depth;
1196 const int b_height=
s->b_height <<
s->block_max_depth;
1197 const int b_stride= b_width;
1202 uint8_t
state[
sizeof(
s->block_state)];
1203 memcpy(
state,
s->block_state,
sizeof(
s->block_state));
1204 for(mb_y= 0; mb_y<
s->b_height; mb_y++)
1205 for(mb_x= 0; mb_x<
s->b_width; mb_x++)
1208 memcpy(
s->block_state,
state,
sizeof(
s->block_state));
1211 for(pass=0; pass<25; pass++){
1214 for(mb_y= 0; mb_y<b_height; mb_y++){
1215 for(mb_x= 0; mb_x<b_width; mb_x++){
1216 int dia_change,
i, j,
ref;
1217 int best_rd= INT_MAX, ref_rd;
1219 const int index= mb_x + mb_y * b_stride;
1229 const int b_w= (
MB_SIZE >>
s->block_max_depth);
1245 for (y = 0; y < b_w * 2; y++)
1246 memcpy(obmc_edged[y],
ff_obmc_tab[
s->block_max_depth] + y * b_w * 2, b_w * 2);
1248 for(y=0; y<b_w*2; y++)
1249 memset(obmc_edged[y], obmc_edged[y][0] + obmc_edged[y][b_w-1], b_w);
1250 if(mb_x==b_stride-1)
1251 for(y=0; y<b_w*2; y++)
1252 memset(obmc_edged[y]+b_w, obmc_edged[y][b_w] + obmc_edged[y][b_w*2-1], b_w);
1254 for(x=0; x<b_w*2; x++)
1255 obmc_edged[0][x] += obmc_edged[b_w-1][x];
1256 for(y=1; y<b_w; y++)
1257 memcpy(obmc_edged[y], obmc_edged[0], b_w*2);
1259 if(mb_y==b_height-1){
1260 for(x=0; x<b_w*2; x++)
1261 obmc_edged[b_w*2-1][x] += obmc_edged[b_w][x];
1262 for(y=b_w; y<b_w*2-1; y++)
1263 memcpy(obmc_edged[y], obmc_edged[b_w*2-1], b_w*2);
1268 if(mb_x==0 || mb_y==0 || mb_x==b_width-1 || mb_y==b_height-1){
1269 const uint8_t *
src =
s->input_picture->data[0];
1270 uint8_t *
dst=
s->current_picture->data[0];
1271 const int stride=
s->current_picture->linesize[0];
1272 const int block_w=
MB_SIZE >>
s->block_max_depth;
1273 const int block_h=
MB_SIZE >>
s->block_max_depth;
1274 const int sx= block_w*mb_x - block_w/2;
1275 const int sy= block_h*mb_y - block_h/2;
1276 const int w=
s->plane[0].width;
1277 const int h=
s->plane[0].height;
1282 for(y=
h; y<sy+block_h*2; y++)
1285 for(y=sy; y<sy+block_h*2; y++)
1288 if(sx+block_w*2 >
w){
1289 for(y=sy; y<sy+block_h*2; y++)
1295 for(
i=0;
i <
s->nb_planes;
i++)
1308 int16_t (*mvr)[2]= &
s->ref_mvs[
ref][
index];
1317 check_block_inter(enc, mb_x, mb_y, mvr[-b_stride][0], mvr[-b_stride][1], obmc_edged, &best_rd);
1319 check_block_inter(enc, mb_x, mb_y, mvr[-1][0], mvr[-1][1], obmc_edged, &best_rd);
1323 check_block_inter(enc, mb_x, mb_y, mvr[b_stride][0], mvr[b_stride][1], obmc_edged, &best_rd);
1328 int newx =
block->mx;
1329 int newy =
block->my;
1332 for(
i=0;
i < dia_size;
i++){
1334 dia_change |=
check_block_inter(enc, mb_x, mb_y, newx+4*(
i-j), newy+(4*j), obmc_edged, &best_rd);
1335 dia_change |=
check_block_inter(enc, mb_x, mb_y, newx-4*(
i-j), newy-(4*j), obmc_edged, &best_rd);
1336 dia_change |=
check_block_inter(enc, mb_x, mb_y, newx-(4*j), newy+4*(
i-j), obmc_edged, &best_rd);
1337 dia_change |=
check_block_inter(enc, mb_x, mb_y, newx+(4*j), newy-4*(
i-j), obmc_edged, &best_rd);
1343 static const int square[8][2]= {{+1, 0},{-1, 0},{ 0,+1},{ 0,-1},{+1,+1},{-1,-1},{+1,-1},{-1,+1},};
1350 mvr[0][0]=
block->mx;
1351 mvr[0][1]=
block->my;
1352 if(ref_rd > best_rd){
1379 if(
s->block_max_depth == 1){
1381 for(mb_y= 0; mb_y<b_height; mb_y+=2){
1382 for(mb_x= 0; mb_x<b_width; mb_x+=2){
1384 int best_rd, init_rd;
1385 const int index= mb_x + mb_y * b_stride;
1390 b[2]=
b[0]+b_stride;
1406 (
b[0]->
my +
b[1]->
my +
b[2]->
my +
b[3]->
my + 2) >> 2, 0, &best_rd);
1412 if(init_rd != best_rd)
1445 const int w=
b->width;
1446 const int h=
b->height;
1449 int x,y, thres1, thres2;
1467 if((
unsigned)(
i+thres1) > thres2){
1487 if((
unsigned)(
i+thres1) > thres2){
1506 const int w=
b->width;
1507 const int h=
b->height;
1528 const int w=
b->width;
1529 const int h=
b->height;
1532 for(y=
h-1; y>=0; y--){
1533 for(x=
w-1; x>=0; x--){
1552 const int w=
b->width;
1553 const int h=
b->height;
1576 int plane_index,
level, orientation;
1578 for(plane_index=0; plane_index<
FFMIN(
s->nb_planes, 2); plane_index++){
1580 for(orientation=
level ? 1:0; orientation<4; orientation++){
1581 if(orientation==2)
continue;
1582 put_symbol(&
s->c,
s->header_state,
s->plane[plane_index].band[
level][orientation].qlog, 1);
1592 memset(kstate,
MID_STATE,
sizeof(kstate));
1595 if(
s->keyframe ||
s->always_reset){
1597 s->last_spatial_decomposition_type=
1601 s->last_block_max_depth= 0;
1602 for(plane_index=0; plane_index<2; plane_index++){
1603 Plane *p= &
s->plane[plane_index];
1606 memset(p->last_hcoeff, 0,
sizeof(p->last_hcoeff));
1611 put_rac(&
s->c,
s->header_state,
s->always_reset);
1612 put_symbol(&
s->c,
s->header_state,
s->temporal_decomposition_type, 0);
1613 put_symbol(&
s->c,
s->header_state,
s->temporal_decomposition_count, 0);
1614 put_symbol(&
s->c,
s->header_state,
s->spatial_decomposition_count, 0);
1616 if (
s->nb_planes > 2) {
1620 put_rac(&
s->c,
s->header_state,
s->spatial_scalability);
1629 for(plane_index=0; plane_index<
FFMIN(
s->nb_planes, 2); plane_index++){
1630 Plane *p= &
s->plane[plane_index];
1631 update_mc |= p->last_htaps != p->htaps;
1632 update_mc |= p->last_diag_mc != p->diag_mc;
1633 update_mc |= !!memcmp(p->last_hcoeff, p->hcoeff,
sizeof(p->hcoeff));
1635 put_rac(&
s->c,
s->header_state, update_mc);
1637 for(plane_index=0; plane_index<
FFMIN(
s->nb_planes, 2); plane_index++){
1638 Plane *p= &
s->plane[plane_index];
1639 put_rac(&
s->c,
s->header_state, p->diag_mc);
1641 for(
i= p->htaps/2;
i;
i--)
1645 if(
s->last_spatial_decomposition_count !=
s->spatial_decomposition_count){
1647 put_symbol(&
s->c,
s->header_state,
s->spatial_decomposition_count, 0);
1653 put_symbol(&
s->c,
s->header_state,
s->spatial_decomposition_type -
s->last_spatial_decomposition_type, 1);
1655 put_symbol(&
s->c,
s->header_state,
s->mv_scale -
s->last_mv_scale, 1);
1656 put_symbol(&
s->c,
s->header_state,
s->qbias -
s->last_qbias , 1);
1657 put_symbol(&
s->c,
s->header_state,
s->block_max_depth -
s->last_block_max_depth, 1);
1665 for(plane_index=0; plane_index<2; plane_index++){
1666 Plane *p= &
s->plane[plane_index];
1667 p->last_diag_mc= p->diag_mc;
1668 p->last_htaps = p->htaps;
1669 memcpy(p->last_hcoeff, p->hcoeff,
sizeof(p->hcoeff));
1673 s->last_spatial_decomposition_type =
s->spatial_decomposition_type;
1674 s->last_qlog =
s->qlog;
1675 s->last_qbias =
s->qbias;
1676 s->last_mv_scale =
s->mv_scale;
1677 s->last_block_max_depth =
s->block_max_depth;
1678 s->last_spatial_decomposition_count =
s->spatial_decomposition_count;
1692 uint32_t coef_sum= 0;
1693 int level, orientation, delta_qlog;
1696 for(orientation=
level ? 1 : 0; orientation<4; orientation++){
1699 const int w=
b->width;
1700 const int h=
b->height;
1704 const int qdiv= (1<<16)/qmul;
1714 coef_sum+=
abs(buf[x+y*
stride]) * qdiv >> 16;
1721 coef_sum = (uint64_t)coef_sum * coef_sum >> 16;
1736 s->qlog+= delta_qlog;
1741 int width = p->width;
1743 int level, orientation, x, y;
1747 for(orientation=
level ? 1 : 0; orientation<4; orientation++){
1751 memset(
s->spatial_idwt_buffer, 0,
sizeof(*
s->spatial_idwt_buffer)*
width*
height);
1752 ibuf[
b->width/2 +
b->height/2*
b->stride]= 256*16;
1755 for(x=0; x<
width; x++){
1760 if (orientation == 2)
1763 if (orientation != 1)
1766 p->band[
level][1].qlog = p->band[
level][2].qlog;
1771 const AVFrame *pict,
int *got_packet)
1779 const int width=
s->avctx->width;
1780 const int height=
s->avctx->height;
1781 int level, orientation, plane_index,
i, y, ret;
1782 uint8_t rc_header_bak[
sizeof(
s->header_state)];
1783 uint8_t rc_block_bak[
sizeof(
s->block_state)];
1791 for(
i=0;
i <
s->nb_planes;
i++){
1792 int hshift=
i ?
s->chroma_h_shift : 0;
1793 int vshift=
i ?
s->chroma_v_shift : 0;
1795 memcpy(&
s->input_picture->data[
i][y *
s->input_picture->linesize[
i]],
1804 pic =
s->input_picture;
1833 if (
s->current_picture->data[0]) {
1834 int w =
s->avctx->width;
1835 int h =
s->avctx->height;
1838 s->current_picture->linesize[0],
w ,
h ,
1840 if (
s->current_picture->data[2]) {
1859 int block_width = (
width +15)>>4;
1860 int block_height= (
height+15)>>4;
1861 int stride=
s->current_picture->linesize[0];
1869 mpv-> new_pic =
s->input_picture;
1897 memcpy(rc_header_bak,
s->header_state,
sizeof(
s->header_state));
1898 memcpy(rc_block_bak,
s->block_state,
sizeof(
s->block_state));
1903 s->spatial_decomposition_count= 5;
1905 while( !(
width >>(
s->chroma_h_shift +
s->spatial_decomposition_count))
1906 || !(
height>>(
s->chroma_v_shift +
s->spatial_decomposition_count)))
1907 s->spatial_decomposition_count--;
1909 if (
s->spatial_decomposition_count <= 0) {
1919 if(
s->last_spatial_decomposition_count !=
s->spatial_decomposition_count){
1920 for(plane_index=0; plane_index <
s->nb_planes; plane_index++){
1926 mpv->
misc_bits = 8 * (
s->c.bytestream -
s->c.bytestream_start);
1930 for(plane_index=0; plane_index <
s->nb_planes; plane_index++){
1931 Plane *p= &
s->plane[plane_index];
1939 if(pict->
data[plane_index])
1974 ff_spatial_dwt(
s->spatial_dwt_buffer,
s->temp_dwt_buffer,
w,
h,
w,
s->spatial_decomposition_type,
s->spatial_decomposition_count);
1976 if (enc->
pass1_rc && plane_index==0) {
1978 if (delta_qlog <= INT_MIN)
1983 memcpy(
s->header_state, rc_header_bak,
sizeof(
s->header_state));
1984 memcpy(
s->block_state, rc_block_bak,
sizeof(
s->block_state));
1991 for(orientation=
level ? 1 : 0; orientation<4; orientation++){
2006 for(orientation=
level ? 1 : 0; orientation<4; orientation++){
2013 ff_spatial_idwt(
s->spatial_idwt_buffer,
s->temp_idwt_buffer,
w,
h,
w,
s->spatial_decomposition_type,
s->spatial_decomposition_count);
2017 s->spatial_idwt_buffer[y*
w + x] *= 1 <<
FRAC_BITS;
2027 s->current_picture->data[plane_index][y*
s->current_picture->linesize[plane_index] + x]=
2028 pict->
data[plane_index][y*pict->
linesize[plane_index] + x];
2032 memset(
s->spatial_idwt_buffer, 0,
sizeof(
IDWTELEM)*
w*
h);
2039 if(pict->
data[plane_index])
2042 int d=
s->current_picture->data[plane_index][y*
s->current_picture->linesize[plane_index] + x] - pict->
data[plane_index][y*pict->
linesize[plane_index] + x];
2046 s->avctx->error[plane_index] +=
error;
2057 s->current_picture->pict_type = pic->
pict_type;
2058 s->current_picture->quality = pic->
quality;
2059 enc->
m.
frame_bits = 8 * (
s->c.bytestream -
s->c.bytestream_start);
2061 enc->
m.
total_bits += 8*(
s->c.bytestream -
s->c.bytestream_start);
2077 s->current_picture->pict_type);
2113#define OFFSET(x) offsetof(SnowEncContext, x)
2114#define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
2121 {
"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 },
2122 {
"no_bitstream",
"Skip final bitstream writeout.",
OFFSET(no_bitstream),
AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1,
VE },
2123 {
"intra_penalty",
"Penalty for intra blocks in block decision",
OFFSET(intra_penalty),
AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX,
VE },
2124 {
"iterative_dia_size",
"Dia size for the iterative ME",
OFFSET(iterative_dia_size),
AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX,
VE },
2125 {
"sc_threshold",
"Scene change threshold",
OFFSET(scenechange_threshold),
AV_OPT_TYPE_INT, { .i64 = 0 }, INT_MIN, INT_MAX,
VE },
2129 {
"rc_eq",
"Set rate control equation. When computing the expression, besides the standard functions "
2130 "defined in the section 'Expression Evaluation', the following functions are available: "
2131 "bits2qp(bits), qp2bits(qp). Also the following constants are available: iTex pTex tex mv "
2132 "fCode iCount mcVar var isI isP isB avgQP qComp avgIITex avgPITex avgPPTex avgBPTex avgTex.",
2138 .class_name =
"snow encoder",
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t my
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t mx
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
const FFCodec ff_snow_encoder
static av_cold int encode_init(AVCodecContext *avctx)
#define av_assert2(cond)
assert() equivalent, that does lie in speed critical code.
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code.
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Libavcodec external API header.
static int BS_FUNC left(const BSCTX *bc)
Return the number of the bits left in a buffer.
#define i(width, name, range_min, range_max)
#define CODEC_PIXFMTS(...)
#define FF_CODEC_ENCODE_CB(func)
#define CODEC_LONG_NAME(str)
#define FF_CODEC_CAP_INIT_CLEANUP
The codec allows calling the close function for deallocation even if the init function returned a fai...
#define AV_CEIL_RSHIFT(a, b)
#define ROUNDED_DIV(a, b)
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
int(* init)(AVBSFContext *ctx)
int ff_alloc_packet(AVCodecContext *avctx, AVPacket *avpkt, int64_t size)
Check AVPacket size and allocate data.
int ff_encode_add_stats_side_data(AVPacket *pkt, int quality, const int64_t error[], int error_count, enum AVPictureType pict_type)
int ff_encode_alloc_frame(AVCodecContext *avctx, AVFrame *frame)
Allocate buffers for a frame.
#define FF_INPUT_BUFFER_MIN_SIZE
Used by some encoders as upper bound for the length of headers.
static struct @346255127015250356166251341105367306144006377143 state
static int encode_frame(OutputFile *of, OutputStream *ost, AVFrame *frame, AVPacket *pkt)
@ AV_OPT_TYPE_CONST
Special option type for declaring named constants.
@ AV_OPT_TYPE_INT
Underlying C type is int.
@ AV_OPT_TYPE_BOOL
Underlying C type is int.
@ AV_OPT_TYPE_STRING
Underlying C type is a uint8_t* that is either NULL or points to a C string allocated with the av_mal...
#define AV_CODEC_FLAG_QPEL
Use qpel MC.
#define AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE
This encoder can reorder user opaque values from input AVFrames and return them with corresponding ou...
#define AV_CODEC_FLAG_PASS2
Use internal 2pass ratecontrol in second pass mode.
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
#define AV_CODEC_FLAG_QSCALE
Use fixed qscale.
#define AV_CODEC_FLAG_PASS1
Use internal 2pass ratecontrol in first pass mode.
#define AV_CODEC_FLAG_PSNR
error[?
#define AV_CODEC_FLAG_4MV
4 MV per MB allowed / advanced prediction for H.263.
#define AV_CODEC_CAP_ENCODER_RECON_FRAME
The encoder is able to output reconstructed frame data, i.e.
#define AV_CODEC_FLAG_RECON_FRAME
Request the encoder to output reconstructed frames, i.e. frames that would be produced by decoding th...
#define AV_PKT_FLAG_KEY
The packet contains a keyframe.
#define FF_QP2LAMBDA
factor to convert from H.263 QP to lambda
#define AV_FRAME_FLAG_KEY
A flag to mark frames that are keyframes.
void av_frame_unref(AVFrame *frame)
Unreference all the buffers referenced by frame and reset the frame fields.
int av_frame_replace(AVFrame *dst, const AVFrame *src)
Ensure the destination frame refers to the same data described by the source frame,...
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values.
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
const char * av_default_item_name(void *ptr)
Return the context name.
@ AV_PICTURE_TYPE_I
Intra.
@ AV_PICTURE_TYPE_P
Predicted.
#define LIBAVUTIL_VERSION_INT
const uint8_t(* ff_h263_get_mv_penalty(void))[MAX_DMV *2+1]
static av_cold int encode_end(AVCodecContext *avctx)
static int shift(int a, int b)
static void pred_mv(DiracBlock *block, int stride, int x, int y, int ref)
av_cold void ff_hpeldsp_init(HpelDSPContext *c, int flags)
common internal api header.
av_cold void ff_mpegvideoencdsp_init(MpegvideoEncDSPContext *c, AVCodecContext *avctx)
EXTERN const uint32_t ff_square_tab[512]
av_cold void ff_me_cmp_init(MECmpContext *c, AVCodecContext *avctx)
void * av_calloc(size_t nmemb, size_t size)
Memory handling functions.
void ff_me_init_pic(MPVEncContext *const s)
av_cold int ff_me_init(MotionEstContext *c, AVCodecContext *avctx, const MECmpContext *mecc, int mpvenc)
int ff_epzs_motion_search(MPVEncContext *s, int *mx_ptr, int *my_ptr, int P[10][2], int src_index, int ref_index, const int16_t(*last_mv)[2], int ref_mv_scale, int size, int h)
int ff_get_mb_score(MPVEncContext *s, int mx, int my, int src_index, int ref_index, int size, int h, int add_rate)
int av_pix_fmt_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.
@ AVCOL_RANGE_MPEG
Narrow or limited range content.
@ AV_PIX_FMT_YUV420P
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
@ AV_PIX_FMT_GRAY8
Y , 8bpp.
@ AV_PIX_FMT_YUV410P
planar YUV 4:1:0, 9bpp, (1 Cr & Cb sample per 4x4 Y samples)
@ AV_PIX_FMT_YUV444P
planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples)
int ff_rac_terminate(RangeCoder *c, int version)
Terminates the range coder.
void ff_build_rac_states(RangeCoder *c, int factor, int max_p)
av_cold void ff_init_range_encoder(RangeCoder *c, uint8_t *buf, int buf_size)
static int get_rac_count(RangeCoder *c)
void ff_write_pass1_stats(MPVMainEncContext *const m)
av_cold void ff_rate_control_uninit(RateControlContext *rcc)
float ff_rate_estimate_qscale(MPVMainEncContext *const m, int dry_run)
av_cold int ff_rate_control_init(MPVMainEncContext *const m)
static const float pred[4]
av_cold int ff_snow_common_init(AVCodecContext *avctx)
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)
void ff_snow_reset_contexts(SnowContext *s)
int ff_snow_common_init_after_header(AVCodecContext *avctx)
int ff_snow_frames_prepare(SnowContext *s)
av_cold void ff_snow_common_end(SnowContext *s)
int ff_snow_alloc_blocks(SnowContext *s)
#define BLOCK_OPT
Block needs no checks in this round of iterative motion estiation.
static av_always_inline void predict_plane(SnowContext *s, IDWTELEM *buf, int plane_index, int add)
const uint8_t ff_qexp[QROOT]
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)
const uint8_t *const ff_obmc_tab[4]
#define ENCODER_EXTRA_BITS
#define BLOCK_INTRA
Intra block, inter otherwise.
static av_always_inline int same_block(BlockNode *a, BlockNode *b)
const int8_t ff_quant3bA[256]
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)
static const BlockNode null_block
void ff_spatial_idwt(IDWTELEM *buffer, IDWTELEM *temp, int width, int height, int stride, int type, int decomposition_count)
int ff_w53_32_c(MPVEncContext *v, const uint8_t *pix1, const uint8_t *pix2, ptrdiff_t line_size, int h)
int ff_w97_32_c(MPVEncContext *v, const uint8_t *pix1, const uint8_t *pix2, ptrdiff_t line_size, int h)
void ff_spatial_dwt(DWTELEM *buffer, DWTELEM *temp, int width, int height, int stride, int type, int decomposition_count)
static int ratecontrol_1pass(SnowEncContext *enc, AVFrame *pict)
static int qscale2qlog(int qscale)
static int get_block_rd(SnowEncContext *enc, int mb_x, int mb_y, int plane_index, uint8_t(*obmc_edged)[MB_SIZE *2])
static const AVClass snowenc_class
static int get_penalty_factor(int lambda, int lambda2, int type)
#define PTR_ADD(ptr, off)
static av_always_inline int check_block_intra(SnowEncContext *enc, int mb_x, int mb_y, int p[3], uint8_t(*obmc_edged)[MB_SIZE *2], int *best_rd)
static int encode_subband_c0run(SnowContext *s, SubBand *b, const IDWTELEM *src, const IDWTELEM *parent, int stride, int orientation)
static int pix_norm1(const uint8_t *pix, int line_size, int w)
static void encode_q_branch2(SnowContext *s, int level, int x, int y)
static int get_dc(SnowEncContext *enc, int mb_x, int mb_y, int plane_index)
static void calculate_visual_weight(SnowContext *s, Plane *p)
static void correlate(SnowContext *s, SubBand *b, IDWTELEM *src, int stride, int inverse, int use_median)
static void put_symbol2(RangeCoder *c, uint8_t *state, int v, int log2)
static int get_block_bits(SnowContext *s, int x, int y, int w)
static av_cold int encode_init(AVCodecContext *avctx)
static void put_symbol(RangeCoder *c, uint8_t *state, int v, int is_signed)
static int get_4block_rd(SnowEncContext *enc, int mb_x, int mb_y, int plane_index)
static int get_encode_buffer(SnowContext *s, AVFrame *frame)
static int encode_frame(AVCodecContext *avctx, AVPacket *pkt, const AVFrame *pict, int *got_packet)
static void init_ref(MotionEstContext *c, const uint8_t *const src[3], uint8_t *const ref[3], uint8_t *const ref2[3], int x, int y, int ref_index)
static void encode_qlogs(SnowContext *s)
static av_always_inline int check_block_inter(SnowEncContext *enc, int mb_x, int mb_y, int p0, int p1, uint8_t(*obmc_edged)[MB_SIZE *2], int *best_rd)
static av_always_inline int check_4block_inter(SnowEncContext *enc, int mb_x, int mb_y, int p0, int p1, int ref, int *best_rd)
static void iterative_me(SnowEncContext *enc)
static void decorrelate(SnowContext *s, SubBand *b, IDWTELEM *src, int stride, int inverse, int use_median)
static int pix_sum(const uint8_t *pix, int line_size, int w, int h)
static av_cold int encode_end(AVCodecContext *avctx)
static void encode_header(SnowContext *s)
static int encode_q_branch(SnowEncContext *enc, int level, int x, int y)
static void dequantize(SnowContext *s, SubBand *b, IDWTELEM *src, int stride)
static void quantize(SnowContext *s, SubBand *b, IDWTELEM *dst, DWTELEM *src, int stride, int bias)
static void encode_blocks(SnowEncContext *enc, int search)
static void update_last_header_values(SnowContext *s)
static int encode_subband(SnowContext *s, SubBand *b, const IDWTELEM *src, const IDWTELEM *parent, int stride, int orientation)
Describe the class of an AVClass context structure.
main external API structure.
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
int width
picture width / height.
char * stats_out
pass1 encoding statistics output buffer
int global_quality
Global quality for codecs which cannot change it per frame.
int mb_lmax
maximum MB Lagrange multiplier
int dia_size
ME diamond size & shape.
int64_t frame_num
Frame counter, set by libavcodec.
int64_t bit_rate
the average bitrate
int gop_size
the number of pictures in a group of pictures, or 0 for intra_only
int refs
number of reference frames
int mb_lmin
minimum MB Lagrange multiplier
int flags
AV_CODEC_FLAG_*.
struct AVCodecInternal * internal
Private context used for internal data.
AVFrame * recon_frame
When the AV_CODEC_FLAG_RECON_FRAME flag is used.
This structure describes decoded (raw) audio or video data.
int64_t pts
Presentation timestamp in time_base units (time when frame should be shown to user).
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
int quality
quality (between 1 (good) and FF_LAMBDA_MAX (bad))
int linesize[AV_NUM_DATA_POINTERS]
For video, a positive or negative value, which is typically indicating the size in bytes of each pict...
enum AVPictureType pict_type
Picture type of the frame.
This structure stores compressed data.
uint8_t ref
Reference frame index.
int16_t mx
Motion vector component X, see mv_scale.
int16_t my
Motion vector component Y, see mv_scale.
uint8_t type
Bitfield of BLOCK_*.
MpegEncContext c
the common base context
int misc_bits
cbp, mb_type
unsigned int lambda
Lagrange multiplier used in rate distortion.
int f_code
forward MV resolution
unsigned int lambda2
(lambda*lambda) >> FF_LAMBDA_SHIFT
int frame_bits
bits used for the current frame
MPVEncContext s
The main slicecontext.
RateControlContext rc_context
contains stuff only accessed in ratecontrol.c
int64_t mc_mb_var_sum
motion compensated MB variance for current frame
int64_t mb_var_sum
sum of MB variance for current frame
int display_picture_number
MPVPicture * ptr
RefStruct reference.
Motion estimation context.
uint8_t * scratchpad
data area for the ME algo, so that the ME does not need to malloc/free.
const uint8_t(* mv_penalty)[MAX_DMV *2+1]
bit amount needed to encode a MV
int unrestricted_mv
mv can point outside of the coded picture
int motion_est
ME algorithm.
int mb_stride
mb_width+1 used for some arrays to allow simple addressing of left & top MBs without sig11
struct AVCodecContext * avctx
int mb_num
number of MBs of a picture
int mb_height
number of MBs horizontally & vertically
MPVWorkPicture last_pic
copy of the previous picture structure.
enum OutputFormat out_format
output format
int quarter_sample
1->qpel, 0->half pel ME/MC
int height
picture size. must be a multiple of 16
ptrdiff_t linesize
line size, in bytes, may be different from width
enum AVPictureType pict_type
AV_PICTURE_TYPE_I, AV_PICTURE_TYPE_P, AV_PICTURE_TYPE_B, ...
int b8_stride
2*mb_width+1 used for some 8x8 block arrays to allow simple addressing
MPVWorkPicture cur_pic
copy of the current picture structure.
ptrdiff_t uvlinesize
line size, for chroma in bytes, may be different from width
void(* draw_edges)(uint8_t *buf, ptrdiff_t wrap, int width, int height, int w, int h, int sides)
MpegvideoEncDSPContext mpvencdsp
unsigned me_cache_generation
uint64_t encoding_error[SNOW_MAX_PLANES]
unsigned me_cache[ME_CACHE_SIZE]
IDWTELEM obmc_scratchpad[MB_SIZE *MB_SIZE *12 *2]
uint8_t * emu_edge_buffer
int scenechange_threshold
static void error(const char *err)
static int ref[MAX_W *MAX_W]
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)
static double cr(void *priv, double x, double y)
static double cb(void *priv, double x, double y)
static int bias(int x, int c)