From patchwork Fri Jan 27 20:12:27 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Aaron Colwell X-Patchwork-Id: 2341 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.103.89.21 with SMTP id n21csp413314vsb; Fri, 27 Jan 2017 12:21:04 -0800 (PST) X-Received: by 10.28.69.202 with SMTP id l71mr4807745wmi.68.1485548464634; Fri, 27 Jan 2017 12:21:04 -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 125si4008775wmg.106.2017.01.27.12.21.03; Fri, 27 Jan 2017 12:21:04 -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=@google.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 Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id EBB8168AA17; Fri, 27 Jan 2017 22:20:59 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-yb0-f173.google.com (mail-yb0-f173.google.com [209.85.213.173]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 0DEB468A9DF for ; Fri, 27 Jan 2017 22:20:54 +0200 (EET) Received: by mail-yb0-f173.google.com with SMTP id 123so71201857ybe.3 for ; Fri, 27 Jan 2017 12:20:55 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=mime-version:from:date:message-id:subject:to; bh=DedZrGdTFXGHanms4JVSzvQGBtWxTfaiuuwQLWYVCzA=; b=m6d2N4+GNBC85GGgDPEm0XIl2VYKJBMy8nkLWA1jJNHXX+8bhB7/mjPdSKfHeA35d0 H6lhTHCsuvo9QNt7A7yMf3ASIRqdSM4THin1VFKy1+Am5PuFZqNYnuZAEtW/KTcRfwzc 4u/elWIpGM4CHxz3hLOc2/ysTsM6eUO+2ZNbMEci/S8mjQ474dgKD6L5nXomhIp6DDLu QEUSr+nAnjk4TrylixFJKbM5jdogUmYw/U2T0XMpAlomI0yMVTXfEyZ+KpzIMmsbwSgl wBm+th7r9PoAsEt+N9DsuVwlQTV761hfrFl8rs27Oslzkg/lWLEV4M3SCReGcYj4B6H9 9/Hg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:from:date:message-id:subject:to; bh=DedZrGdTFXGHanms4JVSzvQGBtWxTfaiuuwQLWYVCzA=; b=S/FZ44wafyPxDn8dCb6w4bA7Kby0PqUacJDnUmgu2WI5qp7TD7yzRgQ7DAnm0k/BQU lGdjaQY/ZM3Dz5xG6iEWUwdUCf1E1HCajp1KKKQ7/n3BL2o0RC8puAJEsFV6/SHlYVvz jg+EbnbheU2G168KTzdMQS7V9mIq3M3PJSnTeiCosuHaRmh0kp02S/l85e7QlDh9v+6V pJTyVyez216jZzqmVJyZGZ5960e0peInrnyL3sj6ipFvlncGbooZ/hQLFxOzES5dFLQn GaSRd+rhX07Qjxdc0XS3lzayrc3PfL9kTpFH0v9on+kIsR24bPjEhWfIMR9mGDzlUvsJ xVEA== X-Gm-Message-State: AIkVDXK5NepBBOJdLUv+8qyONONOAy96yL8swjBDd4ludYwxQI63s34l8o/bO57FULwCzJyMK5I2bzRBpNHxEvtz X-Received: by 10.37.216.18 with SMTP id p18mr2905216ybg.42.1485547958044; Fri, 27 Jan 2017 12:12:38 -0800 (PST) MIME-Version: 1.0 From: Aaron Colwell Date: Fri, 27 Jan 2017 20:12:27 +0000 Message-ID: To: FFmpeg development discussions and patches X-Content-Filtered-By: Mailman/MimeDel 2.1.20 Subject: [FFmpeg-devel] [PATCH] matroskaenc: Add support for writing video projection. 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Adding support for writing spherical metadata in Matroska. From 5a9cf56bf3114186412bb5572b153f886edb6ddb Mon Sep 17 00:00:00 2001 From: Aaron Colwell Date: Fri, 27 Jan 2017 12:07:25 -0800 Subject: [PATCH] matroskaenc: Add support for writing video projection element. Adding support for writing spherical metadata in Matroska. --- libavformat/matroskaenc.c | 64 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index f731b678b9..1b186db223 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -1038,6 +1038,67 @@ static int mkv_write_stereo_mode(AVFormatContext *s, AVIOContext *pb, return ret; } +static int mkv_write_video_projection(AVIOContext *pb, AVStream *st) +{ + AVSphericalMapping *spherical_mapping = (AVSphericalMapping*)av_stream_get_side_data(st, AV_PKT_DATA_SPHERICAL, NULL); + ebml_master projection; + int projection_type = 0; + + AVIOContext *dyn_cp; + uint8_t *projection_private_ptr = NULL; + int ret, projection_private_size; + + if (!spherical_mapping) + return 0; + + if (spherical_mapping->projection != AV_SPHERICAL_EQUIRECTANGULAR && + spherical_mapping->projection != AV_SPHERICAL_CUBEMAP) { + av_log(pb, AV_LOG_WARNING, "Unsupported projection %d. projection not written.\n", spherical_mapping->projection); + return 0; + } + + ret = avio_open_dyn_buf(&dyn_cp); + if (ret < 0) + return ret; + + switch (spherical_mapping->projection) { + case AV_SPHERICAL_EQUIRECTANGULAR: + projection_type = 1; + + /* Create ProjectionPrivate contents */ + avio_wb32(dyn_cp, 0); /* version = 0 & flags = 0 */ + avio_wb32(dyn_cp, 0); /* projection_bounds_top */ + avio_wb32(dyn_cp, 0); /* projection_bounds_bottom */ + avio_wb32(dyn_cp, 0); /* projection_bounds_left */ + avio_wb32(dyn_cp, 0); /* projection_bounds_right */ + break; + case AV_SPHERICAL_CUBEMAP: + projection_type = 2; + + /* Create ProjectionPrivate contents */ + avio_wb32(dyn_cp, 0); /* version = 0 & flags = 0 */ + avio_wb32(dyn_cp, 0); /* layout */ + avio_wb32(dyn_cp, 0); /* padding */ + break; + } + + projection_private_size = avio_close_dyn_buf(dyn_cp, &projection_private_ptr); + + projection = start_ebml_master(pb, MATROSKA_ID_VIDEOPROJECTION, 0); + put_ebml_uint(pb, MATROSKA_ID_VIDEOPROJECTIONTYPE, projection_type); + if (projection_private_size) + put_ebml_binary(pb, MATROSKA_ID_VIDEOPROJECTIONPRIVATE, projection_private_ptr, projection_private_size); + + put_ebml_float(pb, MATROSKA_ID_VIDEOPROJECTIONPOSEYAW, (float)(spherical_mapping->yaw) / (1 << 16)); + put_ebml_float(pb, MATROSKA_ID_VIDEOPROJECTIONPOSEPITCH, (float)(spherical_mapping->pitch) / (1 << 16)); + put_ebml_float(pb, MATROSKA_ID_VIDEOPROJECTIONPOSEROLL, (float)(spherical_mapping->roll) / (1 << 16)); + end_ebml_master(pb, projection); + + av_free(projection_private_ptr); + + return 0; +} + static int mkv_write_track(AVFormatContext *s, MatroskaMuxContext *mkv, int i, AVIOContext *pb, int default_stream_exists) { @@ -1251,6 +1312,9 @@ static int mkv_write_track(AVFormatContext *s, MatroskaMuxContext *mkv, ret = mkv_write_video_color(pb, par, st); if (ret < 0) return ret; + ret = mkv_write_video_projection(pb, st); + if (ret < 0) + return ret; end_ebml_master(pb, subinfo); break; -- 2.11.0.483.g087da7b7c-goog