Merge remote-tracking branch 'qatar/master'
* qatar/master: mpegvideo: Move 8x8 in a separate function Conflicts: libavcodec/mpegvideo_motion.c Merged-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
		@@ -747,6 +747,81 @@ static inline void apply_obmc(MpegEncContext *s,
 | 
				
			|||||||
                          mx, my);
 | 
					                          mx, my);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static inline void apply_8x8(MpegEncContext *s,
 | 
				
			||||||
 | 
					                             uint8_t *dest_y,
 | 
				
			||||||
 | 
					                             uint8_t *dest_cb,
 | 
				
			||||||
 | 
					                             uint8_t *dest_cr,
 | 
				
			||||||
 | 
					                             int dir,
 | 
				
			||||||
 | 
					                             uint8_t **ref_picture,
 | 
				
			||||||
 | 
					                             qpel_mc_func (*qpix_op)[16],
 | 
				
			||||||
 | 
					                             op_pixels_func (*pix_op)[4])
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    int dxy, mx, my, src_x, src_y;
 | 
				
			||||||
 | 
					    int i;
 | 
				
			||||||
 | 
					    int mb_x = s->mb_x;
 | 
				
			||||||
 | 
					    int mb_y = s->mb_y;
 | 
				
			||||||
 | 
					    uint8_t *ptr, *dest;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    mx = 0;
 | 
				
			||||||
 | 
					    my = 0;
 | 
				
			||||||
 | 
					    if (s->quarter_sample) {
 | 
				
			||||||
 | 
					        for (i = 0; i < 4; i++) {
 | 
				
			||||||
 | 
					            int motion_x = s->mv[dir][i][0];
 | 
				
			||||||
 | 
					            int motion_y = s->mv[dir][i][1];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            dxy   = ((motion_y & 3) << 2) | (motion_x & 3);
 | 
				
			||||||
 | 
					            src_x = mb_x * 16 + (motion_x >> 2) + (i & 1) * 8;
 | 
				
			||||||
 | 
					            src_y = mb_y * 16 + (motion_y >> 2) + (i >> 1) * 8;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            /* WARNING: do no forget half pels */
 | 
				
			||||||
 | 
					            src_x = av_clip(src_x, -16, s->width);
 | 
				
			||||||
 | 
					            if (src_x == s->width)
 | 
				
			||||||
 | 
					                dxy &= ~3;
 | 
				
			||||||
 | 
					            src_y = av_clip(src_y, -16, s->height);
 | 
				
			||||||
 | 
					            if (src_y == s->height)
 | 
				
			||||||
 | 
					                dxy &= ~12;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            ptr = ref_picture[0] + (src_y * s->linesize) + (src_x);
 | 
				
			||||||
 | 
					            if (s->flags & CODEC_FLAG_EMU_EDGE) {
 | 
				
			||||||
 | 
					                if ((unsigned)src_x > FFMAX(s->h_edge_pos - (motion_x & 3) - 8, 0) ||
 | 
				
			||||||
 | 
					                    (unsigned)src_y > FFMAX(s->v_edge_pos - (motion_y & 3) - 8, 0)) {
 | 
				
			||||||
 | 
					                    s->vdsp.emulated_edge_mc(s->edge_emu_buffer,
 | 
				
			||||||
 | 
					                                             s->linesize, ptr,
 | 
				
			||||||
 | 
					                                             s->linesize,
 | 
				
			||||||
 | 
					                                             9, 9,
 | 
				
			||||||
 | 
					                                             src_x, src_y,
 | 
				
			||||||
 | 
					                                             s->h_edge_pos,
 | 
				
			||||||
 | 
					                                             s->v_edge_pos);
 | 
				
			||||||
 | 
					                    ptr = s->edge_emu_buffer;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            dest = dest_y + ((i & 1) * 8) + (i >> 1) * 8 * s->linesize;
 | 
				
			||||||
 | 
					            qpix_op[1][dxy](dest, ptr, s->linesize);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            mx += s->mv[dir][i][0] / 2;
 | 
				
			||||||
 | 
					            my += s->mv[dir][i][1] / 2;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					        for (i = 0; i < 4; i++) {
 | 
				
			||||||
 | 
					            hpel_motion(s,
 | 
				
			||||||
 | 
					                        dest_y + ((i & 1) * 8) + (i >> 1) * 8 * s->linesize,
 | 
				
			||||||
 | 
					                        ref_picture[0],
 | 
				
			||||||
 | 
					                        mb_x * 16 + (i & 1) * 8,
 | 
				
			||||||
 | 
					                        mb_y * 16 + (i >> 1) * 8,
 | 
				
			||||||
 | 
					                        pix_op[1],
 | 
				
			||||||
 | 
					                        s->mv[dir][i][0],
 | 
				
			||||||
 | 
					                        s->mv[dir][i][1]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            mx += s->mv[dir][i][0];
 | 
				
			||||||
 | 
					            my += s->mv[dir][i][1];
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (!CONFIG_GRAY || !(s->flags & CODEC_FLAG_GRAY))
 | 
				
			||||||
 | 
					        chroma_4mv_motion(s, dest_cb, dest_cr,
 | 
				
			||||||
 | 
					                          ref_picture, pix_op[1], mx, my);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * motion compensation of a single macroblock
 | 
					 * motion compensation of a single macroblock
 | 
				
			||||||
 * @param s context
 | 
					 * @param s context
 | 
				
			||||||
@@ -769,12 +844,8 @@ static av_always_inline void MPV_motion_internal(MpegEncContext *s,
 | 
				
			|||||||
                                                 qpel_mc_func (*qpix_op)[16],
 | 
					                                                 qpel_mc_func (*qpix_op)[16],
 | 
				
			||||||
                                                 int is_mpeg12)
 | 
					                                                 int is_mpeg12)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    int dxy, mx, my, src_x, src_y, motion_x, motion_y;
 | 
					    int i;
 | 
				
			||||||
    int mb_x, mb_y, i;
 | 
					    int mb_y = s->mb_y;
 | 
				
			||||||
    uint8_t *ptr, *dest;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    mb_x = s->mb_x;
 | 
					 | 
				
			||||||
    mb_y = s->mb_y;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    prefetch_motion(s, ref_picture, dir);
 | 
					    prefetch_motion(s, ref_picture, dir);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -810,66 +881,9 @@ static av_always_inline void MPV_motion_internal(MpegEncContext *s,
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
    case MV_TYPE_8X8:
 | 
					    case MV_TYPE_8X8:
 | 
				
			||||||
        if (!is_mpeg12) {
 | 
					        if (!is_mpeg12)
 | 
				
			||||||
            mx = 0;
 | 
					            apply_8x8(s, dest_y, dest_cb, dest_cr,
 | 
				
			||||||
            my = 0;
 | 
					                      dir, ref_picture, qpix_op, pix_op);
 | 
				
			||||||
            if (s->quarter_sample) {
 | 
					 | 
				
			||||||
                for (i = 0; i < 4; i++) {
 | 
					 | 
				
			||||||
                    motion_x = s->mv[dir][i][0];
 | 
					 | 
				
			||||||
                    motion_y = s->mv[dir][i][1];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                    dxy   = ((motion_y & 3) << 2) | (motion_x & 3);
 | 
					 | 
				
			||||||
                    src_x = mb_x * 16 + (motion_x >> 2) + (i & 1) * 8;
 | 
					 | 
				
			||||||
                    src_y = mb_y * 16 + (motion_y >> 2) + (i >> 1) * 8;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                    /* WARNING: do no forget half pels */
 | 
					 | 
				
			||||||
                    src_x = av_clip(src_x, -16, s->width);
 | 
					 | 
				
			||||||
                    if (src_x == s->width)
 | 
					 | 
				
			||||||
                        dxy &= ~3;
 | 
					 | 
				
			||||||
                    src_y = av_clip(src_y, -16, s->height);
 | 
					 | 
				
			||||||
                    if (src_y == s->height)
 | 
					 | 
				
			||||||
                            dxy &= ~12;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                    ptr = ref_picture[0] + (src_y * s->linesize) + (src_x);
 | 
					 | 
				
			||||||
                    if (s->flags & CODEC_FLAG_EMU_EDGE) {
 | 
					 | 
				
			||||||
                        if ((unsigned)src_x > FFMAX(s->h_edge_pos - (motion_x & 3) - 8, 0) ||
 | 
					 | 
				
			||||||
                            (unsigned)src_y > FFMAX(s->v_edge_pos - (motion_y & 3) - 8, 0)) {
 | 
					 | 
				
			||||||
                            s->vdsp.emulated_edge_mc(s->edge_emu_buffer,
 | 
					 | 
				
			||||||
                                                     s->linesize, ptr,
 | 
					 | 
				
			||||||
                                                     s->linesize,
 | 
					 | 
				
			||||||
                                                     9, 9,
 | 
					 | 
				
			||||||
                                                     src_x, src_y,
 | 
					 | 
				
			||||||
                                                     s->h_edge_pos,
 | 
					 | 
				
			||||||
                                                     s->v_edge_pos);
 | 
					 | 
				
			||||||
                            ptr = s->edge_emu_buffer;
 | 
					 | 
				
			||||||
                        }
 | 
					 | 
				
			||||||
                    }
 | 
					 | 
				
			||||||
                    dest = dest_y + ((i & 1) * 8) + (i >> 1) * 8 * s->linesize;
 | 
					 | 
				
			||||||
                    qpix_op[1][dxy](dest, ptr, s->linesize);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                    mx += s->mv[dir][i][0] / 2;
 | 
					 | 
				
			||||||
                    my += s->mv[dir][i][1] / 2;
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
            } else {
 | 
					 | 
				
			||||||
                for (i = 0; i < 4; i++) {
 | 
					 | 
				
			||||||
                    hpel_motion(s,
 | 
					 | 
				
			||||||
                                dest_y + ((i & 1) * 8) + (i >> 1) * 8 * s->linesize,
 | 
					 | 
				
			||||||
                                ref_picture[0],
 | 
					 | 
				
			||||||
                                mb_x * 16 + (i & 1) * 8,
 | 
					 | 
				
			||||||
                                mb_y * 16 + (i >> 1) * 8,
 | 
					 | 
				
			||||||
                                pix_op[1],
 | 
					 | 
				
			||||||
                                s->mv[dir][i][0],
 | 
					 | 
				
			||||||
                                s->mv[dir][i][1]);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                    mx += s->mv[dir][i][0];
 | 
					 | 
				
			||||||
                    my += s->mv[dir][i][1];
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            if (!CONFIG_GRAY || !(s->flags & CODEC_FLAG_GRAY))
 | 
					 | 
				
			||||||
                chroma_4mv_motion(s, dest_cb, dest_cr,
 | 
					 | 
				
			||||||
                                  ref_picture, pix_op[1], mx, my);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
    case MV_TYPE_FIELD:
 | 
					    case MV_TYPE_FIELD:
 | 
				
			||||||
        if (s->picture_structure == PICT_FRAME) {
 | 
					        if (s->picture_structure == PICT_FRAME) {
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user