diff options
author | Kacper Michajłow <kasper93@gmail.com> | 2023-09-01 22:35:29 +0200 |
---|---|---|
committer | Dudemanguy <random342@airmail.cc> | 2023-09-17 16:48:42 +0000 |
commit | a4bf0bd695da7ac0fea561342c60d954d485af0a (patch) | |
tree | 67dc7a69a896e499e47bdab44b7f1ad812076dde /demux | |
parent | 338f31e0b694eec2f250b62cf7707ec9bdf71daf (diff) | |
download | mpv-a4bf0bd695da7ac0fea561342c60d954d485af0a.tar.bz2 mpv-a4bf0bd695da7ac0fea561342c60d954d485af0a.tar.xz |
demux_mkv: support ProjectionPoseRoll element
Diffstat (limited to 'demux')
-rw-r--r-- | demux/demux_mkv.c | 23 |
1 files changed, 23 insertions, 0 deletions
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); |