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 <acolw...@google.com> > 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. > + 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. > + 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. > + 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