summaryrefslogtreecommitdiff
path: root/libavformat
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2014-05-19 19:21:53 +0200
committerMichael Niedermayer <michaelni@gmx.at>2014-05-19 19:21:53 +0200
commit07941c2cb28d6a80f628e035d61ab437d9719bf0 (patch)
tree24cb5c00fde296dc99c8fcac6dfd8727a9e5dbf3 /libavformat
parentef1d4ee2f8b621a009d482d5b183a905bcb1cd74 (diff)
parent853cc025d63ee2539fc0460dab62c5b9a3fd2043 (diff)
Merge commit '853cc025d63ee2539fc0460dab62c5b9a3fd2043'
* 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>
Diffstat (limited to 'libavformat')
-rw-r--r--libavformat/isom.h2
-rw-r--r--libavformat/mov.c62
2 files changed, 54 insertions, 10 deletions
diff --git a/libavformat/isom.h b/libavformat/isom.h
index a929ebf05e..a5934af4b9 100644
--- a/libavformat/isom.h
+++ b/libavformat/isom.h
@@ -145,6 +145,8 @@ typedef struct MOVStreamContext {
int nb_frames_for_fps;
int64_t duration_for_fps;
+
+ int32_t *display_matrix;
} MOVStreamContext;
typedef struct MOVContext {
diff --git a/libavformat/mov.c b/libavformat/mov.c
index b0500d9756..26fb0ed2b4 100644
--- a/libavformat/mov.c
+++ b/libavformat/mov.c
@@ -2560,7 +2560,7 @@ static int mov_read_tkhd(MOVContext *c, AVIOContext *pb, MOVAtom atom)
int width;
int height;
int64_t disp_transform[2];
- int display_matrix[3][2];
+ int display_matrix[3][3];
AVStream *st;
MOVStreamContext *sc;
int version;
@@ -2597,11 +2597,12 @@ static int mov_read_tkhd(MOVContext *c, AVIOContext *pb, MOVAtom atom)
//read in the display matrix (outlined in ISO 14496-12, Section 6.2.2)
// they're kept in fixed point format through all calculations
- // ignore u,v,z b/c we don't need the scale factor to calc aspect ratio
+ // save u,v,z to store the whole matrix in the AV_PKT_DATA_DISPLAYMATRIX
+ // side data, but the scale factor is not needed to calculate aspect ratio
for (i = 0; i < 3; i++) {
display_matrix[i][0] = avio_rb32(pb); // 16.16 fixed point
display_matrix[i][1] = avio_rb32(pb); // 16.16 fixed point
- avio_rb32(pb); // 2.30 fixed point (not used)
+ display_matrix[i][2] = avio_rb32(pb); // 2.30 fixed point
}
width = avio_rb32(pb); // 16.16 fixed point track width
@@ -2624,6 +2625,25 @@ static int mov_read_tkhd(MOVContext *c, AVIOContext *pb, MOVAtom atom)
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
@@ -3395,6 +3415,7 @@ static int mov_read_close(AVFormatContext *s)
av_freep(&sc->stts_data);
av_freep(&sc->stps_data);
av_freep(&sc->rap_group);
+ av_freep(&sc->display_matrix);
}
if (mov->dv_demux) {
@@ -3544,14 +3565,35 @@ static int mov_read_header(AVFormatContext *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;
}
}