Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mpc-hc/FFmpeg.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarl Eugen Hoyos <cehoyos@ag.or.at>2015-01-11 14:11:36 +0300
committerCarl Eugen Hoyos <cehoyos@ag.or.at>2015-01-11 14:15:03 +0300
commita5334d408148f20e0680f65daa3aff837c5f5db5 (patch)
tree90ef39b498b9490100b006e0636ad078b4e5a410 /libavformat
parentaa6545e1f30e6f0aa7ad7498f524190b978b4e02 (diff)
Handle r10k endianess atom DpxE.
Fixes playback and remuxing of r10k_full-range_big-endian.mov. Reported, analyzed and tested by Olaf Matthes, olaf matthes gmx de
Diffstat (limited to 'libavformat')
-rw-r--r--libavformat/mov.c6
-rw-r--r--libavformat/movenc.c16
2 files changed, 22 insertions, 0 deletions
diff --git a/libavformat/mov.c b/libavformat/mov.c
index 19ec11f968..3dee572038 100644
--- a/libavformat/mov.c
+++ b/libavformat/mov.c
@@ -1114,6 +1114,11 @@ static int mov_read_jp2h(MOVContext *c, AVIOContext *pb, MOVAtom atom)
return mov_read_extradata(c, pb, atom, AV_CODEC_ID_JPEG2000);
}
+static int mov_read_dpxe(MOVContext *c, AVIOContext *pb, MOVAtom atom)
+{
+ return mov_read_extradata(c, pb, atom, AV_CODEC_ID_R10K);
+}
+
static int mov_read_avid(MOVContext *c, AVIOContext *pb, MOVAtom atom)
{
int ret = mov_read_extradata(c, pb, atom, AV_CODEC_ID_AVUI);
@@ -3363,6 +3368,7 @@ static const MOVParseTableEntry mov_default_parse_table[] = {
{ MKTAG('c','o','l','r'), mov_read_colr },
{ MKTAG('c','t','t','s'), mov_read_ctts }, /* composition time to sample */
{ MKTAG('d','i','n','f'), mov_read_default },
+{ MKTAG('D','p','x','E'), mov_read_dpxe },
{ MKTAG('d','r','e','f'), mov_read_dref },
{ MKTAG('e','d','t','s'), mov_read_default },
{ MKTAG('e','l','s','t'), mov_read_elst },
diff --git a/libavformat/movenc.c b/libavformat/movenc.c
index bc2d9eff2b..29535cdaeb 100644
--- a/libavformat/movenc.c
+++ b/libavformat/movenc.c
@@ -1081,6 +1081,19 @@ static int mov_write_avid_tag(AVIOContext *pb, MOVTrack *track)
return 0;
}
+static int mov_write_dpxe_tag(AVIOContext *pb, MOVTrack *track)
+{
+ avio_wb32(pb, 12);
+ ffio_wfourcc(pb, "DpxE");
+ if (track->enc->extradata_size >= 12 &&
+ !memcmp(&track->enc->extradata[4], "DpxE", 4)) {
+ avio_wb32(pb, track->enc->extradata[11]);
+ } else {
+ avio_wb32(pb, 1);
+ }
+ return 0;
+}
+
static int mp4_get_codec_tag(AVFormatContext *s, MOVTrack *track)
{
int tag = track->enc->codec_tag;
@@ -1580,6 +1593,9 @@ static int mov_write_video_tag(AVIOContext *pb, MOVTrack *track)
track->enc->codec_id == AV_CODEC_ID_VP6A) {
/* Don't write any potential extradata here - the cropping
* is signalled via the normal width/height fields. */
+ } else if (track->enc->codec_id == AV_CODEC_ID_R10K) {
+ if (track->enc->codec_tag == MKTAG('R','1','0','k'))
+ mov_write_dpxe_tag(pb, track);
} else if (track->vos_len > 0)
mov_write_glbl_tag(pb, track);