Commit 77bc3e19 authored by Mats Peterson's avatar Mats Peterson Committed by Michael Niedermayer

lavf/avienc: Add xxpc entries to index

Signed-off-by: 's avatarMichael Niedermayer <michael@niedermayer.cc>
parent 9ee5b409
...@@ -32,7 +32,11 @@ ...@@ -32,7 +32,11 @@
#define AVI_MASTER_INDEX_SIZE 256 #define AVI_MASTER_INDEX_SIZE 256
#define AVI_MAX_STREAM_COUNT 100 #define AVI_MAX_STREAM_COUNT 100
/* stream header flags */
#define AVISF_VIDEO_PALCHANGES 0x00010000
/* index flags */ /* index flags */
#define AVIIF_INDEX 0x10 #define AVIIF_INDEX 0x00000010
#define AVIIF_NO_TIME 0x00000100
#endif /* AVFORMAT_AVI_H */ #endif /* AVFORMAT_AVI_H */
...@@ -52,8 +52,6 @@ typedef struct AVIIentry { ...@@ -52,8 +52,6 @@ typedef struct AVIIentry {
#define AVI_INDEX_CLUSTER_SIZE 16384 #define AVI_INDEX_CLUSTER_SIZE 16384
#define AVISF_VIDEO_PALCHANGES 0x00010000
typedef struct AVIIndex { typedef struct AVIIndex {
int64_t indx_start; int64_t indx_start;
int64_t audio_strm_offset; int64_t audio_strm_offset;
...@@ -652,9 +650,13 @@ static int avi_write_idx1(AVFormatContext *s) ...@@ -652,9 +650,13 @@ static int avi_write_idx1(AVFormatContext *s)
} }
if (!empty) { if (!empty) {
avist = s->streams[stream_id]->priv_data; 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); s->streams[stream_id]->codec->codec_type);
ffio_wfourcc(pb, tag); ffio_wfourcc(pb, tag);
}
avio_wl32(pb, ie->flags); avio_wl32(pb, ie->flags);
avio_wl32(pb, ie->pos); avio_wl32(pb, ie->pos);
avio_wl32(pb, ie->len); avio_wl32(pb, ie->len);
...@@ -749,6 +751,20 @@ static int avi_write_packet(AVFormatContext *s, AVPacket *pkt) ...@@ -749,6 +751,20 @@ static int avi_write_packet(AVFormatContext *s, AVPacket *pkt)
unsigned char tag[5]; unsigned char tag[5];
avi_stream2fourcc(tag, stream_index, enc->codec_type); avi_stream2fourcc(tag, stream_index, enc->codec_type);
tag[2] = 'p'; tag[3] = 'c'; 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); pc_tag = ff_start_tag(pb, tag);
avio_w8(pb, 0); avio_w8(pb, 0);
avio_w8(pb, pal_size & 0xFF); avio_w8(pb, pal_size & 0xFF);
...@@ -759,13 +775,6 @@ static int avi_write_packet(AVFormatContext *s, AVPacket *pkt) ...@@ -759,13 +775,6 @@ static int avi_write_packet(AVFormatContext *s, AVPacket *pkt)
} }
ff_end_tag(pb, pc_tag); ff_end_tag(pb, pc_tag);
memcpy(avist->old_palette, avist->palette, pal_size * 4); 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;
}
} }
} }
} }
......
ba77c5c8bd2b0d1e0478d143346cc3b3 *./tests/data/lavf-fate/lavf.avi 6fc88702c23b895c305c5e1f51a0904e *./tests/data/lavf-fate/lavf.avi
928228 ./tests/data/lavf-fate/lavf.avi 928260 ./tests/data/lavf-fate/lavf.avi
./tests/data/lavf-fate/lavf.avi CRC=0xa4770de2 ./tests/data/lavf-fate/lavf.avi CRC=0xa4770de2
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment