mov: Check angle rather than full matrix when updating SAR

When the display matrix is not the identity one, but the rotation angle
is zero, there is no need to update the sample aspect ratio.

Otherwise, it is possible to obtain negative values which interferes
with transcoding in later stages. This kind of behaviour is reproducible
on mov files with "major_brand: MSNV".

CC: libav-stable@libav.org
Signed-off-by: Vittorio Giovara <vittorio.giovara@gmail.com>
pull/101/merge
Vittorio Giovara 10 years ago
parent 1e76345432
commit cf70ba37ba
  1. 12
      libavformat/mov.c

@ -35,6 +35,7 @@
#include "libavutil/time_internal.h" #include "libavutil/time_internal.h"
#include "libavutil/avstring.h" #include "libavutil/avstring.h"
#include "libavutil/dict.h" #include "libavutil/dict.h"
#include "libavutil/display.h"
#include "libavutil/opt.h" #include "libavutil/opt.h"
#include "libavcodec/ac3tab.h" #include "libavcodec/ac3tab.h"
#include "avformat.h" #include "avformat.h"
@ -2578,15 +2579,10 @@ static int mov_read_tkhd(MOVContext *c, AVIOContext *pb, MOVAtom atom)
} }
// transform the display width/height according to the matrix // transform the display width/height according to the matrix
// skip this if the display matrix is the default identity matrix // skip this if the rotation angle is 0 degrees
// or if it is rotating the picture, ex iPhone 3GS
// to keep the same scale, use [width height 1<<16] // to keep the same scale, use [width height 1<<16]
if (width && height && if (width && height && sc->display_matrix &&
((display_matrix[0][0] != 65536 || av_display_rotation_get(sc->display_matrix) != 0.0f) {
display_matrix[1][1] != 65536) &&
!display_matrix[0][1] &&
!display_matrix[1][0] &&
!display_matrix[2][0] && !display_matrix[2][1])) {
for (i = 0; i < 2; i++) for (i = 0; i < 2; i++)
disp_transform[i] = disp_transform[i] =
(int64_t) width * display_matrix[0][i] + (int64_t) width * display_matrix[0][i] +

Loading…
Cancel
Save