On 2/15/2017 4:28 AM, Anton Khirnov wrote: > 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?
Yes, https://matroska.org/technical/specs/index.html is outdated. See instead https://github.com/Matroska-Org/matroska-specification https://github.com/Matroska-Org/libmatroska > >> 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. Vittorio forgot to squash this commit with the fix from https://git.videolan.org/?p=ffmpeg.git;a=commitdiff;h=8396d54d3c _______________________________________________ libav-devel mailing list libav-devel@libav.org https://lists.libav.org/mailman/listinfo/libav-devel