You've already forked FFmpeg
							
							
				mirror of
				https://github.com/FFmpeg/FFmpeg.git
				synced 2025-10-30 23:18:11 +02:00 
			
		
		
		
	do not write ffm write index by default, detect if file is being written and return EOF
Originally committed as revision 18063 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
		
							
								
								
									
										2
									
								
								ffmpeg.c
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								ffmpeg.c
									
									
									
									
									
								
							| @@ -2121,7 +2121,7 @@ static int av_encode(AVFormatContext **output_files, | ||||
|         /* read a frame from it and output it in the fifo */ | ||||
|         is = input_files[file_index]; | ||||
|         ret= av_read_frame(is, &pkt); | ||||
|         if(ret == AVERROR(EAGAIN) && strcmp(is->iformat->name, "ffm")){ | ||||
|         if(ret == AVERROR(EAGAIN)){ | ||||
|             no_packet[file_index]=1; | ||||
|             no_packet_count++; | ||||
|             continue; | ||||
|   | ||||
| @@ -66,19 +66,25 @@ static int ffm_is_avail_data(AVFormatContext *s, int size) | ||||
|     if (size <= len) | ||||
|         return 1; | ||||
|     pos = url_ftell(s->pb); | ||||
|     if (!ffm->write_index) { | ||||
|         if (pos == ffm->file_size); | ||||
|             return AVERROR_EOF; | ||||
|         avail_size = ffm->file_size - pos; | ||||
|     } else { | ||||
|     if (pos == ffm->write_index) { | ||||
|         /* exactly at the end of stream */ | ||||
|         return 0; | ||||
|         return AVERROR(EAGAIN); | ||||
|     } else if (pos < ffm->write_index) { | ||||
|         avail_size = ffm->write_index - pos; | ||||
|     } else { | ||||
|         avail_size = (ffm->file_size - pos) + (ffm->write_index - FFM_PACKET_SIZE); | ||||
|     } | ||||
|     } | ||||
|     avail_size = (avail_size / ffm->packet_size) * (ffm->packet_size - FFM_HEADER_SIZE) + len; | ||||
|     if (size <= avail_size) | ||||
|         return 1; | ||||
|     else | ||||
|         return 0; | ||||
|         return AVERROR(EAGAIN); | ||||
| } | ||||
|  | ||||
| /* first is true if we read the frame header */ | ||||
| @@ -251,7 +257,8 @@ static int ffm_read_header(AVFormatContext *s, AVFormatParameters *ap) | ||||
|     /* get also filesize */ | ||||
|     if (!url_is_streamed(pb)) { | ||||
|         ffm->file_size = url_fsize(pb); | ||||
|         adjust_write_index(s); | ||||
|         if (ffm->write_index) | ||||
|             adjust_write_index(s); | ||||
|     } else { | ||||
|         ffm->file_size = (UINT64_C(1) << 63) - 1; | ||||
|     } | ||||
| @@ -360,24 +367,21 @@ static int ffm_read_packet(AVFormatContext *s, AVPacket *pkt) | ||||
| { | ||||
|     int size; | ||||
|     FFMContext *ffm = s->priv_data; | ||||
|     int duration; | ||||
|  | ||||
|     if (url_fsize(s->pb) == FFM_PACKET_SIZE) | ||||
|         return -1; | ||||
|     int duration, ret; | ||||
|  | ||||
|     switch(ffm->read_state) { | ||||
|     case READ_HEADER: | ||||
|         if (!ffm_is_avail_data(s, FRAME_HEADER_SIZE+4)) { | ||||
|             return AVERROR(EAGAIN); | ||||
|         } | ||||
|         if ((ret = ffm_is_avail_data(s, FRAME_HEADER_SIZE+4)) < 0) | ||||
|             return ret; | ||||
|  | ||||
|         dprintf(s, "pos=%08"PRIx64" spos=%"PRIx64", write_index=%"PRIx64" size=%"PRIx64"\n", | ||||
|                url_ftell(s->pb), s->pb->pos, ffm->write_index, ffm->file_size); | ||||
|         if (ffm_read_data(s, ffm->header, FRAME_HEADER_SIZE, 1) != | ||||
|             FRAME_HEADER_SIZE) | ||||
|             return AVERROR(EAGAIN); | ||||
|             return -1; | ||||
|         if (ffm->header[1] & FLAG_DTS) | ||||
|             if (ffm_read_data(s, ffm->header+16, 4, 1) != 4) | ||||
|                 return AVERROR(EAGAIN); | ||||
|                 return -1; | ||||
| #if 0 | ||||
|         av_hexdump_log(s, AV_LOG_DEBUG, ffm->header, FRAME_HEADER_SIZE); | ||||
| #endif | ||||
| @@ -385,9 +389,8 @@ static int ffm_read_packet(AVFormatContext *s, AVPacket *pkt) | ||||
|         /* fall thru */ | ||||
|     case READ_DATA: | ||||
|         size = AV_RB24(ffm->header + 2); | ||||
|         if (!ffm_is_avail_data(s, size)) { | ||||
|             return AVERROR(EAGAIN); | ||||
|         } | ||||
|         if ((ret = ffm_is_avail_data(s, size)) < 0) | ||||
|             return ret; | ||||
|  | ||||
|         duration = AV_RB24(ffm->header + 5); | ||||
|  | ||||
| @@ -397,7 +400,7 @@ static int ffm_read_packet(AVFormatContext *s, AVPacket *pkt) | ||||
|             av_log(s, AV_LOG_ERROR, "invalid stream index %d\n", pkt->stream_index); | ||||
|             av_free_packet(pkt); | ||||
|             ffm->read_state = READ_HEADER; | ||||
|             return AVERROR(EAGAIN); | ||||
|             return -1; | ||||
|         } | ||||
|         pkt->pos = url_ftell(s->pb); | ||||
|         if (ffm->header[1] & FLAG_KEY_FRAME) | ||||
| @@ -407,7 +410,7 @@ static int ffm_read_packet(AVFormatContext *s, AVPacket *pkt) | ||||
|         if (ffm_read_data(s, pkt->data, size, 0) != size) { | ||||
|             /* bad case: desynchronized packet. we cancel all the packet loading */ | ||||
|             av_free_packet(pkt); | ||||
|             return AVERROR(EAGAIN); | ||||
|             return -1; | ||||
|         } | ||||
|         pkt->pts = AV_RB64(ffm->header+8); | ||||
|         if (ffm->header[1] & FLAG_DTS) | ||||
|   | ||||
| @@ -93,8 +93,7 @@ static int ffm_write_header(AVFormatContext *s) | ||||
|     /* header */ | ||||
|     put_le32(pb, MKTAG('F', 'F', 'M', '1')); | ||||
|     put_be32(pb, ffm->packet_size); | ||||
|     /* XXX: store write position in other file ? */ | ||||
|     put_be64(pb, ffm->packet_size); /* current write position */ | ||||
|     put_be64(pb, 0); /* current write position */ | ||||
|  | ||||
|     put_be32(pb, s->nb_streams); | ||||
|     bit_rate = 0; | ||||
| @@ -224,15 +223,6 @@ static int ffm_write_trailer(AVFormatContext *s) | ||||
|  | ||||
|     put_flush_packet(pb); | ||||
|  | ||||
|     if (!url_is_streamed(pb)) { | ||||
|         int64_t size; | ||||
|         /* update the write offset */ | ||||
|         size = url_ftell(pb); | ||||
|         url_fseek(pb, 8, SEEK_SET); | ||||
|         put_be64(pb, size); | ||||
|         put_flush_packet(pb); | ||||
|     } | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -21,9 +21,9 @@ c0cc2ae4df6a8b3df84986929a393116 *./tests/data/b-libav.ts | ||||
| 1b28a16652bb8ac528b33f7478ca18b6 *./tests/data/b-libav.swf | ||||
| 335771 ./tests/data/b-libav.swf | ||||
| ./tests/data/b-libav.swf CRC=0xe14e8847 | ||||
| 3dbacdc3fccb551f8ab54c32f648e7a8 *./tests/data/b-libav.ffm | ||||
| 49d04c063b7741d3ee8f85c92baa69bf *./tests/data/b-libav.ffm | ||||
| 380928 ./tests/data/b-libav.ffm | ||||
| ./tests/data/b-libav.ffm CRC=0x2b71a386 | ||||
| ./tests/data/b-libav.ffm CRC=0x00000001 | ||||
| 8617c30b4e862199555fd75890473e66 *./tests/data/b-libav.flv | ||||
| 335833 ./tests/data/b-libav.flv | ||||
| ./tests/data/b-libav.flv CRC=0xe14e8847 | ||||
|   | ||||
		Reference in New Issue
	
	Block a user