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 <jamr...@gmail.com> 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 <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.
>

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 <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 | 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

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel

Reply via email to