From a4bf0bd695da7ac0fea561342c60d954d485af0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kacper=20Michaj=C5=82ow?= Date: Fri, 1 Sep 2023 22:35:29 +0200 Subject: demux_mkv: support ProjectionPoseRoll element --- demux/demux_mkv.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) (limited to 'demux') diff --git a/demux/demux_mkv.c b/demux/demux_mkv.c index 59ee8e29fc..870d49dc5a 100644 --- a/demux/demux_mkv.c +++ b/demux/demux_mkv.c @@ -110,6 +110,8 @@ typedef struct mkv_track { struct mp_colorspace color; uint32_t v_crop_top, v_crop_left, v_crop_right, v_crop_bottom; bool v_crop_top_set, v_crop_left_set, v_crop_right_set, v_crop_bottom_set; + float v_projection_pose_roll; + bool v_projection_pose_roll_set; uint32_t a_channels, a_bps; float a_sfreq; @@ -606,6 +608,20 @@ static void parse_trackcolour(struct demuxer *demuxer, struct mkv_track *track, } } +static void parse_trackprojection(struct demuxer *demuxer, struct mkv_track *track, + struct ebml_projection *projection) +{ + if (projection->n_projection_pose_yaw || projection->n_projection_pose_pitch) + MP_WARN(demuxer, "Projection pose yaw/pitch not supported!\n"); + + if (projection->n_projection_pose_roll) { + track->v_projection_pose_roll = projection->projection_pose_roll; + track->v_projection_pose_roll_set = true; + MP_DBG(demuxer, "| + Projection pose roll: %f\n", + track->v_projection_pose_roll); + } +} + static void parse_trackvideo(struct demuxer *demuxer, struct mkv_track *track, struct ebml_video *video) { @@ -667,6 +683,8 @@ static void parse_trackvideo(struct demuxer *demuxer, struct mkv_track *track, } if (video->n_colour) parse_trackcolour(demuxer, track, &video->colour); + if (video->n_projection) + parse_trackprojection(demuxer, track, &video->projection); } /** @@ -1509,6 +1527,11 @@ static int demux_mkv_open_video(demuxer_t *demuxer, mkv_track_t *track) sh_v->crop.y1 = track->v_height - (track->v_crop_bottom_set ? track->v_crop_bottom : 0); + if (track->v_projection_pose_roll_set) { + int rotate = lrintf(fmodf(fmodf(track->v_projection_pose_roll, 360) + 360, 360)); + sh_v->rotate = rotate; + } + done: demux_add_sh_stream(demuxer, sh); -- cgit v1.2.3