[vlc-commits] mp4 mux: encode video orientation
Rafaël Carré
git at videolan.org
Wed Apr 2 09:19:27 CEST 2014
vlc | branch: master | Rafaël Carré <funman at videolan.org> | Tue Apr 1 17:56:53 2014 +0200| [cff295639b1cd437af6ca93dd0a2a705e136a4b1] | committer: Rafaël Carré
mp4 mux: encode video orientation
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=cff295639b1cd437af6ca93dd0a2a705e136a4b1
---
modules/mux/mp4.c | 26 ++++++++++++++++++++++++--
1 file changed, 24 insertions(+), 2 deletions(-)
diff --git a/modules/mux/mp4.c b/modules/mux/mp4.c
index 197254f..39a1e1f 100644
--- a/modules/mux/mp4.c
+++ b/modules/mux/mp4.c
@@ -1451,8 +1451,26 @@ static bo_t *GetStblBox(sout_mux_t *p_mux, mp4_stream_t *p_stream)
static int64_t get_timestamp(void);
-static const uint32_t mvhd_matrix[9] =
- { 0x10000, 0, 0, 0, 0x10000, 0, 0, 0, 0x40000000 };
+static void matrix_apply_rotation(es_format_t *fmt, uint32_t mvhd_matrix[9])
+{
+ enum video_orientation_t orientation = ORIENT_NORMAL;
+ if (fmt->i_cat == VIDEO_ES)
+ orientation = fmt->video.orientation;
+
+#define ATAN(a, b) do { mvhd_matrix[1] = (a) << 16; \
+ mvhd_matrix[0] = (b) << 16; \
+ } while(0)
+
+ switch (orientation) {
+ case ORIENT_ROTATED_90: ATAN( 1, 0); break;
+ case ORIENT_ROTATED_180: ATAN( 0, -1); break;
+ case ORIENT_ROTATED_270: ATAN( -1, 0); break;
+ default: ATAN( 0, 1); break;
+ }
+
+ mvhd_matrix[3] = mvhd_matrix[0] ? 0 : 0x10000;
+ mvhd_matrix[4] = mvhd_matrix[1] ? 0 : 0x10000;
+}
static bo_t *GetMoovBox(sout_mux_t *p_mux)
{
@@ -1494,6 +1512,9 @@ static bo_t *GetMoovBox(sout_mux_t *p_mux)
bo_add_16be(mvhd, 0); // reserved
for (int i = 0; i < 2; i++)
bo_add_32be(mvhd, 0); // reserved
+
+ uint32_t mvhd_matrix[9] = { 0x10000, 0, 0, 0, 0x10000, 0, 0, 0, 0x40000000 };
+
for (int i = 0; i < 9; i++)
bo_add_32be(mvhd, mvhd_matrix[i]);// matrix
for (int i = 0; i < 6; i++)
@@ -1551,6 +1572,7 @@ static bo_t *GetMoovBox(sout_mux_t *p_mux)
// volume
bo_add_16be(tkhd, p_stream->fmt.i_cat == AUDIO_ES ? 0x100 : 0);
bo_add_16be(tkhd, 0); // reserved
+ matrix_apply_rotation(&p_stream->fmt, mvhd_matrix);
for (int i = 0; i < 9; i++)
bo_add_32be(tkhd, mvhd_matrix[i]); // matrix
if (p_stream->fmt.i_cat == AUDIO_ES) {
More information about the vlc-commits
mailing list