From patchwork Sat Oct 15 22:09:42 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 1014 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.103.140.133 with SMTP id o127csp357106vsd; Sat, 15 Oct 2016 15:21:55 -0700 (PDT) X-Received: by 10.194.64.36 with SMTP id l4mr7660274wjs.163.1476570115603; Sat, 15 Oct 2016 15:21:55 -0700 (PDT) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id lh9si8930290wjc.188.2016.10.15.15.21.54; Sat, 15 Oct 2016 15:21:55 -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; 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 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 153E668922A; Sun, 16 Oct 2016 01:21:51 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-yw0-f193.google.com (mail-yw0-f193.google.com [209.85.161.193]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id A91066891EF for ; Sun, 16 Oct 2016 01:21:43 +0300 (EEST) Received: by mail-yw0-f193.google.com with SMTP id w3so5398934ywg.0 for ; Sat, 15 Oct 2016 15:21:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:subject:date:message-id; bh=FapZwA7BhpXXOFL9nTk0QvWsLDmVW2WaQLdH7tB9hxg=; b=G5eicpVqmByAdIge/Wd4ldbonyy3pWABJkiZdu4jpP+f8g6VhrIEwr85fCbf3XykRf 1evKBHrKgFd3qXlmkew77cEulospPf50tyZtm74L2F9X5mZAYWeXG2NTP7nxhLldRZrU fXQA1YyEh1Aqf6GJFntJN0ZCGwfmw2ORQlIlPe/j0krZeJ2mHiJ5Z2yjaeVNk4sPNz1i hImZjm+KAmivIAzJLgGvwh/Sln7dSeqMXrouIt+4uy3VpYUxszkeYKOOOL7p97xOfHER YlV9m4u0HaL8wh8BGRIhVFFLsKA3B0eZeHHUeVlCW23H0CO/szCO8qWx9DnhC3nzuXRA Beyg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:subject:date:message-id; bh=FapZwA7BhpXXOFL9nTk0QvWsLDmVW2WaQLdH7tB9hxg=; b=RFzB3v6n2Iu6yXaY15ERkbulp9tKbj5ibki6ZQRJaVYFwDN7r4Xvehgy4XNK6BYKYk OI0MdssPcb34fgy3baPYcGLTOSiG68HWZxqcVBe4r/op8d3vFgBckBFkxevstRufj7J1 fP2Nk2R1c58Ar4m/N0yfm6WnbivRdw7jE7rR6xnFXkRNjfi30vvz8GRPHBwh1lDpqs1H ttH7TnvUKyC6II5PO4BZ2TNZkBwl66u2Toy5EiSMlLgRL7BG4X8x57GgHyOkRal+rLUz ZPu4K6cFnW1Cd8DuNARzjS6l0do7Ggr4T6nDy4jyUB0gvTG7hWLbm62zdnckKzxzCJ3w XYcw== X-Gm-Message-State: AA6/9RlOXhLvk+g16Fdam/k8FA1TCjiprW84B4+JG4kjj00H1SJiqZ4X3s/sUhuOUD20JQ== X-Received: by 10.129.138.194 with SMTP id a185mr16276214ywg.246.1476569397603; Sat, 15 Oct 2016 15:09:57 -0700 (PDT) Received: from localhost.localdomain ([181.22.59.227]) by smtp.gmail.com with ESMTPSA id i63sm8964498ywg.5.2016.10.15.15.09.56 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Sat, 15 Oct 2016 15:09:57 -0700 (PDT) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Sat, 15 Oct 2016 19:09:42 -0300 Message-Id: <20161015220943.660-1-jamrial@gmail.com> X-Mailer: git-send-email 2.9.1 Subject: [FFmpeg-devel] [PATCH 1/2] avformat/matroskadec: set aspect ratio only when DisplayWidth and DisplayHeight are in pixels 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" A missing DisplayUnit element or one with the default value of 0 means DisplayWidth and DisplayHeight should be interpreted as pixels. The current code setting st->sample_aspect_ratio is wrong when DisplayUnit is anything else. Signed-off-by: James Almer --- libavformat/matroska.h | 8 ++++++++ libavformat/matroskadec.c | 14 ++++++++------ 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/libavformat/matroska.h b/libavformat/matroska.h index 15e401c..8ad89da 100644 --- a/libavformat/matroska.h +++ b/libavformat/matroska.h @@ -309,6 +309,14 @@ typedef enum { MATROSKA_VIDEO_STEREOMODE_TYPE_NB, } MatroskaVideoStereoModeType; +typedef enum { + MATROSKA_VIDEO_DISPLAYUNIT_PIXELS = 0, + MATROSKA_VIDEO_DISPLAYUNIT_CENTIMETERS = 1, + MATROSKA_VIDEO_DISPLAYUNIT_INCHES = 2, + MATROSKA_VIDEO_DISPLAYUNIT_DAR = 3, + MATROSKA_VIDEO_DISPLAYUNIT_UNKNOWN = 4, +} MatroskaVideoDisplayUnit; + /* * Matroska Codec IDs, strings */ diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c index cfe4692..a0afbb9 100644 --- a/libavformat/matroskadec.c +++ b/libavformat/matroskadec.c @@ -168,6 +168,7 @@ typedef struct MatroskaTrackVideo { uint64_t pixel_width; uint64_t pixel_height; EbmlBin color_space; + uint64_t display_unit; uint64_t interlaced; uint64_t field_order; uint64_t stereo_mode; @@ -436,7 +437,7 @@ static const EbmlSyntax matroska_track_video[] = { { MATROSKA_ID_VIDEOPIXELCROPT, EBML_NONE }, { MATROSKA_ID_VIDEOPIXELCROPL, EBML_NONE }, { MATROSKA_ID_VIDEOPIXELCROPR, EBML_NONE }, - { MATROSKA_ID_VIDEODISPLAYUNIT, EBML_NONE }, + { MATROSKA_ID_VIDEODISPLAYUNIT, EBML_UINT, 0, offsetof(MatroskaTrackVideo, display_unit), { .u= MATROSKA_VIDEO_DISPLAYUNIT_PIXELS } }, { MATROSKA_ID_VIDEOFLAGINTERLACED, EBML_UINT, 0, offsetof(MatroskaTrackVideo, interlaced), { .u = MATROSKA_VIDEO_INTERLACE_FLAG_UNDETERMINED } }, { MATROSKA_ID_VIDEOFIELDORDER, EBML_UINT, 0, offsetof(MatroskaTrackVideo, field_order), { .u = MATROSKA_VIDEO_FIELDORDER_UNDETERMINED } }, { MATROSKA_ID_VIDEOSTEREOMODE, EBML_UINT, 0, offsetof(MatroskaTrackVideo, stereo_mode), { .u = MATROSKA_VIDEO_STEREOMODE_TYPE_NB } }, @@ -2300,11 +2301,12 @@ static int matroska_parse_tracks(AVFormatContext *s) if (track->video.stereo_mode && track->video.stereo_mode < MATROSKA_VIDEO_STEREOMODE_TYPE_NB) mkv_stereo_mode_display_mul(track->video.stereo_mode, &display_width_mul, &display_height_mul); - av_reduce(&st->sample_aspect_ratio.num, - &st->sample_aspect_ratio.den, - st->codecpar->height * track->video.display_width * display_width_mul, - st->codecpar->width * track->video.display_height * display_height_mul, - 255); + if (track->video.display_unit == MATROSKA_VIDEO_DISPLAYUNIT_PIXELS) + av_reduce(&st->sample_aspect_ratio.num, + &st->sample_aspect_ratio.den, + st->codecpar->height * track->video.display_width * display_width_mul, + st->codecpar->width * track->video.display_height * display_height_mul, + 255); if (st->codecpar->codec_id != AV_CODEC_ID_HEVC) st->need_parsing = AVSTREAM_PARSE_HEADERS;