From 2fb6acd9c28907e4f8c0510099a4603ea6caf861 Mon Sep 17 00:00:00 2001 From: Vittorio Giovara Date: Wed, 2 Nov 2016 11:28:54 -0400 Subject: [PATCH] lavc: Add spherical packet side data API Signed-off-by: Vittorio Giovara --- avprobe.c | 21 +++++++++++++++++++++ doc/APIchanges | 4 ++++ libavcodec/avcodec.h | 6 ++++++ libavcodec/decode.c | 1 + libavcodec/version.h | 4 ++-- libavformat/dump.c | 30 ++++++++++++++++++++++++++++++ libavutil/version.h | 2 +- 7 files changed, 65 insertions(+), 3 deletions(-) diff --git a/avprobe.c b/avprobe.c index ff28a0b343..8142ce2966 100644 --- a/avprobe.c +++ b/avprobe.c @@ -27,6 +27,7 @@ #include "libavutil/display.h" #include "libavutil/opt.h" #include "libavutil/pixdesc.h" +#include "libavutil/spherical.h" #include "libavutil/stereo3d.h" #include "libavutil/dict.h" #include "libavutil/libm.h" @@ -766,6 +767,7 @@ static void show_stream(InputFile *ifile, InputStream *ist) for (i = 0; i < stream->nb_side_data; i++) { const AVPacketSideData* sd = &stream->side_data[i]; AVStereo3D *stereo; + AVSphericalMapping *spherical; switch (sd->type) { case AV_PKT_DATA_DISPLAYMATRIX: @@ -786,6 +788,25 @@ static void show_stream(InputFile *ifile, InputStream *ist) !!(stereo->flags & AV_STEREO3D_FLAG_INVERT)); probe_object_footer("stereo3d"); break; + case AV_PKT_DATA_SPHERICAL: + spherical = (AVSphericalMapping *)sd->data; + probe_object_header("spherical"); + + if (spherical->projection == AV_SPHERICAL_EQUIRECTANGULAR) + probe_str("projection", "equirectangular"); + else if (spherical->projection == AV_SPHERICAL_CUBEMAP) + probe_str("projection", "cubemap"); + else + probe_str("projection", "unknown"); + + probe_object_header("orientation"); + probe_int("yaw", (double) spherical->yaw / (1 << 16)); + probe_int("pitch", (double) spherical->pitch / (1 << 16)); + probe_int("roll", (double) spherical->roll / (1 << 16)); + probe_object_footer("orientation"); + + probe_object_footer("spherical"); + break; } } probe_object_footer("sidedata"); diff --git a/doc/APIchanges b/doc/APIchanges index c330310cab..d5dc5edaa5 100644 --- a/doc/APIchanges +++ b/doc/APIchanges @@ -13,6 +13,10 @@ libavutil: 2015-08-28 API changes, most recent first: +2016-xx-xx - xxxxxxx - lavc 57.29.0 - avcodec.h + Add AV_PKT_DATA_SPHERICAL packet side data to export AVSphericalMapping + information from containers. + 2016-xx-xx - xxxxxxx - lavu 55.30.0 - spherical.h Add AV_FRAME_DATA_SPHERICAL value, av_spherical_alloc() API and AVSphericalMapping type to export and describe spherical video properties. diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h index e75d300ba0..6e1ed74e08 100644 --- a/libavcodec/avcodec.h +++ b/libavcodec/avcodec.h @@ -1289,6 +1289,12 @@ enum AVPacketSideDataType { * This side data corresponds to the AVCPBProperties struct. */ AV_PKT_DATA_CPB_PROPERTIES, + + /** + * This side data should be associated with a video stream and corresponds + * to the AVSphericalMapping structure. + */ + AV_PKT_DATA_SPHERICAL, }; typedef struct AVPacketSideData { diff --git a/libavcodec/decode.c b/libavcodec/decode.c index 42bcee2d17..00085c3b4d 100644 --- a/libavcodec/decode.c +++ b/libavcodec/decode.c @@ -747,6 +747,7 @@ int ff_decode_frame_props(AVCodecContext *avctx, AVFrame *frame) } sd[] = { { AV_PKT_DATA_REPLAYGAIN , AV_FRAME_DATA_REPLAYGAIN }, { AV_PKT_DATA_DISPLAYMATRIX, AV_FRAME_DATA_DISPLAYMATRIX }, + { AV_PKT_DATA_SPHERICAL, AV_FRAME_DATA_SPHERICAL }, { AV_PKT_DATA_STEREO3D, AV_FRAME_DATA_STEREO3D }, { AV_PKT_DATA_AUDIO_SERVICE_TYPE, AV_FRAME_DATA_AUDIO_SERVICE_TYPE }, }; diff --git a/libavcodec/version.h b/libavcodec/version.h index 6f58bc8c51..adab9b47a3 100644 --- a/libavcodec/version.h +++ b/libavcodec/version.h @@ -28,8 +28,8 @@ #include "libavutil/version.h" #define LIBAVCODEC_VERSION_MAJOR 57 -#define LIBAVCODEC_VERSION_MINOR 28 -#define LIBAVCODEC_VERSION_MICRO 4 +#define LIBAVCODEC_VERSION_MINOR 30 +#define LIBAVCODEC_VERSION_MICRO 0 #define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \ LIBAVCODEC_VERSION_MINOR, \ diff --git a/libavformat/dump.c b/libavformat/dump.c index 3b50f5d944..660df0a533 100644 --- a/libavformat/dump.c +++ b/libavformat/dump.c @@ -27,6 +27,7 @@ #include "libavutil/log.h" #include "libavutil/mathematics.h" #include "libavutil/replaygain.h" +#include "libavutil/spherical.h" #include "libavutil/stereo3d.h" #include "avformat.h" @@ -306,6 +307,31 @@ static void dump_cpb(void *ctx, AVPacketSideData *sd) cpb->vbv_delay); } +static void dump_spherical(void *ctx, AVPacketSideData *sd) +{ + AVSphericalMapping *spherical = (AVSphericalMapping *)sd->data; + double yaw, pitch, roll; + + if (sd->size < sizeof(*spherical)) { + av_log(ctx, AV_LOG_INFO, "invalid data"); + return; + } + + if (spherical->projection == AV_SPHERICAL_EQUIRECTANGULAR) + av_log(ctx, AV_LOG_INFO, "equirectangular "); + else if (spherical->projection == AV_SPHERICAL_CUBEMAP) + av_log(ctx, AV_LOG_INFO, "cubemap "); + else { + av_log(ctx, AV_LOG_WARNING, "unknown"); + return; + } + + yaw = ((double)spherical->yaw) / (1 << 16); + pitch = ((double)spherical->pitch) / (1 << 16); + roll = ((double)spherical->roll) / (1 << 16); + av_log(ctx, AV_LOG_INFO, "(%f/%f/%f) ", yaw, pitch, roll); +} + static void dump_sidedata(void *ctx, AVStream *st, const char *indent) { int i; @@ -354,6 +380,10 @@ static void dump_sidedata(void *ctx, AVStream *st, const char *indent) av_log(ctx, AV_LOG_INFO, "cpb: "); dump_cpb(ctx, &sd); break; + case AV_PKT_DATA_SPHERICAL: + av_log(ctx, AV_LOG_INFO, "spherical: "); + dump_spherical(ctx, &sd); + break; default: av_log(ctx, AV_LOG_WARNING, "unknown side data type %d (%d bytes)", sd.type, sd.size); diff --git a/libavutil/version.h b/libavutil/version.h index e9940f2518..f1102312ba 100644 --- a/libavutil/version.h +++ b/libavutil/version.h @@ -54,7 +54,7 @@ */ #define LIBAVUTIL_VERSION_MAJOR 55 -#define LIBAVUTIL_VERSION_MINOR 30 +#define LIBAVUTIL_VERSION_MINOR 29 #define LIBAVUTIL_VERSION_MICRO 0 #define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \