Commit bde96422 authored by Vittorio Giovara's avatar Vittorio Giovara

mkv: Export bounds and padding from spherical metadata

Update the fate test as needed.
parent 022b4ea5
......@@ -1913,16 +1913,67 @@ static int mkv_parse_video_projection(AVStream *st, const MatroskaTrack *track)
AVSphericalMapping *spherical;
enum AVSphericalProjection projection;
size_t spherical_size;
size_t l = 0, t = 0, r = 0, b = 0;
size_t padding = 0;
int ret;
GetByteContext gb;
bytestream2_init(&gb, track->video.projection.private.data,
track->video.projection.private.size);
if (bytestream2_get_byte(&gb) != 0) {
av_log(NULL, AV_LOG_WARNING, "Unknown spherical metadata\n");
return 0;
}
bytestream2_skip(&gb, 3); // flags
switch (track->video.projection.type) {
case MATROSKA_VIDEO_PROJECTION_TYPE_EQUIRECTANGULAR:
projection = AV_SPHERICAL_EQUIRECTANGULAR;
if (track->video.projection.private.size == 0)
projection = AV_SPHERICAL_EQUIRECTANGULAR;
else if (track->video.projection.private.size == 20) {
t = bytestream2_get_be32(&gb);
b = bytestream2_get_be32(&gb);
l = bytestream2_get_be32(&gb);
r = bytestream2_get_be32(&gb);
if (b >= UINT_MAX - t || r >= UINT_MAX - l) {
av_log(NULL, AV_LOG_ERROR,
"Invalid bounding rectangle coordinates "
"%"SIZE_SPECIFIER",%"SIZE_SPECIFIER","
"%"SIZE_SPECIFIER",%"SIZE_SPECIFIER"\n",
l, t, r, b);
return AVERROR_INVALIDDATA;
}
if (l || t || r || b)
projection = AV_SPHERICAL_EQUIRECTANGULAR_TILE;
else
projection = AV_SPHERICAL_EQUIRECTANGULAR;
} else {
av_log(NULL, AV_LOG_ERROR, "Unknown spherical metadata\n");
return AVERROR_INVALIDDATA;
}
break;
case MATROSKA_VIDEO_PROJECTION_TYPE_CUBEMAP:
if (track->video.projection.private.size < 4)
if (track->video.projection.private.size < 4) {
av_log(NULL, AV_LOG_ERROR, "Missing projection private properties\n");
return AVERROR_INVALIDDATA;
} else if (track->video.projection.private.size == 12) {
uint32_t layout = bytestream2_get_be32(&gb);
if (layout == 0) {
projection = AV_SPHERICAL_CUBEMAP;
} else {
av_log(NULL, AV_LOG_WARNING,
"Unknown spherical cubemap layout %"PRIu32"\n", layout);
return 0;
}
padding = bytestream2_get_be32(&gb);
} else {
av_log(NULL, AV_LOG_ERROR, "Unknown spherical metadata\n");
return AVERROR_INVALIDDATA;
projection = AV_SPHERICAL_CUBEMAP;
}
break;
default:
return 0;
......@@ -1937,6 +1988,13 @@ static int mkv_parse_video_projection(AVStream *st, const MatroskaTrack *track)
spherical->pitch = (int32_t)(track->video.projection.pitch * (1 << 16));
spherical->roll = (int32_t)(track->video.projection.roll * (1 << 16));
spherical->padding = padding;
spherical->bound_left = l;
spherical->bound_top = t;
spherical->bound_right = r;
spherical->bound_bottom = b;
ret = av_stream_add_side_data(st, AV_PKT_DATA_SPHERICAL, (uint8_t *)spherical,
spherical_size);
if (ret < 0) {
......
......@@ -8,7 +8,11 @@ inverted=0
[SIDE_DATA]
side_data_type=Spherical Mapping
side_data_size=56
projection=equirectangular
projection=tiled equirectangular
bound_left=148
bound_top=73
bound_right=147
bound_bottom=72
yaw=45
pitch=30
roll=15
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment