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

Reply via email to