From patchwork Mon Mar 27 17:40:33 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Aaron Colwell X-Patchwork-Id: 3131 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.103.44.195 with SMTP id s186csp269001vss; Mon, 27 Mar 2017 10:40:56 -0700 (PDT) X-Received: by 10.28.49.7 with SMTP id x7mr11059252wmx.3.1490636456774; Mon, 27 Mar 2017 10:40:56 -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 j193si287227wmg.68.2017.03.27.10.40.55; Mon, 27 Mar 2017 10:40:56 -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=@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 41441688374; Mon, 27 Mar 2017 20:40:31 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-yw0-f170.google.com (mail-yw0-f170.google.com [209.85.161.170]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 238CD680C95 for ; Mon, 27 Mar 2017 20:40:24 +0300 (EEST) Received: by mail-yw0-f170.google.com with SMTP id d191so36837456ywe.2 for ; Mon, 27 Mar 2017 10:40:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=VqDoiMJMRnsgkzae+mqd+96z0yV9ng0YU4uWG+30YZ8=; b=DdjZoOfc1jsWpgI6N0Kg5HTZi3YLDm4/TgiICmXz9sJnOHzCLthgkKT7KLfdDRlixt ggYY6szeHYA/KYGEh5mavoZT5RQ0wlXJvAAFRKZQpO6ZW5AJiSntYV6CL7eaBTlaxJZq Bl9esYCQaBxz93T8s5Pz2Tk0Hwu7/XeN3ebCTatRSeX0CbVJ4UEYXwnXlPoHpMhmVOaA sRK7sqlVj5TQ8n+CCWFbWRnidy3ik6S1hrhoDoaLs2n/gfKx0156tGlDLZYeJACf+L9i aXi3xN9DmFU/1E2FKJyS1RjjX4ArGr2KPk5pgRqtX2AXFdAShwiL0x3oNjN0PqZGpJFZ PSvA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=VqDoiMJMRnsgkzae+mqd+96z0yV9ng0YU4uWG+30YZ8=; b=MuzrXIFT4oY4IpJkSIGo+P67Ga/rOmH8PEZPR3Q+dUUOY4fC9fDCUnLl9JDz6QvpO0 tMhXaXxu/wzF/ckUztV81tavzSv/4Y15XLVagQZhvO3OOAJWAQBbxfsP0SRNV3521Aeu odLDXwM37ie/HIIMzB9LpgEL5/8ha5hWCDGvp7P2zLfNnVhiyxvcHDSyyT8YI74AmRxm aFtUwHMzdauuLFDHkz2+hz9uZYzfG/8AzP8otpR4mLKPCQrGLTrpyOwPEMPCGUPP/BwY qB2Wbt+3qwboxsb/zjdvRYvIn4RJOrNXLVJlOZFJEI/p/HBej9l6NRHhNJGZ5h43gtGS YDRA== X-Gm-Message-State: AFeK/H2uCSnKP1AYGKogvHnwz/YbUN6xwHsPweITZOvDJf1V/6gR0Qms6P75JzJ0G5HtDqilXDMSZOtapZ5DnNf3 X-Received: by 10.37.91.195 with SMTP id p186mr13296482ybb.42.1490636444406; Mon, 27 Mar 2017 10:40:44 -0700 (PDT) MIME-Version: 1.0 References: <5c3984d5-a542-8cce-f350-f7d18cc430f5@gmail.com> In-Reply-To: <5c3984d5-a542-8cce-f350-f7d18cc430f5@gmail.com> From: Aaron Colwell Date: Mon, 27 Mar 2017 17:40:33 +0000 Message-ID: To: FFmpeg development discussions and patches X-Content-Filtered-By: Mailman/MimeDel 2.1.20 Subject: Re: [FFmpeg-devel] [PATCH] movenc: Add support for writing st3d and sv3d boxes. 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 Cc: Vittorio Giovara Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Made all suggested changes and attached a new patch. Thanks for the quick review. Aaron On Mon, Mar 27, 2017 at 10:00 AM James Almer wrote: > On 3/27/2017 1:02 PM, Aaron Colwell wrote: > > > > 0001-movenc-Add-support-for-writing-st3d-andsv3d-boxes.patch > > > > > > From 8654212c2f2a3ee404020cf5b948d7db3e6270f2 Mon Sep 17 00:00:00 2001 > > From: Aaron Colwell > > Date: Mon, 27 Mar 2017 08:00:12 -0700 > > Subject: [PATCH] movenc: Add support for writing st3d and sv3d boxes. > > > > --- > > libavformat/movenc.c | 105 > +++++++++++++++++++++++++++++++++++++++++++++++++++ > > 1 file changed, 105 insertions(+) > > > > diff --git a/libavformat/movenc.c b/libavformat/movenc.c > > index 3b4e3b519c..4f408b20fa 100644 > > --- a/libavformat/movenc.c > > +++ b/libavformat/movenc.c > > @@ -1603,6 +1603,101 @@ static int mov_write_subtitle_tag(AVIOContext > *pb, MOVTrack *track) > > return update_size(pb, pos); > > } > > > > +static int mov_write_st3d_tag(AVIOContext *pb, AVStereo3D *stereo_3d) > > +{ > > + int8_t stereo_mode; > > + > > + if (stereo_3d->flags != 0) { > > + av_log(pb, AV_LOG_WARNING, "Unsupported stereo_3d flags %x. > st3d not written.\n", stereo_3d->flags); > > + return 0; > > + } > > + > > + switch (stereo_3d->type) { > > + case AV_STEREO3D_2D: > > + stereo_mode = 0; > > + break; > > + case AV_STEREO3D_TOPBOTTOM: > > + stereo_mode = 1; > > + break; > > + case AV_STEREO3D_SIDEBYSIDE: > > + stereo_mode = 2; > > + break; > > + default: > > + av_log(pb, AV_LOG_WARNING, "Unsupported stereo_3d type %d. st3d > not written.\n", stereo_3d->type); > > You could use av_stereo3d_type_name(stereo_3d->type) here. > Done. > > > + return 0; > > + } > > + avio_wb32(pb, 13); /* size */ > > + ffio_wfourcc(pb, "st3d"); > > + avio_wb32(pb, 0); /* version = 0 & flags = 0 */ > > + avio_w8(pb, stereo_mode); > > + return 13; > > +} > > + > > +static int mov_write_sv3d_tag(AVIOContext *pb, AVSphericalMapping > *spherical_mapping) > > +{ > > + int64_t sv3d_pos, svhd_pos, proj_pos; > > + > > + if (spherical_mapping->projection != AV_SPHERICAL_EQUIRECTANGULAR && > > + spherical_mapping->projection != > AV_SPHERICAL_EQUIRECTANGULAR_TILE && > > + spherical_mapping->projection != AV_SPHERICAL_CUBEMAP) { > > + av_log(pb, AV_LOG_WARNING, "Unsupported projection %d. sv3d not > written.\n", spherical_mapping->projection); > > + return 0; > > + } > > + > > + sv3d_pos = avio_tell(pb); > > + avio_wb32(pb, 0); /* size */ > > + ffio_wfourcc(pb, "sv3d"); > > + > > + svhd_pos = avio_tell(pb); > > + avio_wb32(pb, 0); /* size */ > > + ffio_wfourcc(pb, "svhd"); > > + avio_wb32(pb, 0); /* version = 0 & flags = 0 */ > > + avio_put_str(pb, LIBAVFORMAT_IDENT); /* metadata_source */ > > You need to use some hardcoded string like "Lavf" or nothing at all if > AVFMT_FLAG_BITEXACT is set in (AVFormatContext*)->flags. > Done. > > > + update_size(pb, svhd_pos); > > + > > + proj_pos = avio_tell(pb); > > + avio_wb32(pb, 0); /* size */ > > + ffio_wfourcc(pb, "proj"); > > + > > + avio_wb32(pb, 24); /* size */ > > + ffio_wfourcc(pb, "prhd"); > > + avio_wb32(pb, 0); /* version = 0 & flags = 0 */ > > + avio_wb32(pb, spherical_mapping->yaw); > > + avio_wb32(pb, spherical_mapping->pitch); > > + avio_wb32(pb, spherical_mapping->roll); > > + > > + switch (spherical_mapping->projection) { > > + case AV_SPHERICAL_EQUIRECTANGULAR: > > + avio_wb32(pb, 28); /* size */ > > + ffio_wfourcc(pb, "equi"); > > + avio_wb32(pb, 0); /* version = 0 & flags = 0 */ > > + avio_wb32(pb, 0); /* projection_bounds_top */ > > + avio_wb32(pb, 0); /* projection_bounds_bottom */ > > + avio_wb32(pb, 0); /* projection_bounds_left */ > > + avio_wb32(pb, 0); /* projection_bounds_right */ > > + break; > > + case AV_SPHERICAL_EQUIRECTANGULAR_TILE: > > + avio_wb32(pb, 28); /* size */ > > + ffio_wfourcc(pb, "equi"); > > + avio_wb32(pb, 0); /* version = 0 & flags = 0 */ > > + avio_wb32(pb, spherical_mapping->bound_top); > > + avio_wb32(pb, spherical_mapping->bound_bottom); > > + avio_wb32(pb, spherical_mapping->bound_left); > > + avio_wb32(pb, spherical_mapping->bound_right); > > + break; > > The bound_ fields are going to be zero in the AV_SPHERICAL_EQUIRECTANGULAR > case, so just use the AV_SPHERICAL_EQUIRECTANGULAR_TILE code for both > cases. > Done. > > > + case AV_SPHERICAL_CUBEMAP: > > + avio_wb32(pb, 20); /* size */ > > + ffio_wfourcc(pb, "cbmp"); > > + avio_wb32(pb, 0); /* version = 0 & flags = 0 */ > > + avio_wb32(pb, 0); /* layout */ > > + avio_wb32(pb, spherical_mapping->padding); /* padding */ > > + break; > > + } > > + update_size(pb, proj_pos); > > + > > + return update_size(pb, sv3d_pos); > > +} > > + > > static int mov_write_pasp_tag(AVIOContext *pb, MOVTrack *track) > > { > > AVRational sar; > > @@ -1873,6 +1968,16 @@ static int mov_write_video_tag(AVIOContext *pb, > MOVMuxContext *mov, MOVTrack *tr > > av_log(mov->fc, AV_LOG_WARNING, "Not writing 'colr' atom. > Format is not MOV or MP4.\n"); > > } > > > > + if (mov->fc->strict_std_compliance <= FF_COMPLIANCE_EXPERIMENTAL) { > > + AVStereo3D* stereo_3d = (AVStereo3D*) > av_stream_get_side_data(track->st, AV_PKT_DATA_STEREO3D, NULL); > > + AVSphericalMapping* spherical_mapping = > (AVSphericalMapping*)av_stream_get_side_data(track->st, > AV_PKT_DATA_SPHERICAL, NULL); > > + > > + if (stereo_3d) > > + mov_write_st3d_tag(pb, stereo_3d); > > + if (spherical_mapping) > > + mov_write_sv3d_tag(pb, spherical_mapping); > > + } > > + > > if (track->par->sample_aspect_ratio.den && > track->par->sample_aspect_ratio.num) { > > mov_write_pasp_tag(pb, track); > > } > > -- 2.12.1.578.ge9c3154ca4-goog > > > > > > > > _______________________________________________ > > ffmpeg-devel mailing list > > ffmpeg-devel@ffmpeg.org > > http://ffmpeg.org/mailman/listinfo/ffmpeg-devel > > > > _______________________________________________ > ffmpeg-devel mailing list > ffmpeg-devel@ffmpeg.org > http://ffmpeg.org/mailman/listinfo/ffmpeg-devel > From 18bfdcd43d067c1abb73000df87e07870a98d35a Mon Sep 17 00:00:00 2001 From: Aaron Colwell Date: Mon, 27 Mar 2017 08:00:12 -0700 Subject: [PATCH] movenc: Add support for writing st3d and sv3d boxes. --- libavformat/movenc.c | 99 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) diff --git a/libavformat/movenc.c b/libavformat/movenc.c index 3b4e3b519c..7bee8e6f40 100644 --- a/libavformat/movenc.c +++ b/libavformat/movenc.c @@ -46,6 +46,7 @@ #include "libavutil/opt.h" #include "libavutil/dict.h" #include "libavutil/pixdesc.h" +#include "libavutil/stereo3d.h" #include "libavutil/timecode.h" #include "libavutil/color_utils.h" #include "hevc.h" @@ -1603,6 +1604,94 @@ static int mov_write_subtitle_tag(AVIOContext *pb, MOVTrack *track) return update_size(pb, pos); } +static int mov_write_st3d_tag(AVIOContext *pb, AVStereo3D *stereo_3d) +{ + int8_t stereo_mode; + + if (stereo_3d->flags != 0) { + av_log(pb, AV_LOG_WARNING, "Unsupported stereo_3d flags %x. st3d not written.\n", stereo_3d->flags); + return 0; + } + + switch (stereo_3d->type) { + case AV_STEREO3D_2D: + stereo_mode = 0; + break; + case AV_STEREO3D_TOPBOTTOM: + stereo_mode = 1; + break; + case AV_STEREO3D_SIDEBYSIDE: + stereo_mode = 2; + break; + default: + av_log(pb, AV_LOG_WARNING, "Unsupported stereo_3d type %s. st3d not written.\n", av_stereo3d_type_name(stereo_3d->type)); + return 0; + } + avio_wb32(pb, 13); /* size */ + ffio_wfourcc(pb, "st3d"); + avio_wb32(pb, 0); /* version = 0 & flags = 0 */ + avio_w8(pb, stereo_mode); + return 13; +} + +static int mov_write_sv3d_tag(AVFormatContext *s, AVIOContext *pb, AVSphericalMapping *spherical_mapping) +{ + int64_t sv3d_pos, svhd_pos, proj_pos; + const char* metadata_source = s->flags & AVFMT_FLAG_BITEXACT ? "Lavf" : LIBAVFORMAT_IDENT; + + if (spherical_mapping->projection != AV_SPHERICAL_EQUIRECTANGULAR && + spherical_mapping->projection != AV_SPHERICAL_EQUIRECTANGULAR_TILE && + spherical_mapping->projection != AV_SPHERICAL_CUBEMAP) { + av_log(pb, AV_LOG_WARNING, "Unsupported projection %d. sv3d not written.\n", spherical_mapping->projection); + return 0; + } + + sv3d_pos = avio_tell(pb); + avio_wb32(pb, 0); /* size */ + ffio_wfourcc(pb, "sv3d"); + + svhd_pos = avio_tell(pb); + avio_wb32(pb, 0); /* size */ + ffio_wfourcc(pb, "svhd"); + avio_wb32(pb, 0); /* version = 0 & flags = 0 */ + avio_put_str(pb, metadata_source); + update_size(pb, svhd_pos); + + proj_pos = avio_tell(pb); + avio_wb32(pb, 0); /* size */ + ffio_wfourcc(pb, "proj"); + + avio_wb32(pb, 24); /* size */ + ffio_wfourcc(pb, "prhd"); + avio_wb32(pb, 0); /* version = 0 & flags = 0 */ + avio_wb32(pb, spherical_mapping->yaw); + avio_wb32(pb, spherical_mapping->pitch); + avio_wb32(pb, spherical_mapping->roll); + + switch (spherical_mapping->projection) { + case AV_SPHERICAL_EQUIRECTANGULAR: + case AV_SPHERICAL_EQUIRECTANGULAR_TILE: + avio_wb32(pb, 28); /* size */ + ffio_wfourcc(pb, "equi"); + avio_wb32(pb, 0); /* version = 0 & flags = 0 */ + avio_wb32(pb, spherical_mapping->bound_top); + avio_wb32(pb, spherical_mapping->bound_bottom); + avio_wb32(pb, spherical_mapping->bound_left); + avio_wb32(pb, spherical_mapping->bound_right); + break; + case AV_SPHERICAL_CUBEMAP: + avio_wb32(pb, 20); /* size */ + ffio_wfourcc(pb, "cbmp"); + avio_wb32(pb, 0); /* version = 0 & flags = 0 */ + avio_wb32(pb, 0); /* layout */ + avio_wb32(pb, spherical_mapping->padding); /* padding */ + break; + } + update_size(pb, proj_pos); + + return update_size(pb, sv3d_pos); +} + static int mov_write_pasp_tag(AVIOContext *pb, MOVTrack *track) { AVRational sar; @@ -1873,6 +1962,16 @@ static int mov_write_video_tag(AVIOContext *pb, MOVMuxContext *mov, MOVTrack *tr av_log(mov->fc, AV_LOG_WARNING, "Not writing 'colr' atom. Format is not MOV or MP4.\n"); } + if (mov->fc->strict_std_compliance <= FF_COMPLIANCE_EXPERIMENTAL) { + AVStereo3D* stereo_3d = (AVStereo3D*) av_stream_get_side_data(track->st, AV_PKT_DATA_STEREO3D, NULL); + AVSphericalMapping* spherical_mapping = (AVSphericalMapping*)av_stream_get_side_data(track->st, AV_PKT_DATA_SPHERICAL, NULL); + + if (stereo_3d) + mov_write_st3d_tag(pb, stereo_3d); + if (spherical_mapping) + mov_write_sv3d_tag(mov->fc, pb, spherical_mapping); + } + if (track->par->sample_aspect_ratio.den && track->par->sample_aspect_ratio.num) { mov_write_pasp_tag(pb, track); } -- 2.12.1.578.ge9c3154ca4-goog