From patchwork Wed Nov 30 23:36:40 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Vittorio Giovara X-Patchwork-Id: 1624 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.103.65.86 with SMTP id o83csp646465vsa; Wed, 30 Nov 2016 15:49:31 -0800 (PST) X-Received: by 10.194.203.5 with SMTP id km5mr35014797wjc.230.1480549771200; Wed, 30 Nov 2016 15:49:31 -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 ym9si66361387wjc.208.2016.11.30.15.49.30; Wed, 30 Nov 2016 15:49:31 -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 DF1396803CB; Thu, 1 Dec 2016 01:49:20 +0200 (EET) 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 AC3BD6897EE for ; Thu, 1 Dec 2016 01:49:14 +0200 (EET) Received: by mail-qt0-f195.google.com with SMTP id n34so21598045qtb.3 for ; Wed, 30 Nov 2016 15:49:22 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:subject:date:message-id:in-reply-to:references:reply-to; bh=M5ofI2GmNPgNSq0RwXPiz5sYlhq95Wm0Dj9VTW76zqI=; b=LmkhS4b/otQt8Wkz5GmDNYmsr8bIFran6C2csOJjDukRHqyyYf+vgo3ZQ9veYpxk1V q5vFMQ5jAwcbYVcI+wI62FhygsndU1XRBb3Gx9HW7mGbJbK8ohr7NM7PVPa7PNEwNkGj bdRT2HzDxxZJ3HjfHx/PXFHKwMCQOaK5lccBYSjAP9OxiAjUQDQQqTUbiC8MdsMZlG5g F+cxmRLjWN6sao5k6mSCdQ1XPrBpVplbbBaAUMEJRAo8uD2aIQK3/TCbkZ3fEfUa91rX qS6gKY24aHfKbIlZbvdJDlUVeggOxjcaXipSZ2A6CwUOTNpqlocNoGtQRHs8JeCcsKvo Cw4g== 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:in-reply-to :references:reply-to; bh=M5ofI2GmNPgNSq0RwXPiz5sYlhq95Wm0Dj9VTW76zqI=; b=SafKcmYjQffefjYNLaA4+DDGYgjZna0O724hAVqVwOkUZn/NAv0+evtx8AQwsWZiJM wCRqqnarDdhgHz+DckTDuI/Y18Hh7umcC/zEuJVO7AQDJ+UoivX8OrsQMi+ZCFm7lEhe sp5NDg67ElLtB9qLS1UnIV/H1sQuhXIht5R2iBlVuNwGW69UZ8ZemElpmABPFvUh7CpP R/hRD0V8uJBtlyFAGmyq8lQiJU58CO4w5NwEJH2sRQbMgDFhmOb+rjUp3Xk3g1Vu8caq eYcSBAPnOlVfx6HESenj3ZAI7xeILzz2FK7InxtlVO4yxuZmW7z/TLrC4eROviWUoGUd wBXA== X-Gm-Message-State: AKaTC01LkwYv5Gf2vQnOxr+T4N5IxW4iIjbgDRY8gwZGuXkFm+tzHnf8qWyYJ8PuU43bHQ== X-Received: by 10.237.37.149 with SMTP id x21mr31181065qtc.148.1480549003725; Wed, 30 Nov 2016 15:36:43 -0800 (PST) Received: from vimacbookpro.vimeows.com (nyv-exweb.iac.com. [216.112.252.10]) by smtp.gmail.com with ESMTPSA id p19sm34544412qte.23.2016.11.30.15.36.43 for (version=TLS1 cipher=AES128-SHA bits=128/128); Wed, 30 Nov 2016 15:36:43 -0800 (PST) From: Vittorio Giovara To: ffmpeg-devel@ffmpeg.org Date: Wed, 30 Nov 2016 18:36:40 -0500 Message-Id: <20161130233642.77815-2-vittorio.giovara@gmail.com> X-Mailer: git-send-email 2.10.0 In-Reply-To: <20161130233642.77815-1-vittorio.giovara@gmail.com> References: <20161130233642.77815-1-vittorio.giovara@gmail.com> Subject: [FFmpeg-devel] [PATCH 2/4] lavc: Add spherical packet side data API 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" Signed-off-by: Vittorio Giovara --- No particular change. Vittorio ffprobe.c | 13 +++++++++++++ libavcodec/avcodec.h | 8 +++++++- libavcodec/avpacket.c | 1 + libavcodec/utils.c | 1 + libavformat/dump.c | 30 ++++++++++++++++++++++++++++++ 5 files changed, 52 insertions(+), 1 deletion(-) diff --git a/ffprobe.c b/ffprobe.c index 4ed8e06..046f080 100644 --- a/ffprobe.c +++ b/ffprobe.c @@ -37,6 +37,7 @@ #include "libavutil/hash.h" #include "libavutil/opt.h" #include "libavutil/pixdesc.h" +#include "libavutil/spherical.h" #include "libavutil/stereo3d.h" #include "libavutil/dict.h" #include "libavutil/intreadwrite.h" @@ -1783,6 +1784,18 @@ static void print_pkt_side_data(WriterContext *w, const AVStereo3D *stereo = (AVStereo3D *)sd->data; print_str("type", av_stereo3d_type_name(stereo->type)); print_int("inverted", !!(stereo->flags & AV_STEREO3D_FLAG_INVERT)); + } else if (sd->type == AV_PKT_DATA_SPHERICAL) { + const AVSphericalMapping *spherical = (AVSphericalMapping *)sd->data; + if (spherical->projection == AV_SPHERICAL_EQUIRECTANGULAR) + print_str("projection", "equirectangular"); + else if (spherical->projection == AV_SPHERICAL_CUBEMAP) + print_str("projection", "cubemap"); + else + print_str("projection", "unknown"); + + print_int("yaw", (double) spherical->yaw / (1 << 16)); + print_int("pitch", (double) spherical->pitch / (1 << 16)); + print_int("roll", (double) spherical->roll / (1 << 16)); } writer_print_section_footer(w); } diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h index e5e7f42..7ac2ada 100644 --- a/libavcodec/avcodec.h +++ b/libavcodec/avcodec.h @@ -1536,7 +1536,13 @@ enum AVPacketSideDataType { * should be associated with a video stream and containts data in the form * of the AVMasteringDisplayMetadata struct. */ - AV_PKT_DATA_MASTERING_DISPLAY_METADATA + AV_PKT_DATA_MASTERING_DISPLAY_METADATA, + + /** + * This side data should be associated with a video stream and corresponds + * to the AVSphericalMapping structure. + */ + AV_PKT_DATA_SPHERICAL, }; #define AV_PKT_DATA_QUALITY_FACTOR AV_PKT_DATA_QUALITY_STATS //DEPRECATED diff --git a/libavcodec/avpacket.c b/libavcodec/avpacket.c index e5a8bdb..24b4efb 100644 --- a/libavcodec/avpacket.c +++ b/libavcodec/avpacket.c @@ -372,6 +372,7 @@ const char *av_packet_side_data_name(enum AVPacketSideDataType type) case AV_PKT_DATA_METADATA_UPDATE: return "Metadata Update"; case AV_PKT_DATA_MPEGTS_STREAM_ID: return "MPEGTS Stream ID"; case AV_PKT_DATA_MASTERING_DISPLAY_METADATA: return "Mastering display metadata"; + case AV_PKT_DATA_SPHERICAL: return "Spherical Mapping"; } return NULL; } diff --git a/libavcodec/utils.c b/libavcodec/utils.c index d6dca18..89a12c6 100644 --- a/libavcodec/utils.c +++ b/libavcodec/utils.c @@ -762,6 +762,7 @@ int ff_init_buffer_info(AVCodecContext *avctx, AVFrame *frame) } sd[] = { { AV_PKT_DATA_REPLAYGAIN , AV_FRAME_DATA_REPLAYGAIN }, { AV_PKT_DATA_DISPLAYMATRIX, AV_FRAME_DATA_DISPLAYMATRIX }, + { AV_PKT_DATA_SPHERICAL, AV_FRAME_DATA_SPHERICAL }, { AV_PKT_DATA_STEREO3D, AV_FRAME_DATA_STEREO3D }, { AV_PKT_DATA_AUDIO_SERVICE_TYPE, AV_FRAME_DATA_AUDIO_SERVICE_TYPE }, { AV_PKT_DATA_MASTERING_DISPLAY_METADATA, AV_FRAME_DATA_MASTERING_DISPLAY_METADATA }, diff --git a/libavformat/dump.c b/libavformat/dump.c index cd14625..bcc6a00 100644 --- a/libavformat/dump.c +++ b/libavformat/dump.c @@ -31,6 +31,7 @@ #include "libavutil/opt.h" #include "libavutil/avstring.h" #include "libavutil/replaygain.h" +#include "libavutil/spherical.h" #include "libavutil/stereo3d.h" #include "avformat.h" @@ -342,6 +343,31 @@ static void dump_mastering_display_metadata(void *ctx, AVPacketSideData* sd) { av_q2d(metadata->min_luminance), av_q2d(metadata->max_luminance)); } +static void dump_spherical(void *ctx, AVPacketSideData *sd) +{ + AVSphericalMapping *spherical = (AVSphericalMapping *)sd->data; + double yaw, pitch, roll; + + if (sd->size < sizeof(*spherical)) { + av_log(ctx, AV_LOG_INFO, "invalid data"); + return; + } + + if (spherical->projection == AV_SPHERICAL_EQUIRECTANGULAR) + av_log(ctx, AV_LOG_INFO, "equirectangular "); + else if (spherical->projection == AV_SPHERICAL_CUBEMAP) + av_log(ctx, AV_LOG_INFO, "cubemap "); + else { + av_log(ctx, AV_LOG_WARNING, "unknown"); + return; + } + + yaw = ((double)spherical->yaw) / (1 << 16); + pitch = ((double)spherical->pitch) / (1 << 16); + roll = ((double)spherical->roll) / (1 << 16); + av_log(ctx, AV_LOG_INFO, "(%f/%f/%f) ", yaw, pitch, roll); +} + static void dump_sidedata(void *ctx, AVStream *st, const char *indent) { int i; @@ -393,6 +419,10 @@ static void dump_sidedata(void *ctx, AVStream *st, const char *indent) case AV_PKT_DATA_MASTERING_DISPLAY_METADATA: dump_mastering_display_metadata(ctx, &sd); break; + case AV_PKT_DATA_SPHERICAL: + av_log(ctx, AV_LOG_INFO, "spherical: "); + dump_spherical(ctx, &sd); + break; default: av_log(ctx, AV_LOG_INFO, "unknown side data type %d (%d bytes)", sd.type, sd.size);