[FFmpeg-devel] [PATCH]Set Matroska private data when muxing Prores
Carl Eugen Hoyos
cehoyos at ag.or.at
Sun Apr 6 03:23:38 CEST 2014
On Saturday 05 April 2014 02:20:04 pm Michael Niedermayer wrote:
> On Mon, Mar 31, 2014 at 01:43:01AM +0200, Carl Eugen Hoyos wrote:
> > I don't think ticket #3434 is valid but the specification requires Prores
> > in mkv to set private data to the "fourcc as found in MP4".
> > http://matroska.org/technical/specs/codecid/index.html
> > + } else if (codec->codec_id == AV_CODEC_ID_PRORES &&
> > + ff_codec_get_id(ff_codec_movvideo_tags,
> > codec->codec_tag) == AV_CODEC_ID_PRORES) {
> >
> > + avio_write(dyn_cp, (uint8_t *)&codec->codec_tag, 4);
>
> this will fail on big endian
New patch attached.
> also, have you compared against some mkv generated by some other
> software ? (to make sure what we store matches in length and content)
I was hoping you could confirm that my interpretation of the link above
is correct (or reasonable).
I tested that mkvmerge reads the codec point from FFmpeg's files and
writes it to files so that FFmpeg can read it.
Thank you, Carl Eugen
-------------- next part --------------
diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
index 4390b6b..6976da8 100644
--- a/libavformat/matroskadec.c
+++ b/libavformat/matroskadec.c
@@ -1914,6 +1914,8 @@ static int matroska_read_header(AVFormatContext *s)
st->codec->block_align = track->audio.sub_packet_size;
extradata_offset = 78;
}
+ } else if (codec_id == AV_CODEC_ID_PRORES && track->codec_priv.size == 4) {
+ fourcc = AV_RL32(track->codec_priv.data);
}
track->codec_priv.size -= extradata_offset;
diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c
index 7d83665..529ab2a 100644
--- a/libavformat/matroskaenc.c
+++ b/libavformat/matroskaenc.c
@@ -544,6 +544,9 @@ static int mkv_write_codecprivate(AVFormatContext *s, AVIOContext *pb, AVCodecCo
} else
avio_write(dyn_cp, codec->extradata + 12,
codec->extradata_size - 12);
+ } else if (codec->codec_id == AV_CODEC_ID_PRORES &&
+ ff_codec_get_id(ff_codec_movvideo_tags, codec->codec_tag) == AV_CODEC_ID_PRORES) {
+ avio_wl32(dyn_cp, codec->codec_tag);
}
else if (codec->extradata_size && codec->codec_id != AV_CODEC_ID_TTA)
avio_write(dyn_cp, codec->extradata, codec->extradata_size);
More information about the ffmpeg-devel
mailing list