diff options
author | Mats Peterson <matsp888@yahoo.com> | 2016-03-12 16:18:36 +0100 |
---|---|---|
committer | Michael Niedermayer <michael@niedermayer.cc> | 2016-03-13 16:06:09 +0100 |
commit | 77bc3e1944a912d712aa0d6d146b991a3686d618 (patch) | |
tree | eaf1eed11208cbcb31bce4e5ff61393d83dc45ba | |
parent | 9ee5b4096476d369157accc491b0f69a28cb9b6b (diff) | |
download | ffmpeg-77bc3e1944a912d712aa0d6d146b991a3686d618.tar.gz |
lavf/avienc: Add xxpc entries to index
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
-rw-r--r-- | libavformat/avi.h | 6 | ||||
-rw-r--r-- | libavformat/avienc.c | 31 | ||||
-rw-r--r-- | tests/ref/lavf-fate/avi_cram | 4 |
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 |