|
|
|
@ -31,6 +31,7 @@ |
|
|
|
|
#include "libavutil/opt.h" |
|
|
|
|
#include "libavutil/avstring.h" |
|
|
|
|
#include "libavutil/replaygain.h" |
|
|
|
|
#include "libavutil/spherical.h" |
|
|
|
|
#include "libavutil/stereo3d.h" |
|
|
|
|
|
|
|
|
|
#include "avformat.h" |
|
|
|
@ -342,6 +343,31 @@ static void dump_mastering_display_metadata(void *ctx, AVPacketSideData* sd) { |
|
|
|
|
av_q2d(metadata->min_luminance), av_q2d(metadata->max_luminance)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
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; |
|
|
|
@ -393,6 +419,10 @@ static void dump_sidedata(void *ctx, AVStream *st, const char *indent) |
|
|
|
|
case AV_PKT_DATA_MASTERING_DISPLAY_METADATA: |
|
|
|
|
dump_mastering_display_metadata(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_INFO, |
|
|
|
|
"unknown side data type %d (%d bytes)", sd.type, sd.size); |
|
|
|
|