From patchwork Fri Sep 8 00:49:54 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 5053 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.2.15.201 with SMTP id 70csp825112jao; Thu, 7 Sep 2017 17:50:48 -0700 (PDT) X-Received: by 10.223.153.117 with SMTP id x108mr671024wrb.202.1504831848714; Thu, 07 Sep 2017 17:50:48 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1504831848; cv=none; d=google.com; s=arc-20160816; b=CgT5xz6yD1918/giFJgoSxtQJXC15tUV+HoBInw7ClsLx4ccgk2ezf2pHCXCMERar4 2RRdKRYjjwqsPuxX15xKim1l/mMtHv5RycnZ4XI1v9nYKAspjpF/EDj0wfzKlrrVyWlw 3awHyniQG+U3qKpKSjJFin9sjWcBrk77ERQx5PbbDH37MUCLrSywFQ7bwTY7Mg1vK7FI Orjv3snUEJBEmGJqt0SbalEWB4OOLpvE6FCshqy3+WCNhKngK9Iobqm9eLglR7cNLWy0 8bg/BtKocCVBAuv5PDgcRI5lyza2sjL15v/MU6E/UUCgFRGNvrKZ/XJLBklRPn2UY8CD uVQQ== 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:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:message-id:date:to:from:dkim-signature :delivered-to:arc-authentication-results; bh=syR9zlOMbh7E0o48/xwnyeCSmel0H80F57HV7nEB7po=; b=UesYi79qQj19CZLbMX5hh15mHxVJgFYA6s2FXYt5dzQvFSqH3H0uXKR7HtRBdc0r3b sg7tCdSzMQiNFoVjWF2xfMynErN5i133Dsk4D88wsr4HGP1PYr+aTG7FCp+3Vb3e6Xkm gLRL5gkeuo7bgKxhPe6vfyEP9KBaw2XFPqEXeDxrM9oAwKwLjPqzUOibftr3DyKUd67/ UITkB75dqiwbt7X+WxJ0wHo/cgi1ZxhbgZWE+VdH/K+7TogS9xfng3ljf31m3yCGIMgC 0YTvG3jY8hzJVFqBBDH13XhxWecEln05xnDhr7UZdjigTfeBOPxGMFZk5ckNRFh45NMI XVsQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=ffiyza64; 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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id m24si443729wrb.290.2017.09.07.17.50.47; Thu, 07 Sep 2017 17:50:48 -0700 (PDT) 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=@gmail.com header.s=20161025 header.b=ffiyza64; 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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id B5DD3689E34; Fri, 8 Sep 2017 03:50:42 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qt0-f195.google.com (mail-qt0-f195.google.com [209.85.216.195]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 5FB25680D4E for ; Fri, 8 Sep 2017 03:50:36 +0300 (EEST) Received: by mail-qt0-f195.google.com with SMTP id q8so768151qtb.1 for ; Thu, 07 Sep 2017 17:50:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id; bh=qsYjXutoM+NbzxH9OQAynlZtQoQezOgrv6Ojpr2IhdI=; b=ffiyza64/mnmee3zwM0mQ5y0Dz0ne13qBoMnjTchQzL3y4grme871Y2f4Pt2Lr9EyW A2aWvk/YW5cJBDo17GcGJjVolpyzVJNbyPusQnDONl6Vc+cIwM3gS4bZ8GCahC2vDexF ZI7rHy2we9001QVggu1Ns4+Co4Ufap24HHuhyrenGKldE29qRcNKNl+Fk7GTi3BYmW+X qKGz7o57sjaecOfQtTCiSrfbx7ggIjNsDF4X4iYkst5yRIYvg4GaEvv1mRoDby+Vu5k5 +ZLBFUybE61jt3BngbFSwMBMfN3QgMxDQapRZ8jgKZGUJDRT8oicGlzu4JabFjZWZpXl 2m3Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id; bh=qsYjXutoM+NbzxH9OQAynlZtQoQezOgrv6Ojpr2IhdI=; b=IWvEH+iAU4p8f1Vw1Rm+e9KQqizAX6OjPi/obtpDvztolMA7h3U5pqDy80RdRGF9rO XQ/O3cBNsKTlfvfvicr4YUbM3gtprD3pKCdnniCRNX8DExWhrX2aP2LBu1NDVQoSij4t SQw7NW1503IjLV69QmihxsH6wLrPdN0LW5dawwEwcHEDkwKYthdCSvz0K2368ZjxJbc8 Ob0VNHTv5QgiBEIx6q8c4lDfyOMqBj8LyKB4jz1sy5+7PikF+pf0J8CNctyOLhaZ3GAL iPYj59jKpcBwOxqBaTf9EdNnzvFOoHTHMOWqEOUL0EB1q8RYfiA8UOgJ9Sn8rDCQBcFC rhFQ== X-Gm-Message-State: AHPjjUi8fgXProoQSKiOJ/r9QoUA4qj5/GezDsY8TmvhZn7bc6uKG95x fIi0Nro0blYVng93 X-Google-Smtp-Source: AOwi7QBLpWvxp1Dp1RcIZVexVLUQ+UIUyNLI99Br+YClF3kqC1OmvIEBdIBUXibCg5+Uu6JNbfxppA== X-Received: by 10.200.3.4 with SMTP id q4mr1612733qtg.200.1504831839009; Thu, 07 Sep 2017 17:50:39 -0700 (PDT) Received: from localhost.localdomain ([181.231.60.193]) by smtp.gmail.com with ESMTPSA id n87sm521341qkh.18.2017.09.07.17.50.37 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 07 Sep 2017 17:50:38 -0700 (PDT) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Thu, 7 Sep 2017 21:49:54 -0300 Message-Id: <20170908004954.2100-1-jamrial@gmail.com> X-Mailer: git-send-email 2.13.3 Subject: [FFmpeg-devel] [PATCH] avcodec/hevc_ps: improve check for missing default display window bitstream 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 MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Fixes ticket #6644 Signed-off-by: James Almer --- libavcodec/hevc_ps.c | 33 +++++++++++++++++++++++++++------ 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/libavcodec/hevc_ps.c b/libavcodec/hevc_ps.c index ee31cc093c..eb104ca1b9 100644 --- a/libavcodec/hevc_ps.c +++ b/libavcodec/hevc_ps.c @@ -550,7 +550,7 @@ err: static void decode_vui(GetBitContext *gb, AVCodecContext *avctx, int apply_defdispwin, HEVCSPS *sps) { - VUI *vui = &sps->vui; + VUI backup_vui, *vui = &sps->vui; GetBitContext backup; int sar_present, alt = 0; @@ -618,13 +618,14 @@ static void decode_vui(GetBitContext *gb, AVCodecContext *avctx, vui->field_seq_flag = get_bits1(gb); vui->frame_field_info_present_flag = get_bits1(gb); + // Backup context in case an alternate header is detected + memcpy(&backup, gb, sizeof(backup)); + memcpy(&backup_vui, vui, sizeof(backup_vui)); if (get_bits_left(gb) >= 68 && show_bits_long(gb, 21) == 0x100000) { vui->default_display_window_flag = 0; av_log(avctx, AV_LOG_WARNING, "Invalid default display window\n"); } else vui->default_display_window_flag = get_bits1(gb); - // Backup context in case an alternate header is detected - memcpy(&backup, gb, sizeof(backup)); if (vui->default_display_window_flag) { int vert_mult = 1 + (sps->chroma_format_idc < 2); @@ -651,18 +652,19 @@ static void decode_vui(GetBitContext *gb, AVCodecContext *avctx, } } +timing_info: vui->vui_timing_info_present_flag = get_bits1(gb); if (vui->vui_timing_info_present_flag) { - if( get_bits_left(gb) < 66) { + if( get_bits_left(gb) < 66 && !alt) { // The alternate syntax seem to have timing info located // at where def_disp_win is normally located av_log(avctx, AV_LOG_WARNING, "Strange VUI timing information, retrying...\n"); - vui->default_display_window_flag = 0; - memset(&vui->def_disp_win, 0, sizeof(vui->def_disp_win)); + memcpy(vui, &backup_vui, sizeof(backup_vui)); memcpy(gb, &backup, sizeof(backup)); alt = 1; + goto timing_info; } vui->vui_num_units_in_tick = get_bits_long(gb, 32); vui->vui_time_scale = get_bits_long(gb, 32); @@ -680,6 +682,15 @@ static void decode_vui(GetBitContext *gb, AVCodecContext *avctx, vui->bitstream_restriction_flag = get_bits1(gb); if (vui->bitstream_restriction_flag) { + if (get_bits_left(gb) < 8 && !alt) { + av_log(avctx, AV_LOG_WARNING, + "Strange VUI bitstream restriction information, retrying" + " from timing information...\n"); + memcpy(vui, &backup_vui, sizeof(backup_vui)); + memcpy(gb, &backup, sizeof(backup)); + alt = 1; + goto timing_info; + } vui->tiles_fixed_structure_flag = get_bits1(gb); vui->motion_vectors_over_pic_boundaries_flag = get_bits1(gb); vui->restricted_ref_pic_lists_flag = get_bits1(gb); @@ -689,6 +700,16 @@ static void decode_vui(GetBitContext *gb, AVCodecContext *avctx, vui->log2_max_mv_length_horizontal = get_ue_golomb_long(gb); vui->log2_max_mv_length_vertical = get_ue_golomb_long(gb); } + + if (get_bits_left(gb) < 1 && !alt) { + // XXX: Alternate syntax when sps_range_extension_flag != 0? + av_log(avctx, AV_LOG_WARNING, + "Overread in VUI, retrying from timing information...\n"); + memcpy(vui, &backup_vui, sizeof(backup_vui)); + memcpy(gb, &backup, sizeof(backup)); + alt = 1; + goto timing_info; + } } static void set_default_scaling_list_data(ScalingList *sl)