Mercurial > libavcodec.hg
comparison mpegvideo.c @ 2260:33835650f5b6 libavcodec
low resolution interlaced support
author | michael |
---|---|
date | Sun, 26 Sep 2004 11:05:35 +0000 |
parents | 7e0b2e86afa9 |
children | d7fdb7be7df4 |
comparison
equal
deleted
inserted
replaced
2259:12e75af1d44c | 2260:33835650f5b6 |
---|---|
2623 const int h_edge_pos = s->h_edge_pos >> lowres; | 2623 const int h_edge_pos = s->h_edge_pos >> lowres; |
2624 const int v_edge_pos = s->v_edge_pos >> lowres; | 2624 const int v_edge_pos = s->v_edge_pos >> lowres; |
2625 linesize = s->current_picture.linesize[0] << field_based; | 2625 linesize = s->current_picture.linesize[0] << field_based; |
2626 uvlinesize = s->current_picture.linesize[1] << field_based; | 2626 uvlinesize = s->current_picture.linesize[1] << field_based; |
2627 | 2627 |
2628 if(s->quarter_sample){ //FIXME obviously not perfect but qpel wont work in lowres anyway | |
2629 motion_x/=2; | |
2630 motion_y/=2; | |
2631 } | |
2632 | |
2633 if(field_based){ | |
2634 motion_y += (bottom_field - field_select)*((1<<lowres)-1); | |
2635 } | |
2636 | |
2628 sx= motion_x & s_mask; | 2637 sx= motion_x & s_mask; |
2629 sy= motion_y & s_mask; | 2638 sy= motion_y & s_mask; |
2630 src_x = s->mb_x*2*block_s + (motion_x >> (lowres+1)); | 2639 src_x = s->mb_x*2*block_s + (motion_x >> (lowres+1)); |
2631 src_y = s->mb_y*2*block_s + (motion_y >> (lowres+1)); | 2640 src_y =(s->mb_y*2*block_s>>field_based) + (motion_y >> (lowres+1)); |
2632 | 2641 |
2633 if (s->out_format == FMT_H263) { | 2642 if (s->out_format == FMT_H263) { |
2634 uvsx = sx | ((motion_x & 2)>>1); | 2643 uvsx = sx | ((motion_x & 2)>>1); |
2635 uvsy = sy | ((motion_y & 2)>>1); | 2644 uvsy = sy | ((motion_y & 2)>>1); |
2636 uvsrc_x = src_x>>1; | 2645 uvsrc_x = src_x>>1; |
2646 mx = motion_x / 2; | 2655 mx = motion_x / 2; |
2647 my = motion_y / 2; | 2656 my = motion_y / 2; |
2648 uvsx = mx & s_mask; | 2657 uvsx = mx & s_mask; |
2649 uvsy = my & s_mask; | 2658 uvsy = my & s_mask; |
2650 uvsrc_x = s->mb_x*block_s + (mx >> (lowres+1)); | 2659 uvsrc_x = s->mb_x*block_s + (mx >> (lowres+1)); |
2651 uvsrc_y = s->mb_y*block_s + (my >> (lowres+1)); | 2660 uvsrc_y =(s->mb_y*block_s>>field_based) + (my >> (lowres+1)); |
2652 } | 2661 } |
2653 | 2662 |
2654 ptr_y = ref_picture[0] + src_y * linesize + src_x; | 2663 ptr_y = ref_picture[0] + src_y * linesize + src_x; |
2655 ptr_cb = ref_picture[1] + uvsrc_y * uvlinesize + uvsrc_x; | 2664 ptr_cb = ref_picture[1] + uvsrc_y * uvlinesize + uvsrc_x; |
2656 ptr_cr = ref_picture[2] + uvsrc_y * uvlinesize + uvsrc_x; | 2665 ptr_cr = ref_picture[2] + uvsrc_y * uvlinesize + uvsrc_x; |
2667 ff_emulated_edge_mc(uvbuf+16, ptr_cr, s->uvlinesize, 9, 9+field_based, | 2676 ff_emulated_edge_mc(uvbuf+16, ptr_cr, s->uvlinesize, 9, 9+field_based, |
2668 uvsrc_x, uvsrc_y<<field_based, h_edge_pos>>1, v_edge_pos>>1); | 2677 uvsrc_x, uvsrc_y<<field_based, h_edge_pos>>1, v_edge_pos>>1); |
2669 ptr_cb= uvbuf; | 2678 ptr_cb= uvbuf; |
2670 ptr_cr= uvbuf+16; | 2679 ptr_cr= uvbuf+16; |
2671 } | 2680 } |
2681 } | |
2682 | |
2683 if(bottom_field){ //FIXME use this for field pix too instead of the obnoxious hack which changes picture.data | |
2684 dest_y += s->linesize; | |
2685 dest_cb+= s->uvlinesize; | |
2686 dest_cr+= s->uvlinesize; | |
2687 } | |
2688 | |
2689 if(field_select){ | |
2690 ptr_y += s->linesize; | |
2691 ptr_cb+= s->uvlinesize; | |
2692 ptr_cr+= s->uvlinesize; | |
2672 } | 2693 } |
2673 | 2694 |
2674 sx <<= 2 - lowres; | 2695 sx <<= 2 - lowres; |
2675 sy <<= 2 - lowres; | 2696 sy <<= 2 - lowres; |
2676 pix_op[lowres-1](dest_y, ptr_y, linesize, h, sx, sy); | 2697 pix_op[lowres-1](dest_y, ptr_y, linesize, h, sx, sy); |
3175 static inline void MPV_motion_lowres(MpegEncContext *s, | 3196 static inline void MPV_motion_lowres(MpegEncContext *s, |
3176 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr, | 3197 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr, |
3177 int dir, uint8_t **ref_picture, | 3198 int dir, uint8_t **ref_picture, |
3178 h264_chroma_mc_func *pix_op) | 3199 h264_chroma_mc_func *pix_op) |
3179 { | 3200 { |
3180 assert(s->mv_type == MV_TYPE_16X16); | 3201 int dxy, mx, my, src_x, src_y, motion_x, motion_y; |
3181 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr, | 3202 int mb_x, mb_y, i; |
3182 0, 0, 0, | 3203 uint8_t *ptr, *dest; |
3183 ref_picture, pix_op, | 3204 const int lowres= s->avctx->lowres; |
3184 s->mv[dir][0][0], s->mv[dir][0][1], 16>>s->avctx->lowres); | 3205 const int block_s= 8>>lowres; |
3206 | |
3207 mb_x = s->mb_x; | |
3208 mb_y = s->mb_y; | |
3209 | |
3210 switch(s->mv_type) { | |
3211 case MV_TYPE_16X16: | |
3212 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr, | |
3213 0, 0, 0, | |
3214 ref_picture, pix_op, | |
3215 s->mv[dir][0][0], s->mv[dir][0][1], 2*block_s); | |
3216 break; | |
3217 /* case MV_TYPE_8X8: | |
3218 mx = 0; | |
3219 my = 0; | |
3220 for(i=0;i<4;i++) { | |
3221 hpel_motion(s, dest_y + ((i & 1) * 8) + (i >> 1) * 8 * s->linesize, | |
3222 ref_picture[0], 0, 0, | |
3223 mb_x * 16 + (i & 1) * 8, mb_y * 16 + (i >>1) * 8, | |
3224 s->width, s->height, s->linesize, | |
3225 s->h_edge_pos, s->v_edge_pos, | |
3226 8, 8, pix_op[1], | |
3227 s->mv[dir][i][0], s->mv[dir][i][1]); | |
3228 | |
3229 mx += s->mv[dir][i][0]; | |
3230 my += s->mv[dir][i][1]; | |
3231 } | |
3232 | |
3233 if(!(s->flags&CODEC_FLAG_GRAY)) | |
3234 chroma_4mv_motion(s, dest_cb, dest_cr, ref_picture, pix_op[1], mx, my); | |
3235 break;*/ | |
3236 case MV_TYPE_FIELD: | |
3237 if (s->picture_structure == PICT_FRAME) { | |
3238 /* top field */ | |
3239 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr, | |
3240 1, 0, s->field_select[dir][0], | |
3241 ref_picture, pix_op, | |
3242 s->mv[dir][0][0], s->mv[dir][0][1], block_s); | |
3243 /* bottom field */ | |
3244 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr, | |
3245 1, 1, s->field_select[dir][1], | |
3246 ref_picture, pix_op, | |
3247 s->mv[dir][1][0], s->mv[dir][1][1], block_s); | |
3248 } else { | |
3249 if(s->picture_structure != s->field_select[dir][0] + 1 && s->pict_type != B_TYPE && !s->first_field){ | |
3250 ref_picture= s->current_picture_ptr->data; | |
3251 } | |
3252 | |
3253 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr, | |
3254 0, 0, s->field_select[dir][0], | |
3255 ref_picture, pix_op, | |
3256 s->mv[dir][0][0], s->mv[dir][0][1], 2*block_s); | |
3257 } | |
3258 break; | |
3259 case MV_TYPE_16X8: | |
3260 for(i=0; i<2; i++){ | |
3261 uint8_t ** ref2picture; | |
3262 | |
3263 if(s->picture_structure == s->field_select[dir][i] + 1 || s->pict_type == B_TYPE || s->first_field){ | |
3264 ref2picture= ref_picture; | |
3265 }else{ | |
3266 ref2picture= s->current_picture_ptr->data; | |
3267 } | |
3268 | |
3269 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr, | |
3270 0, 0, s->field_select[dir][i], | |
3271 ref2picture, pix_op, | |
3272 s->mv[dir][i][0], s->mv[dir][i][1] + 2*block_s*i, block_s); | |
3273 | |
3274 dest_y += 2*block_s*s->linesize; | |
3275 dest_cb+= (2*block_s>>s->chroma_y_shift)*s->uvlinesize; | |
3276 dest_cr+= (2*block_s>>s->chroma_y_shift)*s->uvlinesize; | |
3277 } | |
3278 break; | |
3279 case MV_TYPE_DMV: | |
3280 if(s->picture_structure == PICT_FRAME){ | |
3281 for(i=0; i<2; i++){ | |
3282 int j; | |
3283 for(j=0; j<2; j++){ | |
3284 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr, | |
3285 1, j, j^i, | |
3286 ref_picture, pix_op, | |
3287 s->mv[dir][2*i + j][0], s->mv[dir][2*i + j][1], block_s); | |
3288 } | |
3289 pix_op = s->dsp.avg_h264_chroma_pixels_tab; | |
3290 } | |
3291 }else{ | |
3292 for(i=0; i<2; i++){ | |
3293 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr, | |
3294 0, 0, s->picture_structure != i+1, | |
3295 ref_picture, pix_op, | |
3296 s->mv[dir][2*i][0],s->mv[dir][2*i][1],2*block_s); | |
3297 | |
3298 // after put we make avg of the same block | |
3299 pix_op = s->dsp.avg_h264_chroma_pixels_tab; | |
3300 | |
3301 //opposite parity is always in the same frame if this is second field | |
3302 if(!s->first_field){ | |
3303 ref_picture = s->current_picture_ptr->data; | |
3304 } | |
3305 } | |
3306 } | |
3307 break; | |
3308 default: assert(0); | |
3309 } | |
3185 } | 3310 } |
3186 | 3311 |
3187 /* put block[] to dest[] */ | 3312 /* put block[] to dest[] */ |
3188 static inline void put_dct(MpegEncContext *s, | 3313 static inline void put_dct(MpegEncContext *s, |
3189 DCTELEM *block, int i, uint8_t *dest, int line_size, int qscale) | 3314 DCTELEM *block, int i, uint8_t *dest, int line_size, int qscale) |