fix pts handling in ffm
Originally committed as revision 13683 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
		
							parent
							
								
									c07d64c890
								
							
						
					
					
						commit
						2940b38ef2
					
				| @ -32,10 +32,6 @@ | |||||||
| #define FRAME_HEADER_SIZE    8 | #define FRAME_HEADER_SIZE    8 | ||||||
| #define FLAG_KEY_FRAME       0x01 | #define FLAG_KEY_FRAME       0x01 | ||||||
| 
 | 
 | ||||||
| typedef struct FFMStream { |  | ||||||
|     int64_t pts; |  | ||||||
| } FFMStream; |  | ||||||
| 
 |  | ||||||
| enum { | enum { | ||||||
|     READ_HEADER, |     READ_HEADER, | ||||||
|     READ_DATA, |     READ_DATA, | ||||||
| @ -55,6 +51,7 @@ typedef struct FFMContext { | |||||||
|     int64_t pts; |     int64_t pts; | ||||||
|     uint8_t *packet_ptr, *packet_end; |     uint8_t *packet_ptr, *packet_end; | ||||||
|     uint8_t packet[FFM_PACKET_SIZE]; |     uint8_t packet[FFM_PACKET_SIZE]; | ||||||
|  |     int64_t start_time; | ||||||
| } FFMContext; | } FFMContext; | ||||||
| 
 | 
 | ||||||
| #endif /* FFMPEG_FFM_H */ | #endif /* FFMPEG_FFM_H */ | ||||||
|  | |||||||
| @ -232,7 +232,6 @@ static int ffm_read_header(AVFormatContext *s, AVFormatParameters *ap) | |||||||
| { | { | ||||||
|     FFMContext *ffm = s->priv_data; |     FFMContext *ffm = s->priv_data; | ||||||
|     AVStream *st; |     AVStream *st; | ||||||
|     FFMStream *fst; |  | ||||||
|     ByteIOContext *pb = s->pb; |     ByteIOContext *pb = s->pb; | ||||||
|     AVCodecContext *codec; |     AVCodecContext *codec; | ||||||
|     int i, nb_streams; |     int i, nb_streams; | ||||||
| @ -263,15 +262,10 @@ static int ffm_read_header(AVFormatContext *s, AVFormatParameters *ap) | |||||||
|         st = av_new_stream(s, 0); |         st = av_new_stream(s, 0); | ||||||
|         if (!st) |         if (!st) | ||||||
|             goto fail; |             goto fail; | ||||||
|         fst = av_mallocz(sizeof(FFMStream)); |  | ||||||
|         if (!fst) |  | ||||||
|             goto fail; |  | ||||||
|         s->streams[i] = st; |         s->streams[i] = st; | ||||||
| 
 | 
 | ||||||
|         av_set_pts_info(st, 64, 1, 1000000); |         av_set_pts_info(st, 64, 1, 1000000); | ||||||
| 
 | 
 | ||||||
|         st->priv_data = fst; |  | ||||||
| 
 |  | ||||||
|         codec = st->codec; |         codec = st->codec; | ||||||
|         /* generic info */ |         /* generic info */ | ||||||
|         codec->codec_id = get_be32(pb); |         codec->codec_id = get_be32(pb); | ||||||
|  | |||||||
| @ -92,7 +92,6 @@ static int ffm_write_header(AVFormatContext *s) | |||||||
| { | { | ||||||
|     FFMContext *ffm = s->priv_data; |     FFMContext *ffm = s->priv_data; | ||||||
|     AVStream *st; |     AVStream *st; | ||||||
|     FFMStream *fst; |  | ||||||
|     ByteIOContext *pb = s->pb; |     ByteIOContext *pb = s->pb; | ||||||
|     AVCodecContext *codec; |     AVCodecContext *codec; | ||||||
|     int bit_rate, i; |     int bit_rate, i; | ||||||
| @ -116,11 +115,7 @@ static int ffm_write_header(AVFormatContext *s) | |||||||
|     /* list of streams */ |     /* list of streams */ | ||||||
|     for(i=0;i<s->nb_streams;i++) { |     for(i=0;i<s->nb_streams;i++) { | ||||||
|         st = s->streams[i]; |         st = s->streams[i]; | ||||||
|         fst = av_mallocz(sizeof(FFMStream)); |  | ||||||
|         if (!fst) |  | ||||||
|             goto fail; |  | ||||||
|         av_set_pts_info(st, 64, 1, 1000000); |         av_set_pts_info(st, 64, 1, 1000000); | ||||||
|         st->priv_data = fst; |  | ||||||
| 
 | 
 | ||||||
|         codec = st->codec; |         codec = st->codec; | ||||||
|         /* generic info */ |         /* generic info */ | ||||||
| @ -176,13 +171,14 @@ static int ffm_write_header(AVFormatContext *s) | |||||||
|         default: |         default: | ||||||
|             return -1; |             return -1; | ||||||
|         } |         } | ||||||
|         /* hack to have real time */ |  | ||||||
|         if (ffm_nopts) |  | ||||||
|             fst->pts = 0; |  | ||||||
|         else |  | ||||||
|             fst->pts = av_gettime(); |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     /* hack to have real time */ | ||||||
|  |     if (ffm_nopts) | ||||||
|  |         ffm->start_time = 0; | ||||||
|  |     else | ||||||
|  |         ffm->start_time = av_gettime(); | ||||||
|  | 
 | ||||||
|     /* flush until end of block reached */ |     /* flush until end of block reached */ | ||||||
|     while ((url_ftell(pb) % ffm->packet_size) != 0) |     while ((url_ftell(pb) % ffm->packet_size) != 0) | ||||||
|         put_byte(pb, 0); |         put_byte(pb, 0); | ||||||
| @ -198,22 +194,16 @@ static int ffm_write_header(AVFormatContext *s) | |||||||
|     ffm->first_packet = 1; |     ffm->first_packet = 1; | ||||||
| 
 | 
 | ||||||
|     return 0; |     return 0; | ||||||
|  fail: |  | ||||||
|     for(i=0;i<s->nb_streams;i++) { |  | ||||||
|         st = s->streams[i]; |  | ||||||
|         av_freep(&st->priv_data); |  | ||||||
|     } |  | ||||||
|     return -1; |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static int ffm_write_packet(AVFormatContext *s, AVPacket *pkt) | static int ffm_write_packet(AVFormatContext *s, AVPacket *pkt) | ||||||
| { | { | ||||||
|  |     FFMContext *ffm = s->priv_data; | ||||||
|     AVStream *st = s->streams[pkt->stream_index]; |     AVStream *st = s->streams[pkt->stream_index]; | ||||||
|     FFMStream *fst = st->priv_data; |  | ||||||
|     int64_t pts; |     int64_t pts; | ||||||
|     uint8_t header[FRAME_HEADER_SIZE]; |     uint8_t header[FRAME_HEADER_SIZE]; | ||||||
| 
 | 
 | ||||||
|     pts = fst->pts; |     pts = ffm->start_time + pkt->pts; | ||||||
|     /* packet size & key_frame */ |     /* packet size & key_frame */ | ||||||
|     header[0] = pkt->stream_index; |     header[0] = pkt->stream_index; | ||||||
|     header[1] = 0; |     header[1] = 0; | ||||||
| @ -224,7 +214,6 @@ static int ffm_write_packet(AVFormatContext *s, AVPacket *pkt) | |||||||
|     ffm_write_data(s, header, FRAME_HEADER_SIZE, pts, 1); |     ffm_write_data(s, header, FRAME_HEADER_SIZE, pts, 1); | ||||||
|     ffm_write_data(s, pkt->data, pkt->size, pts, 0); |     ffm_write_data(s, pkt->data, pkt->size, pts, 0); | ||||||
| 
 | 
 | ||||||
|     fst->pts += pkt->duration; |  | ||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -15,7 +15,7 @@ bdb7484c68db722f66ba1630cf79844c *./tests/data/b-libav.mpg | |||||||
| d6fdeb9f7083cc827f9510c6c4517dc0 *./tests/data/b-libav.swf | d6fdeb9f7083cc827f9510c6c4517dc0 *./tests/data/b-libav.swf | ||||||
| 335771 ./tests/data/b-libav.swf | 335771 ./tests/data/b-libav.swf | ||||||
| ./tests/data/b-libav.swf CRC=0xe14e8847 | ./tests/data/b-libav.swf CRC=0xe14e8847 | ||||||
| 745e811e246f3727dc80a7504a18b129 *./tests/data/b-libav.ffm | bf28235fdc3bdd77faf251a239b6bc58 *./tests/data/b-libav.ffm | ||||||
| 380928 ./tests/data/b-libav.ffm | 380928 ./tests/data/b-libav.ffm | ||||||
| ./tests/data/b-libav.ffm CRC=0xca8f6870 | ./tests/data/b-libav.ffm CRC=0xca8f6870 | ||||||
| f8ad5bd78f4d012a8ce9570aa395ac54 *./tests/data/b-libav.flv | f8ad5bd78f4d012a8ce9570aa395ac54 *./tests/data/b-libav.flv | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user