You've already forked FFmpeg
							
							
				mirror of
				https://github.com/FFmpeg/FFmpeg.git
				synced 2025-10-30 23:18:11 +02:00 
			
		
		
		
	lavf/avienc: Add xxpc entries to index
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
This commit is contained in:
		
				
					committed by
					
						 Michael Niedermayer
						Michael Niedermayer
					
				
			
			
				
	
			
			
			
						parent
						
							9ee5b40964
						
					
				
				
					commit
					77bc3e1944
				
			| @@ -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 { | |||||||
|  |  | ||||||
| #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) | |||||||
|             } |             } | ||||||
|             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) | |||||||
|                     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) | |||||||
|                     } |                     } | ||||||
|                     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; |  | ||||||
|                     } |  | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|   | |||||||
| @@ -1,3 +1,3 @@ | |||||||
| 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 | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user