From patchwork Mon Dec 5 02:36:05 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 1675 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.103.65.86 with SMTP id o83csp1408183vsa; Sun, 4 Dec 2016 18:50:17 -0800 (PST) X-Received: by 10.28.197.6 with SMTP id v6mr6535780wmf.130.1480906217769; Sun, 04 Dec 2016 18:50:17 -0800 (PST) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id d82si11111745wmd.67.2016.12.04.18.50.17; Sun, 04 Dec 2016 18:50:17 -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=@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 39C03689FB5; Mon, 5 Dec 2016 04:50:06 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qt0-f196.google.com (mail-qt0-f196.google.com [209.85.216.196]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 0EF3C689AEA for ; Mon, 5 Dec 2016 04:50:00 +0200 (EET) Received: by mail-qt0-f196.google.com with SMTP id n34so34183802qtb.3 for ; Sun, 04 Dec 2016 18:50:09 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:subject:date:message-id; bh=g0sdjsfSwTCz+SgKC+56d8NAxeRsLQaQtbGsAlwCaY8=; b=BWSS+QQkJrFrEAQhvePJbX3tneUNoo6ZfHc41/hY9KI5lvv/f2bM9CQ4nONCvNCovh 0RMTlJL579khNywq7X6g36iP2fMiGrEqNnU0iYTWPuiIPb3OVeAyqdtc6dfDyPh1d8bM //9kP2ja9fagR56pcVKzcDQLSi1yig3/fT/TNnuS/XQo5rzxZGQbg9r7yL7qYY56mYXD KlMAAQTEBMYlLTm7ddQhhoRMaPEJeiVKwhNXVzToTUn3dxsEwkJw/umhWRpKmVH4XsDv DJBbjzLV5j8a1otdxvSv+0pV1hkGd3kWrtkRd3t8ncJpyz7wPnmh2S2y4qq+KUyWRHlU PZig== 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=g0sdjsfSwTCz+SgKC+56d8NAxeRsLQaQtbGsAlwCaY8=; b=AdCJWM/Ze0PX/QYkF0uPQj9rPeyJTXknK8q6/smQfzDB3mZDrE/vjYI0gR7aIn8x94 O0wOyJR5r52aCenbTcD678BqvFnK2/uL3UXhEosGy7sOEThCcBbwPSB07sxfAqRSXA0r FAjfzHFq/zCX13OeikUrf8OLV9ZO89yXFCkTyBim9NEF8DyagEpCaCz1D42eDLxUDgGf MXxPWrIOYvl95JJIbcPEGWA+ftuqDpmiX/vRJ/DQMWVhXGkgo7BFYz9OCICxPG9e9a86 vLbej9Jcr446vqSVEsJSO4HSN0xV8xKTyJSA0XAHxWfYiyeyjw3eHqmpUFdpi8PM/iwI BpOg== X-Gm-Message-State: AKaTC03XlN2Dq20dD6oJx32j7m1g67X12i1aXk5x0BJPXrLlKgckey+9+YQ0iKYs+ZQawQ== X-Received: by 10.237.61.210 with SMTP id j18mr48363891qtf.137.1480905457851; Sun, 04 Dec 2016 18:37:37 -0800 (PST) Received: from localhost.localdomain ([181.22.29.233]) by smtp.gmail.com with ESMTPSA id e24sm8398043qkj.12.2016.12.04.18.37.36 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Sun, 04 Dec 2016 18:37:37 -0800 (PST) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Sun, 4 Dec 2016 23:36:05 -0300 Message-Id: <20161205023606.4328-1-jamrial@gmail.com> X-Mailer: git-send-email 2.10.2 Subject: [FFmpeg-devel] [PATCH 1/2] avformat/matroskadec: allocate Colour related fields only if the file contains the relevant master 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" The demuxer doesn't fill the defaults if the master isn't present. This results in codecpar->color_space being set with a value of zero (RGB) on such files. Signed-off-by: James Almer --- libavformat/matroskadec.c | 54 ++++++++++++++++++++++++++--------------------- 1 file changed, 30 insertions(+), 24 deletions(-) diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c index 017a533..b53a8b1 100644 --- a/libavformat/matroskadec.c +++ b/libavformat/matroskadec.c @@ -173,7 +173,7 @@ typedef struct MatroskaTrackVideo { uint64_t field_order; uint64_t stereo_mode; uint64_t alpha_mode; - MatroskaTrackVideoColor color; + EbmlList color; } MatroskaTrackVideo; typedef struct MatroskaTrackAudio { @@ -432,7 +432,7 @@ static const EbmlSyntax matroska_track_video[] = { { MATROSKA_ID_VIDEOPIXELHEIGHT, EBML_UINT, 0, offsetof(MatroskaTrackVideo, pixel_height) }, { MATROSKA_ID_VIDEOCOLORSPACE, EBML_BIN, 0, offsetof(MatroskaTrackVideo, color_space) }, { MATROSKA_ID_VIDEOALPHAMODE, EBML_UINT, 0, offsetof(MatroskaTrackVideo, alpha_mode) }, - { MATROSKA_ID_VIDEOCOLOR, EBML_NEST, 0, offsetof(MatroskaTrackVideo, color), { .n = matroska_track_video_color } }, + { MATROSKA_ID_VIDEOCOLOR, EBML_NEST, sizeof(MatroskaTrackVideoColor), offsetof(MatroskaTrackVideo, color), { .n = matroska_track_video_color } }, { MATROSKA_ID_VIDEOPIXELCROPB, EBML_NONE }, { MATROSKA_ID_VIDEOPIXELCROPT, EBML_NONE }, { MATROSKA_ID_VIDEOPIXELCROPL, EBML_NONE }, @@ -1807,34 +1807,40 @@ static void mkv_stereo_mode_display_mul(int stereo_mode, } static int mkv_parse_video_color(AVStream *st, const MatroskaTrack *track) { - const MatroskaMasteringMeta* mastering_meta = - &track->video.color.mastering_meta; + const MatroskaTrackVideoColor *color = track->video.color.elem; + const MatroskaMasteringMeta *mastering_meta; + int has_mastering_primaries, has_mastering_luminance; + + if (!track->video.color.nb_elem) + return 0; + + mastering_meta = &color->mastering_meta; // Mastering primaries are CIE 1931 coords, and must be > 0. - const int has_mastering_primaries = + has_mastering_primaries = mastering_meta->r_x > 0 && mastering_meta->r_y > 0 && mastering_meta->g_x > 0 && mastering_meta->g_y > 0 && mastering_meta->b_x > 0 && mastering_meta->b_y > 0 && mastering_meta->white_x > 0 && mastering_meta->white_y > 0; - const int has_mastering_luminance = mastering_meta->max_luminance > 0; - - if (track->video.color.matrix_coefficients != AVCOL_SPC_RESERVED) - st->codecpar->color_space = track->video.color.matrix_coefficients; - if (track->video.color.primaries != AVCOL_PRI_RESERVED && - track->video.color.primaries != AVCOL_PRI_RESERVED0) - st->codecpar->color_primaries = track->video.color.primaries; - if (track->video.color.transfer_characteristics != AVCOL_TRC_RESERVED && - track->video.color.transfer_characteristics != AVCOL_TRC_RESERVED0) - st->codecpar->color_trc = track->video.color.transfer_characteristics; - if (track->video.color.range != AVCOL_RANGE_UNSPECIFIED && - track->video.color.range <= AVCOL_RANGE_JPEG) - st->codecpar->color_range = track->video.color.range; - if (track->video.color.chroma_siting_horz != MATROSKA_COLOUR_CHROMASITINGHORZ_UNDETERMINED && - track->video.color.chroma_siting_vert != MATROSKA_COLOUR_CHROMASITINGVERT_UNDETERMINED && - track->video.color.chroma_siting_horz < MATROSKA_COLOUR_CHROMASITINGHORZ_NB && - track->video.color.chroma_siting_vert < MATROSKA_COLOUR_CHROMASITINGVERT_NB) { + has_mastering_luminance = mastering_meta->max_luminance > 0; + + if (color->matrix_coefficients != AVCOL_SPC_RESERVED) + st->codecpar->color_space = color->matrix_coefficients; + if (color->primaries != AVCOL_PRI_RESERVED && + color->primaries != AVCOL_PRI_RESERVED0) + st->codecpar->color_primaries = color->primaries; + if (color->transfer_characteristics != AVCOL_TRC_RESERVED && + color->transfer_characteristics != AVCOL_TRC_RESERVED0) + st->codecpar->color_trc = color->transfer_characteristics; + if (color->range != AVCOL_RANGE_UNSPECIFIED && + color->range <= AVCOL_RANGE_JPEG) + st->codecpar->color_range = color->range; + if (color->chroma_siting_horz != MATROSKA_COLOUR_CHROMASITINGHORZ_UNDETERMINED && + color->chroma_siting_vert != MATROSKA_COLOUR_CHROMASITINGVERT_UNDETERMINED && + color->chroma_siting_horz < MATROSKA_COLOUR_CHROMASITINGHORZ_NB && + color->chroma_siting_vert < MATROSKA_COLOUR_CHROMASITINGVERT_NB) { st->codecpar->chroma_location = - avcodec_chroma_pos_to_enum((track->video.color.chroma_siting_horz - 1) << 7, - (track->video.color.chroma_siting_vert - 1) << 7); + avcodec_chroma_pos_to_enum((color->chroma_siting_horz - 1) << 7, + (color->chroma_siting_vert - 1) << 7); } if (has_mastering_primaries || has_mastering_luminance) {