lavf/avienc: Add xxpc entries to index

Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
This commit is contained in:
Mats Peterson 2016-03-12 16:18:36 +01:00 committed by Michael Niedermayer
parent 9ee5b40964
commit 77bc3e1944
3 changed files with 27 additions and 14 deletions

View File

@ -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 */

View File

@ -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;
}
}
}
}

View File

@ -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