Quoting Vittorio Giovara (2017-02-10 22:08:08) > From: James Almer <jamr...@gmail.com> > > Signed-off-by: James Almer <jamr...@gmail.com> > Signed-off-by: Vittorio Giovara <vittorio.giov...@gmail.com> > --- > libavformat/matroska.h | 14 +++++++++++ > libavformat/matroskadec.c | 63 > +++++++++++++++++++++++++++++++++++++++++++++++ > 2 files changed, 77 insertions(+) >
I don't see this in the spec. Is this standard? > diff --git a/libavformat/matroska.h b/libavformat/matroska.h > index 91bb978..4e9f96e 100644 > --- a/libavformat/matroska.h > +++ b/libavformat/matroska.h > @@ -118,6 +118,13 @@ > #define MATROSKA_ID_VIDEOASPECTRATIO 0x54B3 > #define MATROSKA_ID_VIDEOCOLORSPACE 0x2EB524 > > +#define MATROSKA_ID_VIDEOPROJECTION 0x7670 > +#define MATROSKA_ID_VIDEOPROJECTIONTYPE 0x7671 > +#define MATROSKA_ID_VIDEOPROJECTIONPRIVATE 0x7672 > +#define MATROSKA_ID_VIDEOPROJECTIONPOSEYAW 0x7673 > +#define MATROSKA_ID_VIDEOPROJECTIONPOSEPITCH 0x7674 > +#define MATROSKA_ID_VIDEOPROJECTIONPOSEROLL 0x7675 > + > /* IDs in the trackaudio master */ > #define MATROSKA_ID_AUDIOSAMPLINGFREQ 0xB5 > #define MATROSKA_ID_AUDIOOUTSAMPLINGFREQ 0x78B5 > @@ -256,6 +263,13 @@ typedef enum { > MATROSKA_VIDEO_STEREOMODE_TYPE_NB, > } MatroskaVideoStereoModeType; > > +typedef enum { > + MATROSKA_VIDEO_PROJECTION_TYPE_RECTANGULAR = 0, > + MATROSKA_VIDEO_PROJECTION_TYPE_EQUIRECTANGULAR = 1, > + MATROSKA_VIDEO_PROJECTION_TYPE_CUBEMAP = 2, > + MATROSKA_VIDEO_PROJECTION_TYPE_MESH = 3, > +} MatroskaVideoProjectionType; > + > /* > * Matroska Codec IDs, strings > */ > diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c > index 4e121b6..a44ceeb 100644 > --- a/libavformat/matroskadec.c > +++ b/libavformat/matroskadec.c > @@ -45,6 +45,7 @@ > #include "libavutil/intreadwrite.h" > #include "libavutil/lzo.h" > #include "libavutil/mathematics.h" > +#include "libavutil/spherical.h" > > #include "libavcodec/bytestream.h" > #include "libavcodec/flac.h" > @@ -116,6 +117,14 @@ typedef struct MatroskaTrackEncoding { > MatroskaTrackCompression compression; > } MatroskaTrackEncoding; > > +typedef struct MatroskaTrackVideoProjection { > + uint64_t type; > + EbmlBin private; > + double yaw; > + double pitch; > + double roll; > +} MatroskaTrackVideoProjection; > + > typedef struct MatroskaTrackVideo { > double frame_rate; > uint64_t display_width; > @@ -126,6 +135,7 @@ typedef struct MatroskaTrackVideo { > uint64_t interlaced; > uint64_t field_order; > uint64_t stereo_mode; > + MatroskaTrackVideoProjection projection; > } MatroskaTrackVideo; > > typedef struct MatroskaTrackAudio { > @@ -309,6 +319,15 @@ static EbmlSyntax matroska_info[] = { > { 0 } > }; > > +static const EbmlSyntax matroska_track_video_projection[] = { > + { MATROSKA_ID_VIDEOPROJECTIONTYPE, EBML_UINT, 0, > offsetof(MatroskaTrackVideoProjection, type), { .u = > MATROSKA_VIDEO_PROJECTION_TYPE_RECTANGULAR } }, > + { MATROSKA_ID_VIDEOPROJECTIONPRIVATE, EBML_BIN, 0, > offsetof(MatroskaTrackVideoProjection, private) }, > + { MATROSKA_ID_VIDEOPROJECTIONPOSEYAW, EBML_FLOAT, 0, > offsetof(MatroskaTrackVideoProjection, yaw), { .f=0.0 } }, > + { MATROSKA_ID_VIDEOPROJECTIONPOSEPITCH, EBML_FLOAT, 0, > offsetof(MatroskaTrackVideoProjection, pitch), { .f=0.0 } }, > + { MATROSKA_ID_VIDEOPROJECTIONPOSEROLL, EBML_FLOAT, 0, > offsetof(MatroskaTrackVideoProjection, roll), { .f=0.0 } }, > + { 0 } > +}; > + > static EbmlSyntax matroska_track_video[] = { > { MATROSKA_ID_VIDEOFRAMERATE, EBML_FLOAT, 0, > offsetof(MatroskaTrackVideo, frame_rate) }, > { MATROSKA_ID_VIDEODISPLAYWIDTH, EBML_UINT, 0, > offsetof(MatroskaTrackVideo, display_width) }, > @@ -316,6 +335,7 @@ static EbmlSyntax matroska_track_video[] = { > { MATROSKA_ID_VIDEOPIXELWIDTH, EBML_UINT, 0, > offsetof(MatroskaTrackVideo, pixel_width) }, > { MATROSKA_ID_VIDEOPIXELHEIGHT, EBML_UINT, 0, > offsetof(MatroskaTrackVideo, pixel_height) }, > { MATROSKA_ID_VIDEOCOLORSPACE, EBML_UINT, 0, > offsetof(MatroskaTrackVideo, fourcc) }, > + { MATROSKA_ID_VIDEOPROJECTION, EBML_NEST, 0, > offsetof(MatroskaTrackVideo, projection), { .n = > matroska_track_video_projection } }, > { MATROSKA_ID_VIDEOPIXELCROPB, EBML_NONE }, > { MATROSKA_ID_VIDEOPIXELCROPT, EBML_NONE }, > { MATROSKA_ID_VIDEOPIXELCROPL, EBML_NONE }, > @@ -1576,6 +1596,45 @@ static void mkv_stereo_mode_display_mul(int > stereo_mode, > } > } > > +static int mkv_parse_video_projection(AVStream *st, const MatroskaTrack > *track) > +{ > + AVSphericalMapping *spherical; > + enum AVSphericalProjection projection; > + size_t spherical_size; > + int ret; > + > + switch (track->video.projection.type) { > + case MATROSKA_VIDEO_PROJECTION_TYPE_EQUIRECTANGULAR: > + projection = AV_SPHERICAL_EQUIRECTANGULAR; > + break; > + case MATROSKA_VIDEO_PROJECTION_TYPE_CUBEMAP: > + if (track->video.projection.private.size < 4) { > + av_log(NULL, AV_LOG_ERROR, "Missing projection private > properties\n"); > + return AVERROR_INVALIDDATA; > + } > + projection = AV_SPHERICAL_CUBEMAP; > + break; > + default: > + return 0; > + } > + > + spherical = av_spherical_alloc(&spherical_size); > + if (!spherical) > + return AVERROR(ENOMEM); > + spherical->projection = projection; > + > + spherical->yaw = (int32_t)(track->video.projection.yaw * (1 << 16)); > + spherical->pitch = (int32_t)(track->video.projection.pitch * (1 << 16)); > + spherical->roll = (int32_t)(track->video.projection.roll * (1 << 16)); > + > + ret = av_stream_add_side_data(st, AV_PKT_DATA_SPHERICAL, (uint8_t > *)spherical, > + spherical_size); > + if (ret < 0) > + return ret; Leaking spherical on failure. -- Anton Khirnov _______________________________________________ libav-devel mailing list libav-devel@libav.org https://lists.libav.org/mailman/listinfo/libav-devel