---
Rebased over the split patchset.
libavformat/mov.c | 23 +++++++++++++++++++++--
libavformat/movenc.c | 17 +++++++++++++++++
2 files changed, 38 insertions(+), 2 deletions(-)
diff --git a/libavformat/mov.c b/libavformat/mov.c
index 0e823f5..6f2fae8 100644
--- a/libavformat/mov.c
+++ b/libavformat/mov.c
@@ -1306,6 +1306,23 @@ static void mov_parse_stsd_subtitle(MOVContext *c,
AVIOContext *pb,
st->codec->height = sc->height;
}
+static int mov_parse_stsd_data(MOVContext *c, AVIOContext *pb,
+ AVStream *st, MOVStreamContext *sc,
+ int size)
+{
+ if (st->codec->codec_tag == MKTAG('t','m','c','d')) {
+ st->codec->extradata_size = size;
+ st->codec->extradata = av_malloc(size + FF_INPUT_BUFFER_PADDING_SIZE);
+ if (!st->codec->extradata)
+ return AVERROR(ENOMEM);
+ avio_read(pb, st->codec->extradata, size);
+ } else {
+ /* other codec type, just skip (rtp, mp4s ...) */
+ avio_skip(pb, size);
+ }
+ return 0;
+}
+
static int mov_finalize_stsd_codec(MOVContext *c, AVIOContext *pb,
AVStream *st, MOVStreamContext *sc)
{
@@ -1448,8 +1465,10 @@ int ff_mov_read_stsd_entries(MOVContext *c, AVIOContext
*pb, int entries)
mov_parse_stsd_subtitle(c, pb, st, sc,
size - (avio_tell(pb) - start_pos));
} else {
- /* other codec type, just skip (rtp, mp4s, tmcd ...) */
- avio_skip(pb, size - (avio_tell(pb) - start_pos));
+ ret = mov_parse_stsd_data(c, pb, st, sc,
+ size - (avio_tell(pb) - start_pos));
+ if (ret < 0)
+ return ret;
}
/* this will read extra atoms at the end (wave, alac, damr, avcC, SMI
...) */
a.size = size - (avio_tell(pb) - start_pos);
diff --git a/libavformat/movenc.c b/libavformat/movenc.c
index 577c7e8..0780761 100644
--- a/libavformat/movenc.c
+++ b/libavformat/movenc.c
@@ -1060,6 +1060,19 @@ static int mov_write_rtp_tag(AVIOContext *pb, MOVTrack
*track)
return update_size(pb, pos);
}
+static int mov_write_tmcd_tag(AVIOContext *pb, MOVTrack *track)
+{
+ int64_t pos = avio_tell(pb);
+
+ avio_wb32(pb, 0); /* size */
+ ffio_wfourcc(pb, "tmcd"); /* Data format */
+ avio_wb32(pb, 0); /* Reserved */
+ avio_wb32(pb, 1); /* Data reference index */
+ if (track->enc->extradata_size)
+ avio_write(pb, track->enc->extradata, track->enc->extradata_size);
+ return update_size(pb, pos);
+}
+
static int mov_write_stsd_tag(AVIOContext *pb, MOVTrack *track)
{
int64_t pos = avio_tell(pb);
@@ -1075,6 +1088,8 @@ static int mov_write_stsd_tag(AVIOContext *pb, MOVTrack
*track)
mov_write_subtitle_tag(pb, track);
else if (track->enc->codec_tag == MKTAG('r','t','p',' '))
mov_write_rtp_tag(pb, track);
+ else if (track->enc->codec_tag == MKTAG('t','m','c','d'))
+ mov_write_tmcd_tag(pb, track);
return update_size(pb, pos);
}
@@ -1324,6 +1339,8 @@ static int mov_write_minf_tag(AVIOContext *pb, MOVTrack
*track)
else mov_write_nmhd_tag(pb);
} else if (track->tag == MKTAG('r','t','p',' ')) {
mov_write_hmhd_tag(pb);
+ } else if (track->tag == MKTAG('t','m','c','d')) {
+ mov_write_gmhd_tag(pb);
}
if (track->mode == MODE_MOV) /* FIXME: Why do it for MODE_MOV only ? */
mov_write_hdlr_tag(pb, NULL);
--
1.8.3.2
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel