aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMats Peterson <matsp888@yahoo.com>2016-03-12 16:18:36 +0100
committerMichael Niedermayer <michael@niedermayer.cc>2016-03-13 16:06:09 +0100
commit77bc3e1944a912d712aa0d6d146b991a3686d618 (patch)
treeeaf1eed11208cbcb31bce4e5ff61393d83dc45ba
parent9ee5b4096476d369157accc491b0f69a28cb9b6b (diff)
downloadffmpeg-77bc3e1944a912d712aa0d6d146b991a3686d618.tar.gz
lavf/avienc: Add xxpc entries to index
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
-rw-r--r--libavformat/avi.h6
-rw-r--r--libavformat/avienc.c31
-rw-r--r--tests/ref/lavf-fate/avi_cram4
3 files changed, 27 insertions, 14 deletions
diff --git a/libavformat/avi.h b/libavformat/avi.h
index 34da76f715..af21f2c3c3 100644
--- a/libavformat/avi.h
+++ b/libavformat/avi.h
@@ -32,7 +32,11 @@
#define AVI_MASTER_INDEX_SIZE 256
#define AVI_MAX_STREAM_COUNT 100
+/* stream header flags */
+#define AVISF_VIDEO_PALCHANGES 0x00010000
+
/* index flags */
-#define AVIIF_INDEX 0x10
+#define AVIIF_INDEX 0x00000010
+#define AVIIF_NO_TIME 0x00000100
#endif /* AVFORMAT_AVI_H */
diff --git a/libavformat/avienc.c b/libavformat/avienc.c
index 1090f14d98..dceb2efcec 100644
--- a/libavformat/avienc.c
+++ b/libavformat/avienc.c
@@ -52,8 +52,6 @@ typedef struct AVIIentry {
#define AVI_INDEX_CLUSTER_SIZE 16384
-#define AVISF_VIDEO_PALCHANGES 0x00010000
-
typedef struct AVIIndex {
int64_t indx_start;
int64_t audio_strm_offset;
@@ -652,9 +650,13 @@ static int avi_write_idx1(AVFormatContext *s)
}
if (!empty) {
avist = s->streams[stream_id]->priv_data;
- avi_stream2fourcc(tag, stream_id,
+ if (*ie->tag)
+ ffio_wfourcc(pb, ie->tag);
+ else {
+ avi_stream2fourcc(tag, stream_id,
s->streams[stream_id]->codec->codec_type);
- ffio_wfourcc(pb, tag);
+ ffio_wfourcc(pb, tag);
+ }
avio_wl32(pb, ie->flags);
avio_wl32(pb, ie->pos);
avio_wl32(pb, ie->len);
@@ -749,6 +751,20 @@ static int avi_write_packet(AVFormatContext *s, AVPacket *pkt)
unsigned char tag[5];
avi_stream2fourcc(tag, stream_index, enc->codec_type);
tag[2] = 'p'; tag[3] = 'c';
+ if (s->pb->seekable) {
+ int ret;
+ if (avist->strh_flags_offset) {
+ int64_t cur_offset = avio_tell(pb);
+ avio_seek(pb, avist->strh_flags_offset, SEEK_SET);
+ avio_wl32(pb, AVISF_VIDEO_PALCHANGES);
+ avio_seek(pb, cur_offset, SEEK_SET);
+ avist->strh_flags_offset = 0;
+ }
+ ret = avi_add_ientry(s, stream_index, tag, AVIIF_NO_TIME,
+ pal_size * 4 + 4);
+ if (ret < 0)
+ return ret;
+ }
pc_tag = ff_start_tag(pb, tag);
avio_w8(pb, 0);
avio_w8(pb, pal_size & 0xFF);
@@ -759,13 +775,6 @@ static int avi_write_packet(AVFormatContext *s, AVPacket *pkt)
}
ff_end_tag(pb, pc_tag);
memcpy(avist->old_palette, avist->palette, pal_size * 4);
- if (pb->seekable && avist->strh_flags_offset) {
- int64_t cur_offset = avio_tell(pb);
- avio_seek(pb, avist->strh_flags_offset, SEEK_SET);
- avio_wl32(pb, AVISF_VIDEO_PALCHANGES);
- avio_seek(pb, cur_offset, SEEK_SET);
- avist->strh_flags_offset = 0;
- }
}
}
}
diff --git a/tests/ref/lavf-fate/avi_cram b/tests/ref/lavf-fate/avi_cram
index 7b4e69cddf..82882fbb22 100644
--- a/tests/ref/lavf-fate/avi_cram
+++ b/tests/ref/lavf-fate/avi_cram
@@ -1,3 +1,3 @@
-ba77c5c8bd2b0d1e0478d143346cc3b3 *./tests/data/lavf-fate/lavf.avi
-928228 ./tests/data/lavf-fate/lavf.avi
+6fc88702c23b895c305c5e1f51a0904e *./tests/data/lavf-fate/lavf.avi
+928260 ./tests/data/lavf-fate/lavf.avi
./tests/data/lavf-fate/lavf.avi CRC=0xa4770de2