Merge commit '853cc025d63ee2539fc0460dab62c5b9a3fd2043'
authorMichael Niedermayer <michaelni@gmx.at>
Mon, 19 May 2014 17:21:53 +0000 (19:21 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Mon, 19 May 2014 17:21:53 +0000 (19:21 +0200)
* commit '853cc025d63ee2539fc0460dab62c5b9a3fd2043':
  mov: store display matrix in a stream side data

Conflicts:
libavformat/isom.h
libavformat/mov.c

Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
libavformat/isom.h
libavformat/mov.c

@@@ -143,8 -136,7 +143,10 @@@ typedef struct MOVStreamContext 
      unsigned int rap_group_count;
      MOVSbgp *rap_group;
  
 +    int nb_frames_for_fps;
 +    int64_t duration_for_fps;
++
+     int32_t *display_matrix;
  } MOVStreamContext;
  
  typedef struct MOVContext {
@@@ -2609,21 -2394,25 +2610,40 @@@ static int mov_read_tkhd(MOVContext *c
      sc->width = width >> 16;
      sc->height = height >> 16;
  
 +    //Assign clockwise rotate values based on transform matrix so that
 +    //we can compensate for iPhone orientation during capture.
 +
 +    if (display_matrix[1][0] == -65536 && display_matrix[0][1] == 65536) {
 +         av_dict_set(&st->metadata, "rotate", "90", 0);
 +    }
 +
 +    if (display_matrix[0][0] == -65536 && display_matrix[1][1] == -65536) {
 +         av_dict_set(&st->metadata, "rotate", "180", 0);
 +    }
 +
 +    if (display_matrix[1][0] == 65536 && display_matrix[0][1] == -65536) {
 +         av_dict_set(&st->metadata, "rotate", "270", 0);
 +    }
 +
+     // save the matrix when it is not the default identity
+     if (display_matrix[0][0] != (1 << 16) ||
+         display_matrix[1][1] != (1 << 16) ||
+         display_matrix[2][2] != (1 << 30) ||
+         display_matrix[0][1] || display_matrix[0][2] ||
+         display_matrix[1][0] || display_matrix[1][2] ||
+         display_matrix[2][0] || display_matrix[2][1]) {
+         int i, j;
+         av_freep(&sc->display_matrix);
+         sc->display_matrix = av_malloc(sizeof(int32_t) * 9);
+         if (!sc->display_matrix)
+             return AVERROR(ENOMEM);
+         for (i = 0; i < 3; i++)
+             for (j = 0; j < 3; j++)
+                 sc->display_matrix[i * 3 + j] = display_matrix[j][i];
+     }
      // transform the display width/height according to the matrix
      // skip this if the display matrix is the default identity matrix
      // or if it is rotating the picture, ex iPhone 3GS
@@@ -3534,24 -3068,37 +3555,45 @@@ static int mov_read_header(AVFormatCont
          }
      }
  
 +    for (i = 0; i < mov->bitrates_count && i < s->nb_streams; i++) {
 +        if (mov->bitrates[i]) {
 +            s->streams[i]->codec->bit_rate = mov->bitrates[i];
 +        }
 +    }
 +
 +    ff_rfps_calculate(s);
 +
      for (i = 0; i < s->nb_streams; i++) {
          AVStream *st = s->streams[i];
+         MOVStreamContext *sc = st->priv_data;
  
-         if (st->codec->codec_type != AVMEDIA_TYPE_AUDIO)
-             continue;
-         err = ff_replaygain_export(st, s->metadata);
-         if (err < 0) {
-             mov_read_close(s);
-             return err;
+         switch (st->codec->codec_type) {
+         case AVMEDIA_TYPE_AUDIO:
+             err = ff_replaygain_export(st, s->metadata);
+             if (err < 0) {
+                 mov_read_close(s);
+                 return err;
+             }
+             break;
+         case AVMEDIA_TYPE_VIDEO:
+             if (sc->display_matrix) {
+                 AVPacketSideData *sd, *tmp;
+                 tmp = av_realloc_array(st->side_data,
+                                        st->nb_side_data + 1, sizeof(*tmp));
+                 if (!tmp)
+                     return AVERROR(ENOMEM);
+                 st->side_data = tmp;
+                 st->nb_side_data++;
+                 sd = &st->side_data[st->nb_side_data - 1];
+                 sd->type = AV_PKT_DATA_DISPLAYMATRIX;
+                 sd->size = sizeof(int32_t) * 9;
+                 sd->data = (uint8_t*)sc->display_matrix;
+                 sc->display_matrix = NULL;
+             }
+             break;
          }
      }