From patchwork Thu Feb 8 17:03:24 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nekopanda X-Patchwork-Id: 7530 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.2.150.1 with SMTP id c1csp2102409jai; Thu, 8 Feb 2018 09:04:01 -0800 (PST) X-Google-Smtp-Source: AH8x224+9awYVwGM0D2AYlzJpMOERLG59Y+G3FebLhFPfWYnn/sluTf+Yc2tNinHTNX5FPsAn9kz X-Received: by 10.28.135.208 with SMTP id j199mr1621283wmd.151.1518109441879; Thu, 08 Feb 2018 09:04:01 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1518109441; cv=none; d=google.com; s=arc-20160816; b=VMghBZreiqP53mbEDR+i1f05UsLjFujF93/P3hJm2L7+AfrHmh/3hXGX7s3DkWodJB Rmgnc8JWMr/yLZtyxs660U1vod/YcT732XsmgHqVypeL3msDI23AMt/WsyjZWOfzt+7g HeoZj7VCFm1fHEkbFXgPH7Rqsnftcinh3taqyZ/0DMRRpnHKGK4gbjXKerRBRy7FrOmf symz0AWtBg+uOE8EvrXJ26pAU3LjosR1UCwfqwNMrIba/3FeFMaky0qUaz38FVFWBYAW aUOcZsDovKi/jL0vIGJbVMeCDplhbGc9d96HD2D8iS87woN2QzKJTUw4TFSfxZBkq252 4OVQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:message-id:date:to:from :domainkey-signature:dkim-signature:delivered-to :arc-authentication-results; bh=52QKIHSAW+CWJzsY9zzFg236wrRUky55ByKvXHigenI=; b=pjuXdjXn9JOTFu2CejidOh+3pyAGfolMwEA/ZHGW102CQRW1wo0mRWxDy9vytGWZ11 gCR5NVOpbPy47OBA9uy7jTenOhHdbQg73QL8qvVrM8JwO5kSOT+dSvKXvDdYFtI2KI3z 4U0hW3lCL0vVHVHjN1qzR20XDYoYPxgfVy8E8e2mvBPCmr4PYqZcbmwN6Y0K+GHbmz+a A64k5wM4sBKQpPt+giKQ9Ugix0OUq1RKZ7XStFE7wKF8sxeOdA8XHJFVum1VWd0AicNi k3D7QHvTvz8NLWPMwlSFRzesKzw9hCq3inuSAHBp9g4C9SQ8ywdVzRpEB1M8h5HP/9kk bGZg== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@yahoo.co.jp header.s=yj20110701 header.b=ZVMme/Ev; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id q195si220410wme.154.2018.02.08.09.04.01; Thu, 08 Feb 2018 09:04:01 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@yahoo.co.jp header.s=yj20110701 header.b=ZVMme/Ev; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 8D34568987F; Thu, 8 Feb 2018 19:03:50 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from nh605-vm3.bullet.mail.ssk.yahoo.co.jp (nh605-vm3.bullet.mail.ssk.yahoo.co.jp [182.22.90.76]) by ffbox0-bg.mplayerhq.hu (Postfix) with SMTP id 3C04B68023A for ; Thu, 8 Feb 2018 19:03:42 +0200 (EET) Received: from [182.22.66.104] by nh605.bullet.mail.ssk.yahoo.co.jp with NNFMP; 08 Feb 2018 17:03:50 -0000 Received: from [182.22.91.130] by t602.bullet.mail.ssk.yahoo.co.jp with NNFMP; 08 Feb 2018 17:03:50 -0000 Received: from [127.0.0.1] by omp603.mail.ssk.yahoo.co.jp with NNFMP; 08 Feb 2018 17:03:50 -0000 X-Yahoo-Newman-Property: ymail-3 X-Yahoo-Newman-Id: 282181.98384.bm@omp603.mail.ssk.yahoo.co.jp Received: (qmail 66828 invoked by alias); 8 Feb 2018 17:03:50 -0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.co.jp; s=yj20110701; t=1518109430; bh=1K43Fw2hv8vSezYp74doP7Swvs/u4vyss2ylZMxEk84=; h=Received:X-YMail-JAS:X-Apparently-From:X-YMail-OSG:From:To:Cc:Subject:Date:Message-Id:X-Mailer; b=ZVMme/EvuLSsMfeGX6K20pXMv5CWgWyxW45LywgMqSTcGlj+kaCE0W2oAyIfWjcoXm6ILh/O5zZ+i/oT6sZhninnSzSpTLZkYZ8/oPg+vpwkXwLDMA0Xn+nua5cvEPeNK2IC3nJNAlGSp5bhcq2os2s5D9UENm9A3cUNNqMgxrs= DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=yj20110701; d=yahoo.co.jp; h=Received:X-YMail-JAS:X-Apparently-From:X-YMail-OSG:From:To:Cc:Subject:Date:Message-Id:X-Mailer; b=uCJQUCuNFoNKokLCFq+3lR67aFNCrngpdvdQviYJ93u1g/tcINAn0rLWwjmLljbzydqDsu4ylfwd27w0BsoZuDqDUAS2FGNx4e+EeUQIdLJA7KXzi+KrYr6Bt9xTsE8H7DG0HoSz4xCnN0/sp0egZKGdOHoR7zyCV+immsj81G4= ; Received: from unknown (HELO localhost.localdomain) (118.15.80.234 with login) by smtp601.mail.ssk.yahoo.co.jp with SMTP; 8 Feb 2018 17:03:50 -0000 X-YMail-JAS: PLKnFKcVM1napE57Zg92XDs2l8uFr2ickFNAyXLjcBKFPsZAiJ5wWKlR3nHIGZ36raMFoXWYksaLd7x4PRMfU2c4J1bs0vMMfiytljrEyWj9K2X.V0nDpBRA.l6FDa9mgA-- X-Apparently-From: X-YMail-OSG: BLEXF8oVM1n4LBFG5HiHnCGOS9DJA3unO6EI4BzTrl5axbf atjcMLf.goBwpO.yTM7FkLjCdDMfsZGOqPLPWD2d5XEcDr.e74qhsoa24qcz DjHWUknwQ6waKshFAjFqOAA0w5LncE5Mb7gC364fU6S8T.BSMx97WJX_n7TM i3.8K1GTGi6jvuDyB_fTJqK7FW6XcZ_.4FI3333YXQ2ecwqDPy0qPl1QCjYF kp9w9bnkrqDrrirxOH5ZUI8CZMo6pqdWEVf2pKVCugNhZ2MTdRLudvdUqmlu yMV9W8WdAU2_Qr7xroE8jfKCyXk9dNqKU3w11Xz8GymJ.Znvt97RRqPkRq2x Y_K31g0z1ipPAmrDIwO2OX6xTjmpFd4KRHqeTZ6lmHnucwxxY5H8up2zgVJb 2An8nIPbOE3r1ttZDxHOls.jkwuPhey5XfDXpKZI5Jnv8rswRIkTVmhFyECp 2pFNEU.hbaEi8CYkiHzpbbqdNrw41NEcOn6snuMOzdgPOvOVpPwF7yXbniBf UlPULHIRIe5LQigRNjjo4KE05dbHFJxx8ztKKbE6M7y473c16oGimcV8N4yf v7DdltyKEti3tklXDjq6nS6TRZpwlWvvPhlFscECYt5k- From: Nekopanda To: ffmpeg-devel@ffmpeg.org Date: Fri, 9 Feb 2018 02:03:24 +0900 Message-Id: <1518109404-29932-1-git-send-email-pianoyayaninth@yahoo.co.jp> X-Mailer: git-send-email 2.6.3.windows.1 Subject: [FFmpeg-devel] [PATCH] mpeg2dec: fix decoding field pictures X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Cc: Nekopanda MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" - Fix field selection for skipped macroblocks For B field pictures, the spec says, > The prediction shall be made from the field of the same parity as the field being predicted. I did it. - Fix motion vector rounding for chroma components In 16x8 motion compensation, for lower 16x8 region, the input to mpeg_motion() for motion_y was "motion_y + 16", which causes wrong rounding. For 4:2:0, chroma scaling for y is dividing by two and rounding toward zero. When motion_y < 0 and motion_y + 16 > 0, the rounding direction of "motion_y" and "motion_y + 16" is different and rounding "motion_y + 16" would be incorrect. We should input "motion_y" as is to round correctly. I add "is_16x8" flag to do that. --- libavcodec/mpeg12dec.c | 2 ++ libavcodec/mpegvideo_motion.c | 30 ++++++++++++++++-------------- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/libavcodec/mpeg12dec.c b/libavcodec/mpeg12dec.c index f5f2c69..9e076e8 100644 --- a/libavcodec/mpeg12dec.c +++ b/libavcodec/mpeg12dec.c @@ -1969,6 +1969,8 @@ static int mpeg_decode_slice(MpegEncContext *s, int mb_y, s->mv[0][0][1] = s->last_mv[0][0][1]; s->mv[1][0][0] = s->last_mv[1][0][0]; s->mv[1][0][1] = s->last_mv[1][0][1]; + s->field_select[0][0] = (s->picture_structure - 1) & 1; + s->field_select[1][0] = (s->picture_structure - 1) & 1; } } } diff --git a/libavcodec/mpegvideo_motion.c b/libavcodec/mpegvideo_motion.c index c913504..5624c10 100644 --- a/libavcodec/mpegvideo_motion.c +++ b/libavcodec/mpegvideo_motion.c @@ -239,20 +239,22 @@ void mpeg_motion_internal(MpegEncContext *s, int motion_y, int h, int is_mpeg12, + int is_16x8, int mb_y) { uint8_t *ptr_y, *ptr_cb, *ptr_cr; int dxy, uvdxy, mx, my, src_x, src_y, - uvsrc_x, uvsrc_y, v_edge_pos; + uvsrc_x, uvsrc_y, v_edge_pos, block_y_half; ptrdiff_t uvlinesize, linesize; v_edge_pos = s->v_edge_pos >> field_based; linesize = s->current_picture.f->linesize[0] << field_based; uvlinesize = s->current_picture.f->linesize[1] << field_based; + block_y_half = (field_based | is_16x8); dxy = ((motion_y & 1) << 1) | (motion_x & 1); src_x = s->mb_x * 16 + (motion_x >> 1); - src_y = (mb_y << (4 - field_based)) + (motion_y >> 1); + src_y = (mb_y << (4 - block_y_half)) + (motion_y >> 1); if (!is_mpeg12 && s->out_format == FMT_H263) { if ((s->workaround_bugs & FF_BUG_HPEL_CHROMA) && field_based) { @@ -260,7 +262,7 @@ void mpeg_motion_internal(MpegEncContext *s, my = motion_y >> 1; uvdxy = ((my & 1) << 1) | (mx & 1); uvsrc_x = s->mb_x * 8 + (mx >> 1); - uvsrc_y = (mb_y << (3 - field_based)) + (my >> 1); + uvsrc_y = (mb_y << (3 - block_y_half)) + (my >> 1); } else { uvdxy = dxy | (motion_y & 2) | ((motion_x & 2) >> 1); uvsrc_x = src_x >> 1; @@ -279,7 +281,7 @@ void mpeg_motion_internal(MpegEncContext *s, my = motion_y / 2; uvdxy = ((my & 1) << 1) | (mx & 1); uvsrc_x = s->mb_x * 8 + (mx >> 1); - uvsrc_y = (mb_y << (3 - field_based)) + (my >> 1); + uvsrc_y = (mb_y << (3 - block_y_half)) + (my >> 1); } else { if (s->chroma_x_shift) { // Chroma422 @@ -370,18 +372,18 @@ static void mpeg_motion(MpegEncContext *s, uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr, int field_select, uint8_t **ref_picture, op_pixels_func (*pix_op)[4], - int motion_x, int motion_y, int h, int mb_y) + int motion_x, int motion_y, int h, int is_16x8, int mb_y) { #if !CONFIG_SMALL if (s->out_format == FMT_MPEG1) mpeg_motion_internal(s, dest_y, dest_cb, dest_cr, 0, 0, field_select, ref_picture, pix_op, - motion_x, motion_y, h, 1, mb_y); + motion_x, motion_y, h, 1, is_16x8, mb_y); else #endif mpeg_motion_internal(s, dest_y, dest_cb, dest_cr, 0, 0, field_select, ref_picture, pix_op, - motion_x, motion_y, h, 0, mb_y); + motion_x, motion_y, h, 0, is_16x8, mb_y); } static void mpeg_motion_field(MpegEncContext *s, uint8_t *dest_y, @@ -395,12 +397,12 @@ static void mpeg_motion_field(MpegEncContext *s, uint8_t *dest_y, if (s->out_format == FMT_MPEG1) mpeg_motion_internal(s, dest_y, dest_cb, dest_cr, 1, bottom_field, field_select, ref_picture, pix_op, - motion_x, motion_y, h, 1, mb_y); + motion_x, motion_y, h, 1, 0, mb_y); else #endif mpeg_motion_internal(s, dest_y, dest_cb, dest_cr, 1, bottom_field, field_select, ref_picture, pix_op, - motion_x, motion_y, h, 0, mb_y); + motion_x, motion_y, h, 0, 0, mb_y); } // FIXME: SIMDify, avg variant, 16x16 version @@ -870,7 +872,7 @@ static av_always_inline void mpv_motion_internal(MpegEncContext *s, } else { mpeg_motion(s, dest_y, dest_cb, dest_cr, 0, ref_picture, pix_op, - s->mv[dir][0][0], s->mv[dir][0][1], 16, mb_y); + s->mv[dir][0][0], s->mv[dir][0][1], 16, 0, mb_y); } break; case MV_TYPE_8X8: @@ -907,7 +909,7 @@ static av_always_inline void mpv_motion_internal(MpegEncContext *s, mpeg_motion(s, dest_y, dest_cb, dest_cr, s->field_select[dir][0], ref_picture, pix_op, - s->mv[dir][0][0], s->mv[dir][0][1], 16, mb_y >> 1); + s->mv[dir][0][0], s->mv[dir][0][1], 16, 0, mb_y >> 1); } break; case MV_TYPE_16X8: @@ -924,8 +926,8 @@ static av_always_inline void mpv_motion_internal(MpegEncContext *s, mpeg_motion(s, dest_y, dest_cb, dest_cr, s->field_select[dir][i], ref2picture, pix_op, - s->mv[dir][i][0], s->mv[dir][i][1] + 16 * i, - 8, mb_y >> 1); + s->mv[dir][i][0], s->mv[dir][i][1], + 8, 1, (mb_y & ~1) + i); dest_y += 16 * s->linesize; dest_cb += (16 >> s->chroma_y_shift) * s->uvlinesize; @@ -952,7 +954,7 @@ static av_always_inline void mpv_motion_internal(MpegEncContext *s, s->picture_structure != i + 1, ref_picture, pix_op, s->mv[dir][2 * i][0], s->mv[dir][2 * i][1], - 16, mb_y >> 1); + 16, 0, mb_y >> 1); // after put we make avg of the same block pix_op = s->hdsp.avg_pixels_tab;