[FFmpeg-devel] [PATCHv3 3/3] mkv: Export bounds and padding from spherical metadata

wm4 nfxjfg at googlemail.com
Wed Mar 8 08:51:07 EET 2017


On Tue, 7 Mar 2017 21:38:52 +0100
Hendrik Leppkes <h.leppkes at gmail.com> wrote:

> On Tue, Mar 7, 2017 at 7:26 PM, wm4 <nfxjfg at googlemail.com> wrote:
> > On Tue, 21 Feb 2017 17:35:53 -0500
> > Vittorio Giovara <vittorio.giovara at gmail.com> wrote:
> >  
> >> ---
> >>  libavformat/matroskadec.c              | 64 ++++++++++++++++++++++++++++++++--
> >>  tests/ref/fate/matroska-spherical-mono |  6 +++-
> >>  2 files changed, 66 insertions(+), 4 deletions(-)
> >>
> >> diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
> >> index 7223e94..0a02237 100644
> >> --- a/libavformat/matroskadec.c
> >> +++ b/libavformat/matroskadec.c
> >> @@ -1913,16 +1913,65 @@ static int mkv_parse_video_projection(AVStream *st, const MatroskaTrack *track)
> >>      AVSphericalMapping *spherical;
> >>      enum AVSphericalProjection projection;
> >>      size_t spherical_size;
> >> +    size_t l, t, r, b;
> >> +    size_t padding = 0;
> >>      int ret;
> >> +    GetByteContext gb;
> >> +
> >> +    bytestream2_init(&gb, track->video.projection.private.data,
> >> +                     track->video.projection.private.size);
> >> +
> >> +    if (bytestream2_get_byte(&gb) != 0) {
> >> +        av_log(NULL, AV_LOG_WARNING, "Unknown spherical metadata\n");
> >> +        return 0;
> >> +    }
> >> +
> >> +    bytestream2_skip(&gb, 3); // flags
> >>
> >>      switch (track->video.projection.type) {
> >>      case MATROSKA_VIDEO_PROJECTION_TYPE_EQUIRECTANGULAR:
> >> -        projection = AV_SPHERICAL_EQUIRECTANGULAR;
> >> +        if (track->video.projection.private.size == 0)
> >> +            projection = AV_SPHERICAL_EQUIRECTANGULAR;
> >> +        else if (track->video.projection.private.size == 20) {
> >> +            t = bytestream2_get_be32(&gb);
> >> +            b = bytestream2_get_be32(&gb);
> >> +            l = bytestream2_get_be32(&gb);
> >> +            r = bytestream2_get_be32(&gb);
> >> +
> >> +            if (b >= UINT_MAX - t || r >= UINT_MAX - l) {
> >> +                av_log(NULL, AV_LOG_ERROR,
> >> +                       "Invalid bounding rectangle coordinates "
> >> +                       "%zu,%zu,%zu,%zu\n", l, t, r, b);
> >> +                return AVERROR_INVALIDDATA;
> >> +            }
> >> +
> >> +            if (l || t || r || b)
> >> +                projection = AV_SPHERICAL_EQUIRECTANGULAR_TILE;
> >> +            else
> >> +                projection = AV_SPHERICAL_EQUIRECTANGULAR;
> >> +        } else {
> >> +            av_log(NULL, AV_LOG_ERROR, "Unknown spherical metadata\n");
> >> +            return AVERROR_INVALIDDATA;
> >> +        }
> >>          break;
> >>      case MATROSKA_VIDEO_PROJECTION_TYPE_CUBEMAP:
> >> -        if (track->video.projection.private.size < 4)
> >> +        if (track->video.projection.private.size < 4) {
> >> +            av_log(NULL, AV_LOG_ERROR, "Missing projection private properties\n");
> >> +            return AVERROR_INVALIDDATA;
> >> +        } else if (track->video.projection.private.size == 12) {
> >> +            uint32_t layout = bytestream2_get_be32(&gb);
> >> +            if (layout == 0) {
> >> +                projection = AV_SPHERICAL_CUBEMAP;
> >> +            } else {
> >> +                av_log(NULL, AV_LOG_WARNING,
> >> +                       "Unknown spherical cubemap layout %"PRIu32"\n", layout);
> >> +                return 0;
> >> +            }
> >> +            padding = bytestream2_get_be32(&gb);
> >> +        } else {
> >> +            av_log(NULL, AV_LOG_ERROR, "Unknown spherical metadata\n");
> >>              return AVERROR_INVALIDDATA;
> >> -        projection = AV_SPHERICAL_CUBEMAP;
> >> +        }
> >>          break;
> >>      default:
> >>          return 0;
> >> @@ -1937,6 +1986,15 @@ static int mkv_parse_video_projection(AVStream *st, const MatroskaTrack *track)
> >>      spherical->pitch = (int32_t)(track->video.projection.pitch * (1 << 16));
> >>      spherical->roll  = (int32_t)(track->video.projection.roll  * (1 << 16));
> >>
> >> +    spherical->padding = padding;
> >> +
> >> +    if (spherical->projection == AV_SPHERICAL_EQUIRECTANGULAR_TILE) {
> >> +        spherical->bound_left   = l;
> >> +        spherical->bound_top    = t;
> >> +        spherical->bound_right  = r;
> >> +        spherical->bound_bottom = b;
> >> +    }
> >> +
> >>      ret = av_stream_add_side_data(st, AV_PKT_DATA_SPHERICAL, (uint8_t *)spherical,
> >>                                    spherical_size);
> >>      if (ret < 0) {
> >> diff --git a/tests/ref/fate/matroska-spherical-mono b/tests/ref/fate/matroska-spherical-mono
> >> index 8048aff..a70d879 100644
> >> --- a/tests/ref/fate/matroska-spherical-mono
> >> +++ b/tests/ref/fate/matroska-spherical-mono
> >> @@ -8,7 +8,11 @@ inverted=0
> >>  [SIDE_DATA]
> >>  side_data_type=Spherical Mapping
> >>  side_data_size=56
> >> -projection=equirectangular
> >> +projection=tiled equirectangular
> >> +bound_left=148
> >> +bound_top=73
> >> +bound_right=147
> >> +bound_bottom=72
> >>  yaw=45
> >>  pitch=30
> >>  roll=15  
> >
> > Is it just me, or did this break FATE?  
> 
> It broke on some systems because it  prints the side_data_size, which
> varies on some compilers/systems since the struct uses size_t
> We could probably just remove side_data_size, its not very informative
> and as seen here can even be compiler/platform dependent.

It broke much more here than just the size field.


More information about the ffmpeg-devel mailing list