diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2014-05-19 19:21:53 +0200 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2014-05-19 19:21:53 +0200 |
commit | 07941c2cb28d6a80f628e035d61ab437d9719bf0 (patch) | |
tree | 24cb5c00fde296dc99c8fcac6dfd8727a9e5dbf3 | |
parent | ef1d4ee2f8b621a009d482d5b183a905bcb1cd74 (diff) | |
parent | 853cc025d63ee2539fc0460dab62c5b9a3fd2043 (diff) | |
download | ffmpeg-07941c2cb28d6a80f628e035d61ab437d9719bf0.tar.gz |
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>
-rw-r--r-- | libavformat/isom.h | 2 | ||||
-rw-r--r-- | libavformat/mov.c | 62 |
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; } } |