65#define ME_CACHE_SIZE 1024
76#define PTR_ADD(ptr, off) ((ptr) ? (ptr) + (off) : NULL)
79 uint8_t *
const ref[3], uint8_t *
const ref2[3],
80 int x,
int y,
int ref_index)
85 ((y*
c->uvstride + x) >>
s->chroma_h_shift),
86 ((y*
c->uvstride + x) >>
s->chroma_h_shift),
88 for (
int i = 0;
i < 3;
i++) {
100 const int el =
FFMIN(e, 10);
105 for (
i = 0;
i < el;
i++)
111 for (
i = e - 1;
i >= el;
i--)
138 for (
int i =
log2 - 1;
i >= 0;
i--)
152 for (
int i = 0;
frame->data[
i];
i++) {
158 frame->width =
s->avctx->width;
159 frame->height =
s->avctx->height;
169 int plane_index, ret;
179 s->spatial_decomposition_type = enc->
pred;
184 for(plane_index=0; plane_index<3; plane_index++){
185 s->plane[plane_index].diag_mc= 1;
186 s->plane[plane_index].htaps= 6;
187 s->plane[plane_index].hcoeff[0]= 40;
188 s->plane[plane_index].hcoeff[1]= -10;
189 s->plane[plane_index].hcoeff[2]= 2;
190 s->plane[plane_index].fast_mc= 1;
200 enc->qdsp.put_qpel_pixels_tab [0][dy+dx/4]=\
201 enc->qdsp.put_no_rnd_qpel_pixels_tab[0][dy+dx/4]=\
202 s->h264qpel.put_h264_qpel_pixels_tab[0][dy+dx/4];\
203 enc->qdsp.put_qpel_pixels_tab [1][dy+dx/4]=\
204 enc->qdsp.put_no_rnd_qpel_pixels_tab[1][dy+dx/4]=\
205 s->h264qpel.put_h264_qpel_pixels_tab[1][dy+dx/4];
270 s->colorspace_type= 0;
274 s->colorspace_type = 1;
287 if (!
s->input_picture)
298 int size=
s->b_width *
s->b_height << 2*
s->block_max_depth;
299 for(
i=0;
i<
s->max_ref_frames;
i++){
302 if (!
s->ref_mvs[
i] || !
s->ref_scores[
i])
316 for (
i = 0;
i <
h;
i++) {
317 for (j = 0; j <
w; j++) {
321 pix += line_size -
w;
333 for (
i = 0;
i <
w;
i++) {
334 for (j = 0; j <
w; j ++) {
338 pix += line_size -
w;
370#define P_TOPRIGHT P[3]
379 uint8_t p_buffer[1024];
380 uint8_t i_buffer[1024];
381 uint8_t p_state[
sizeof(
s->block_state)];
382 uint8_t i_state[
sizeof(
s->block_state)];
384 uint8_t *pbbak=
s->c.bytestream;
385 uint8_t *pbbak_start=
s->c.bytestream_start;
386 int score, score2, iscore, i_len, p_len, block_s, sum, base_bits;
387 const int w=
s->b_width <<
s->block_max_depth;
388 const int h=
s->b_height <<
s->block_max_depth;
389 const int rem_depth=
s->block_max_depth -
level;
390 const int index= (x + y*
w) << rem_depth;
392 int trx= (x+1)<<rem_depth;
393 int try= (y+1)<<rem_depth;
400 int pl =
left->color[0];
401 int pcb=
left->color[1];
402 int pcr=
left->color[2];
406 const int stride=
s->current_picture->linesize[0];
407 const int uvstride=
s->current_picture->linesize[1];
408 const uint8_t *
const current_data[3] = {
s->input_picture->data[0] + (x + y*
stride)*block_w,
409 PTR_ADD(
s->input_picture->data[1], ((x*block_w)>>
s->chroma_h_shift) + ((y*uvstride*block_w)>>
s->chroma_v_shift)),
410 PTR_ADD(
s->input_picture->data[2], ((x*block_w)>>
s->chroma_h_shift) + ((y*uvstride*block_w)>>
s->chroma_v_shift))};
412 int16_t last_mv[3][2];
414 const int shift= 1+qpel;
419 int ref, best_ref, ref_score, ref_mx, ref_my;
424 set_blocks(
s,
level, x, y, pl, pcb, pcr, 0, 0, 0,
BLOCK_INTRA);
437 last_mv[0][0]=
s->block[
index].mx;
438 last_mv[0][1]=
s->block[
index].my;
439 last_mv[1][0]= right->
mx;
440 last_mv[1][1]= right->
my;
441 last_mv[2][0]= bottom->
mx;
442 last_mv[2][1]= bottom->
my;
457 c->xmin = - x*block_w - 16+3;
458 c->ymin = - y*block_w - 16+3;
459 c->xmax = - (x+1)*block_w + (
w<<(
LOG2_MB_SIZE -
s->block_max_depth)) + 16-3;
460 c->ymax = - (y+1)*block_w + (
h<<(
LOG2_MB_SIZE -
s->block_max_depth)) + 16-3;
489 init_ref(
c, current_data,
s->last_picture[
ref]->data,
NULL, block_w*x, block_w*y, 0);
499 ref_score =
c->sub_motion_search(&enc->
m.
s, &ref_mx, &ref_my, ref_score,
509 if(score > ref_score){
519 base_bits=
get_rac_count(&
s->c) - 8*(
s->c.bytestream -
s->c.bytestream_start);
522 pc.bytestream= p_buffer;
523 memcpy(p_state,
s->block_state,
sizeof(
s->block_state));
525 if(
level!=
s->block_max_depth)
526 put_rac(&pc, &p_state[4 + s_context], 1);
528 if(
s->ref_frames > 1)
529 put_symbol(&pc, &p_state[128 + 1024 + 32*ref_context], best_ref, 0);
531 put_symbol(&pc, &p_state[128 + 32*(mx_context + 16*!!best_ref)],
mx - pmx, 1);
532 put_symbol(&pc, &p_state[128 + 32*(my_context + 16*!!best_ref)],
my - pmy, 1);
533 p_len= pc.bytestream - pc.bytestream_start;
536 block_s= block_w*block_w;
538 l= (sum + block_s/2)/block_s;
539 iscore =
pix_norm1(current_data[0],
stride, block_w) - 2*l*sum + l*l*block_s;
541 if (
s->nb_planes > 2) {
542 block_s= block_w*block_w>>(
s->chroma_h_shift +
s->chroma_v_shift);
543 sum =
pix_sum(current_data[1], uvstride, block_w>>
s->chroma_h_shift, block_w>>
s->chroma_v_shift);
544 cb= (sum + block_s/2)/block_s;
546 sum =
pix_sum(current_data[2], uvstride, block_w>>
s->chroma_h_shift, block_w>>
s->chroma_v_shift);
547 cr= (sum + block_s/2)/block_s;
554 ic.bytestream= i_buffer;
555 memcpy(i_state,
s->block_state,
sizeof(
s->block_state));
556 if(
level!=
s->block_max_depth)
557 put_rac(&ic, &i_state[4 + s_context], 1);
560 if (
s->nb_planes > 2) {
564 i_len= ic.bytestream - ic.bytestream_start;
567 av_assert1(iscore < 255*255*256 + enc->lambda2*10);
573 int varc= iscore >> 8;
574 int vard= score >> 8;
575 if (vard <= 64 || vard < varc)
581 if(
level!=
s->block_max_depth){
582 put_rac(&
s->c, &
s->block_state[4 + s_context], 0);
589 if(score2 < score && score2 < iscore)
595 memcpy(pbbak, i_buffer, i_len);
597 s->c.bytestream_start= pbbak_start;
598 s->c.bytestream= pbbak + i_len;
599 set_blocks(
s,
level, x, y, l,
cb,
cr, pmx, pmy, 0,
BLOCK_INTRA);
600 memcpy(
s->block_state, i_state,
sizeof(
s->block_state));
603 memcpy(pbbak, p_buffer, p_len);
605 s->c.bytestream_start= pbbak_start;
606 s->c.bytestream= pbbak + p_len;
607 set_blocks(
s,
level, x, y, pl, pcb, pcr,
mx,
my, best_ref, 0);
608 memcpy(
s->block_state, p_state,
sizeof(
s->block_state));
614 const int w=
s->b_width <<
s->block_max_depth;
615 const int rem_depth=
s->block_max_depth -
level;
616 const int index= (x + y*
w) << rem_depth;
617 int trx= (x+1)<<rem_depth;
623 int pl =
left->color[0];
624 int pcb=
left->color[1];
625 int pcr=
left->color[2];
633 set_blocks(
s,
level, x, y, pl, pcb, pcr, 0, 0, 0,
BLOCK_INTRA);
637 if(
level!=
s->block_max_depth){
639 put_rac(&
s->c, &
s->block_state[4 + s_context], 1);
641 put_rac(&
s->c, &
s->block_state[4 + s_context], 0);
653 if (
s->nb_planes > 2) {
657 set_blocks(
s,
level, x, y,
b->color[0],
b->color[1],
b->color[2], pmx, pmy, 0,
BLOCK_INTRA);
661 if(
s->ref_frames > 1)
662 put_symbol(&
s->c, &
s->block_state[128 + 1024 + 32*ref_context],
b->ref, 0);
663 put_symbol(&
s->c, &
s->block_state[128 + 32*mx_context],
b->mx - pmx, 1);
664 put_symbol(&
s->c, &
s->block_state[128 + 32*my_context],
b->my - pmy, 1);
665 set_blocks(
s,
level, x, y, pl, pcb, pcr,
b->mx,
b->my,
b->ref, 0);
673 Plane *p= &
s->plane[plane_index];
674 const int block_size =
MB_SIZE >>
s->block_max_depth;
675 const int block_w = plane_index ? block_size>>
s->chroma_h_shift : block_size;
676 const int block_h = plane_index ? block_size>>
s->chroma_v_shift : block_size;
678 const int obmc_stride= plane_index ? (2*block_size)>>
s->chroma_h_shift : 2*block_size;
679 const int ref_stride=
s->current_picture->linesize[plane_index];
680 const uint8_t *
src =
s->input_picture->data[plane_index];
682 const int b_stride =
s->b_width <<
s->block_max_depth;
683 const int w= p->width;
684 const int h= p->height;
685 int index= mb_x + mb_y*b_stride;
694 b->color[plane_index]= 0;
695 memset(
dst, 0, obmc_stride*obmc_stride*
sizeof(
IDWTELEM));
698 int mb_x2= mb_x + (
i &1) - 1;
699 int mb_y2= mb_y + (
i>>1) - 1;
700 int x= block_w*mb_x2 + block_w/2;
701 int y= block_h*mb_y2 + block_h/2;
704 x, y, block_w, block_h,
w,
h, obmc_stride, ref_stride, obmc_stride, mb_x2, mb_y2, 0, 0, plane_index);
706 for(y2=
FFMAX(y, 0); y2<
FFMIN(
h, y+block_h); y2++){
707 for(x2=
FFMAX(x, 0); x2<
FFMIN(
w, x+block_w); x2++){
708 int col= x2-(block_w*mb_x - block_w/2);
709 int row= y2-(block_h*mb_y - block_h/2);
710 int index= col + row*obmc_stride;
711 int obmc_v= obmc[
index];
713 if(y<0) obmc_v += obmc[
index + block_h*obmc_stride];
714 if(x<0) obmc_v += obmc[
index + block_w];
715 if(y+block_h>
h && row-block_h >= 0) obmc_v += obmc[
index - block_h*obmc_stride];
716 if(x+block_w>
w && col-block_w >= 0) obmc_v += obmc[
index - block_w];
721 ab += (
src[x2 + y2*ref_stride] - (d>>
FRAC_BITS)) * obmc_v;
722 aa += obmc_v * obmc_v;
735 const int b_stride =
s->b_width <<
s->block_max_depth;
736 const int b_height =
s->b_height<<
s->block_max_depth;
737 int index= x + y*b_stride;
747 if(x<0 || x>=b_stride || y>=b_height)
773 int plane_index, uint8_t (*obmc_edged)[
MB_SIZE * 2])
776 Plane *p= &
s->plane[plane_index];
777 const int block_size =
MB_SIZE >>
s->block_max_depth;
778 const int block_w = plane_index ? block_size>>
s->chroma_h_shift : block_size;
779 const int block_h = plane_index ? block_size>>
s->chroma_v_shift : block_size;
780 const int obmc_stride= plane_index ? (2*block_size)>>
s->chroma_h_shift : 2*block_size;
781 const int ref_stride=
s->current_picture->linesize[plane_index];
782 uint8_t *
dst=
s->current_picture->data[plane_index];
783 const uint8_t *
src =
s->input_picture->data[plane_index];
785 uint8_t *cur =
s->scratchbuf;
787 const int b_stride =
s->b_width <<
s->block_max_depth;
788 const int b_height =
s->b_height<<
s->block_max_depth;
789 const int w= p->width;
790 const int h= p->height;
794 int sx= block_w*mb_x - block_w/2;
795 int sy= block_h*mb_y - block_h/2;
796 int x0=
FFMAX(0,-sx);
797 int y0=
FFMAX(0,-sy);
798 int x1=
FFMIN(block_w*2,
w-sx);
799 int y1=
FFMIN(block_h*2,
h-sy);
804 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);
806 for(y=y0; y<y1; y++){
807 const uint8_t *obmc1= obmc_edged[y];
809 uint8_t *cur1 = cur + y*ref_stride;
810 uint8_t *dst1 =
dst + sx + (sy+y)*ref_stride;
811 for(x=x0; x<x1; x++){
812#if FRAC_BITS >= LOG2_OBMC_MAX
818 if(v&(~255)) v= ~(v>>31);
824 if ((mb_x == 0 || mb_x == b_stride-1) &&
825 (mb_y == 0 || mb_y == b_height-1)){
827 x1 =
FFMIN(x1, block_w);
829 x0 =
FFMAX(x0, block_w);
831 y1 =
FFMIN(y1, block_h);
833 y0 =
FFMAX(y0, block_h);
836 memcpy(
dst + sx+x0 + (sy+y)*ref_stride, cur + x0 + y*ref_stride, x1-x0);
847 distortion =
ff_w97_32_c(&enc->
m.
s,
src + sx + sy*ref_stride,
dst + sx + sy*ref_stride, ref_stride, 32);
849 distortion =
ff_w53_32_c(&enc->
m.
s,
src + sx + sy*ref_stride,
dst + sx + sy*ref_stride, ref_stride, 32);
853 int off = sx+16*(
i&1) + (sy+16*(
i>>1))*ref_stride;
859 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);
870 if(mb_x == b_stride-2)
873 return distortion + rate*penalty_factor;
880 Plane *p= &
s->plane[plane_index];
881 const int block_size =
MB_SIZE >>
s->block_max_depth;
882 const int block_w = plane_index ? block_size>>
s->chroma_h_shift : block_size;
883 const int block_h = plane_index ? block_size>>
s->chroma_v_shift : block_size;
885 const int obmc_stride= plane_index ? (2*block_size)>>
s->chroma_h_shift : 2*block_size;
886 const int ref_stride=
s->current_picture->linesize[plane_index];
887 uint8_t *
dst=
s->current_picture->data[plane_index];
888 const uint8_t *
src =
s->input_picture->data[plane_index];
892 const int b_stride =
s->b_width <<
s->block_max_depth;
893 const int w= p->width;
894 const int h= p->height;
902 int mb_x2= mb_x + (
i%3) - 1;
903 int mb_y2= mb_y + (
i/3) - 1;
904 int x= block_w*mb_x2 + block_w/2;
905 int y= block_h*mb_y2 + block_h/2;
908 x, y, block_w, block_h,
w,
h, 0, ref_stride, obmc_stride, mb_x2, mb_y2, 1, 1, plane_index);
911 for(y2= y; y2<0; y2++)
912 memcpy(
dst + x + y2*ref_stride,
src + x + y2*ref_stride, block_w);
913 for(y2=
h; y2<y+block_h; y2++)
914 memcpy(
dst + x + y2*ref_stride,
src + x + y2*ref_stride, block_w);
916 for(y2= y; y2<y+block_h; y2++)
917 memcpy(
dst + x + y2*ref_stride,
src + x + y2*ref_stride, -x);
920 for(y2= y; y2<y+block_h; y2++)
921 memcpy(
dst +
w + y2*ref_stride,
src +
w + y2*ref_stride, x+block_w -
w);
925 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);
939 for(
i=merged?4:0;
i<9;
i++){
940 static const int dxy[9][2] = {{0,0},{1,0},{0,1},{1,1},{2,0},{2,1},{-1,2},{0,2},{1,2}};
944 return distortion + rate*penalty_factor;
948 const int w=
b->width;
949 const int h=
b->height;
954 int *runs =
s->run_buffer;
961 int l=0, lt=0, t=0, rt=0;
983 if(px<b->parent->width && py<b->parent->height)
984 p= parent[px + py*2*
stride];
988 runs[run_index++]=
run;
996 max_index= run_index;
997 runs[run_index++]=
run;
999 run= runs[run_index++];
1002 if(run_index <= max_index)
1006 if(
s->c.bytestream_end -
s->c.bytestream <
w*40){
1012 int l=0, lt=0, t=0, rt=0;
1034 if(px<b->parent->width && py<b->parent->height)
1035 p= parent[px + py*2*
stride];
1040 put_rac(&
s->c, &
b->state[0][context], !!v);
1043 run= runs[run_index++];
1045 if(run_index <= max_index)
1055 int l2= 2*
FFABS(l) + (l<0);
1056 int t2= 2*
FFABS(t) + (t<0);
1075 uint8_t (*obmc_edged)[
MB_SIZE * 2],
int *best_rd)
1078 const int b_stride=
s->b_width <<
s->block_max_depth;
1086 block->color[0] = p[0];
1087 block->color[1] = p[1];
1088 block->color[2] = p[2];
1106 int mb_x,
int mb_y,
int p0,
int p1,
1107 uint8_t (*obmc_edged)[
MB_SIZE * 2],
int *best_rd)
1110 const int b_stride =
s->b_width <<
s->block_max_depth;
1132 if (rd < *best_rd) {
1142 int p0,
int p1,
int ref,
int *best_rd)
1145 const int b_stride=
s->b_width <<
s->block_max_depth;
1154 backup[0] =
block[0];
1155 backup[1] =
block[1];
1156 backup[2] =
block[b_stride];
1157 backup[3] =
block[b_stride + 1];
1182 block[0]= backup[0];
1183 block[1]= backup[1];
1184 block[b_stride]= backup[2];
1185 block[b_stride+1]= backup[3];
1193 int pass, mb_x, mb_y;
1194 const int b_width =
s->b_width <<
s->block_max_depth;
1195 const int b_height=
s->b_height <<
s->block_max_depth;
1196 const int b_stride= b_width;
1201 uint8_t
state[
sizeof(
s->block_state)];
1202 memcpy(
state,
s->block_state,
sizeof(
s->block_state));
1203 for(mb_y= 0; mb_y<
s->b_height; mb_y++)
1204 for(mb_x= 0; mb_x<
s->b_width; mb_x++)
1207 memcpy(
s->block_state,
state,
sizeof(
s->block_state));
1210 for(pass=0; pass<25; pass++){
1213 for(mb_y= 0; mb_y<b_height; mb_y++){
1214 for(mb_x= 0; mb_x<b_width; mb_x++){
1215 int dia_change,
i, j,
ref;
1216 int best_rd= INT_MAX, ref_rd;
1218 const int index= mb_x + mb_y * b_stride;
1228 const int b_w= (
MB_SIZE >>
s->block_max_depth);
1244 for (y = 0; y < b_w * 2; y++)
1245 memcpy(obmc_edged[y],
ff_obmc_tab[
s->block_max_depth] + y * b_w * 2, b_w * 2);
1247 for(y=0; y<b_w*2; y++)
1248 memset(obmc_edged[y], obmc_edged[y][0] + obmc_edged[y][b_w-1], b_w);
1249 if(mb_x==b_stride-1)
1250 for(y=0; y<b_w*2; y++)
1251 memset(obmc_edged[y]+b_w, obmc_edged[y][b_w] + obmc_edged[y][b_w*2-1], b_w);
1253 for(x=0; x<b_w*2; x++)
1254 obmc_edged[0][x] += obmc_edged[b_w-1][x];
1255 for(y=1; y<b_w; y++)
1256 memcpy(obmc_edged[y], obmc_edged[0], b_w*2);
1258 if(mb_y==b_height-1){
1259 for(x=0; x<b_w*2; x++)
1260 obmc_edged[b_w*2-1][x] += obmc_edged[b_w][x];
1261 for(y=b_w; y<b_w*2-1; y++)
1262 memcpy(obmc_edged[y], obmc_edged[b_w*2-1], b_w*2);
1267 if(mb_x==0 || mb_y==0 || mb_x==b_width-1 || mb_y==b_height-1){
1268 const uint8_t *
src =
s->input_picture->data[0];
1269 uint8_t *
dst=
s->current_picture->data[0];
1270 const int stride=
s->current_picture->linesize[0];
1271 const int block_w=
MB_SIZE >>
s->block_max_depth;
1272 const int block_h=
MB_SIZE >>
s->block_max_depth;
1273 const int sx= block_w*mb_x - block_w/2;
1274 const int sy= block_h*mb_y - block_h/2;
1275 const int w=
s->plane[0].width;
1276 const int h=
s->plane[0].height;
1281 for(y=
h; y<sy+block_h*2; y++)
1284 for(y=sy; y<sy+block_h*2; y++)
1287 if(sx+block_w*2 >
w){
1288 for(y=sy; y<sy+block_h*2; y++)
1294 for(
i=0;
i <
s->nb_planes;
i++)
1307 int16_t (*mvr)[2]= &
s->ref_mvs[
ref][
index];
1316 check_block_inter(enc, mb_x, mb_y, mvr[-b_stride][0], mvr[-b_stride][1], obmc_edged, &best_rd);
1318 check_block_inter(enc, mb_x, mb_y, mvr[-1][0], mvr[-1][1], obmc_edged, &best_rd);
1322 check_block_inter(enc, mb_x, mb_y, mvr[b_stride][0], mvr[b_stride][1], obmc_edged, &best_rd);
1327 int newx =
block->mx;
1328 int newy =
block->my;
1331 for(
i=0;
i < dia_size;
i++){
1333 dia_change |=
check_block_inter(enc, mb_x, mb_y, newx+4*(
i-j), newy+(4*j), obmc_edged, &best_rd);
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*j), newy+4*(
i-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);
1342 static const int square[8][2]= {{+1, 0},{-1, 0},{ 0,+1},{ 0,-1},{+1,+1},{-1,-1},{+1,-1},{-1,+1},};
1349 mvr[0][0]=
block->mx;
1350 mvr[0][1]=
block->my;
1351 if(ref_rd > best_rd){
1378 if(
s->block_max_depth == 1){
1380 for(mb_y= 0; mb_y<b_height; mb_y+=2){
1381 for(mb_x= 0; mb_x<b_width; mb_x+=2){
1383 int best_rd, init_rd;
1384 const int index= mb_x + mb_y * b_stride;
1389 b[2]=
b[0]+b_stride;
1405 (
b[0]->
my +
b[1]->
my +
b[2]->
my +
b[3]->
my + 2) >> 2, 0, &best_rd);
1411 if(init_rd != best_rd)
1444 const int w=
b->width;
1445 const int h=
b->height;
1448 int x,y, thres1, thres2;
1466 if((
unsigned)(
i+thres1) > thres2){
1486 if((
unsigned)(
i+thres1) > thres2){
1505 const int w=
b->width;
1506 const int h=
b->height;
1527 const int w=
b->width;
1528 const int h=
b->height;
1531 for(y=
h-1; y>=0; y--){
1532 for(x=
w-1; x>=0; x--){
1551 const int w=
b->width;
1552 const int h=
b->height;
1575 int plane_index,
level, orientation;
1577 for(plane_index=0; plane_index<
FFMIN(
s->nb_planes, 2); plane_index++){
1579 for(orientation=
level ? 1:0; orientation<4; orientation++){
1580 if(orientation==2)
continue;
1581 put_symbol(&
s->c,
s->header_state,
s->plane[plane_index].band[
level][orientation].qlog, 1);
1591 memset(kstate,
MID_STATE,
sizeof(kstate));
1594 if(
s->keyframe ||
s->always_reset){
1596 s->last_spatial_decomposition_type=
1600 s->last_block_max_depth= 0;
1601 for(plane_index=0; plane_index<2; plane_index++){
1602 Plane *p= &
s->plane[plane_index];
1605 memset(p->last_hcoeff, 0,
sizeof(p->last_hcoeff));
1610 put_rac(&
s->c,
s->header_state,
s->always_reset);
1611 put_symbol(&
s->c,
s->header_state,
s->temporal_decomposition_type, 0);
1612 put_symbol(&
s->c,
s->header_state,
s->temporal_decomposition_count, 0);
1613 put_symbol(&
s->c,
s->header_state,
s->spatial_decomposition_count, 0);
1615 if (
s->nb_planes > 2) {
1619 put_rac(&
s->c,
s->header_state,
s->spatial_scalability);
1628 for(plane_index=0; plane_index<
FFMIN(
s->nb_planes, 2); plane_index++){
1629 Plane *p= &
s->plane[plane_index];
1630 update_mc |= p->last_htaps != p->htaps;
1631 update_mc |= p->last_diag_mc != p->diag_mc;
1632 update_mc |= !!memcmp(p->last_hcoeff, p->hcoeff,
sizeof(p->hcoeff));
1634 put_rac(&
s->c,
s->header_state, update_mc);
1636 for(plane_index=0; plane_index<
FFMIN(
s->nb_planes, 2); plane_index++){
1637 Plane *p= &
s->plane[plane_index];
1638 put_rac(&
s->c,
s->header_state, p->diag_mc);
1640 for(
i= p->htaps/2;
i;
i--)
1644 if(
s->last_spatial_decomposition_count !=
s->spatial_decomposition_count){
1646 put_symbol(&
s->c,
s->header_state,
s->spatial_decomposition_count, 0);
1652 put_symbol(&
s->c,
s->header_state,
s->spatial_decomposition_type -
s->last_spatial_decomposition_type, 1);
1654 put_symbol(&
s->c,
s->header_state,
s->mv_scale -
s->last_mv_scale, 1);
1655 put_symbol(&
s->c,
s->header_state,
s->qbias -
s->last_qbias , 1);
1656 put_symbol(&
s->c,
s->header_state,
s->block_max_depth -
s->last_block_max_depth, 1);
1664 for(plane_index=0; plane_index<2; plane_index++){
1665 Plane *p= &
s->plane[plane_index];
1666 p->last_diag_mc= p->diag_mc;
1667 p->last_htaps = p->htaps;
1668 memcpy(p->last_hcoeff, p->hcoeff,
sizeof(p->hcoeff));
1672 s->last_spatial_decomposition_type =
s->spatial_decomposition_type;
1673 s->last_qlog =
s->qlog;
1674 s->last_qbias =
s->qbias;
1675 s->last_mv_scale =
s->mv_scale;
1676 s->last_block_max_depth =
s->block_max_depth;
1677 s->last_spatial_decomposition_count =
s->spatial_decomposition_count;
1691 uint32_t coef_sum= 0;
1692 int level, orientation, delta_qlog;
1695 for(orientation=
level ? 1 : 0; orientation<4; orientation++){
1698 const int w=
b->width;
1699 const int h=
b->height;
1703 const int qdiv= (1<<16)/qmul;
1713 coef_sum+=
abs(buf[x+y*
stride]) * qdiv >> 16;
1720 coef_sum = (uint64_t)coef_sum * coef_sum >> 16;
1735 s->qlog+= delta_qlog;
1740 int width = p->width;
1742 int level, orientation, x, y;
1746 for(orientation=
level ? 1 : 0; orientation<4; orientation++){
1750 memset(
s->spatial_idwt_buffer, 0,
sizeof(*
s->spatial_idwt_buffer)*
width*
height);
1751 ibuf[
b->width/2 +
b->height/2*
b->stride]= 256*16;
1754 for(x=0; x<
width; x++){
1759 if (orientation == 2)
1762 if (orientation != 1)
1765 p->band[
level][1].qlog = p->band[
level][2].qlog;
1770 const AVFrame *pict,
int *got_packet)
1778 const int width=
s->avctx->width;
1779 const int height=
s->avctx->height;
1780 int level, orientation, plane_index,
i, y, ret;
1781 uint8_t rc_header_bak[
sizeof(
s->header_state)];
1782 uint8_t rc_block_bak[
sizeof(
s->block_state)];
1790 for(
i=0;
i <
s->nb_planes;
i++){
1791 int hshift=
i ?
s->chroma_h_shift : 0;
1792 int vshift=
i ?
s->chroma_v_shift : 0;
1794 memcpy(&
s->input_picture->data[
i][y *
s->input_picture->linesize[
i]],
1803 pic =
s->input_picture;
1832 if (
s->current_picture->data[0]) {
1833 int w =
s->avctx->width;
1834 int h =
s->avctx->height;
1837 s->current_picture->linesize[0],
w ,
h ,
1839 if (
s->current_picture->data[2]) {
1858 int block_width = (
width +15)>>4;
1859 int block_height= (
height+15)>>4;
1860 int stride=
s->current_picture->linesize[0];
1868 mpv-> new_pic =
s->input_picture;
1896 memcpy(rc_header_bak,
s->header_state,
sizeof(
s->header_state));
1897 memcpy(rc_block_bak,
s->block_state,
sizeof(
s->block_state));
1902 s->spatial_decomposition_count= 5;
1904 while( !(
width >>(
s->chroma_h_shift +
s->spatial_decomposition_count))
1905 || !(
height>>(
s->chroma_v_shift +
s->spatial_decomposition_count)))
1906 s->spatial_decomposition_count--;
1908 if (
s->spatial_decomposition_count <= 0) {
1918 if(
s->last_spatial_decomposition_count !=
s->spatial_decomposition_count){
1919 for(plane_index=0; plane_index <
s->nb_planes; plane_index++){
1925 mpv->
misc_bits = 8 * (
s->c.bytestream -
s->c.bytestream_start);
1929 for(plane_index=0; plane_index <
s->nb_planes; plane_index++){
1930 Plane *p= &
s->plane[plane_index];
1938 if(pict->
data[plane_index])
1973 ff_spatial_dwt(
s->spatial_dwt_buffer,
s->temp_dwt_buffer,
w,
h,
w,
s->spatial_decomposition_type,
s->spatial_decomposition_count);
1975 if (enc->
pass1_rc && plane_index==0) {
1977 if (delta_qlog <= INT_MIN)
1982 memcpy(
s->header_state, rc_header_bak,
sizeof(
s->header_state));
1983 memcpy(
s->block_state, rc_block_bak,
sizeof(
s->block_state));
1990 for(orientation=
level ? 1 : 0; orientation<4; orientation++){
2005 for(orientation=
level ? 1 : 0; orientation<4; orientation++){
2012 ff_spatial_idwt(
s->spatial_idwt_buffer,
s->temp_idwt_buffer,
w,
h,
w,
s->spatial_decomposition_type,
s->spatial_decomposition_count);
2016 s->spatial_idwt_buffer[y*
w + x] *= 1 <<
FRAC_BITS;
2026 s->current_picture->data[plane_index][y*
s->current_picture->linesize[plane_index] + x]=
2027 pict->
data[plane_index][y*pict->
linesize[plane_index] + x];
2031 memset(
s->spatial_idwt_buffer, 0,
sizeof(
IDWTELEM)*
w*
h);
2038 if(pict->
data[plane_index])
2041 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];
2045 s->avctx->error[plane_index] +=
error;
2056 s->current_picture->pict_type = pic->
pict_type;
2057 s->current_picture->quality = pic->
quality;
2058 enc->
m.
frame_bits = 8 * (
s->c.bytestream -
s->c.bytestream_start);
2060 enc->
m.
total_bits += 8*(
s->c.bytestream -
s->c.bytestream_start);
2076 s->current_picture->pict_type);
2112#define OFFSET(x) offsetof(SnowEncContext, x)
2113#define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
2120 {
"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 },
2121 {
"no_bitstream",
"Skip final bitstream writeout.",
OFFSET(no_bitstream),
AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1,
VE },
2122 {
"intra_penalty",
"Penalty for intra blocks in block decision",
OFFSET(intra_penalty),
AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX,
VE },
2123 {
"iterative_dia_size",
"Dia size for the iterative ME",
OFFSET(iterative_dia_size),
AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX,
VE },
2124 {
"sc_threshold",
"Scene change threshold",
OFFSET(scenechange_threshold),
AV_OPT_TYPE_INT, { .i64 = 0 }, INT_MIN, INT_MAX,
VE },
2128 {
"rc_eq",
"Set rate control equation. When computing the expression, besides the standard functions "
2129 "defined in the section 'Expression Evaluation', the following functions are available: "
2130 "bits2qp(bits), qp2bits(qp). Also the following constants are available: iTex pTex tex mv "
2131 "fCode iCount mcVar var isI isP isB avgQP qComp avgIITex avgPITex avgPPTex avgBPTex avgTex.",
2137 .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)
Replacements for frequently missing libm functions.
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)