comparison flvdec.c @ 1563:bf3589ba8d7e libavformat

move duration finding code into read_packet() so it can be skiped if duration has already been set
author michael
date Sun, 10 Dec 2006 17:53:01 +0000
parents 61df6b5d52d3
children 04aa1ab71309
comparison
equal deleted inserted replaced
1562:61df6b5d52d3 1563:bf3589ba8d7e
55 } 55 }
56 56
57 static int flv_read_header(AVFormatContext *s, 57 static int flv_read_header(AVFormatContext *s,
58 AVFormatParameters *ap) 58 AVFormatParameters *ap)
59 { 59 {
60 int offset, flags, size; 60 int offset, flags;
61 AVStream *st; 61 AVStream *st;
62 62
63 url_fskip(&s->pb, 4); 63 url_fskip(&s->pb, 4);
64 flags = get_byte(&s->pb); 64 flags = get_byte(&s->pb);
65 65
77 st->codec->codec_type = CODEC_TYPE_AUDIO; 77 st->codec->codec_type = CODEC_TYPE_AUDIO;
78 av_set_pts_info(st, 24, 1, 1000); /* 24 bit pts in ms */ 78 av_set_pts_info(st, 24, 1, 1000); /* 24 bit pts in ms */
79 } 79 }
80 80
81 offset = get_be32(&s->pb); 81 offset = get_be32(&s->pb);
82
83 if(!url_is_streamed(&s->pb)){
84 const int fsize= url_fsize(&s->pb);
85 url_fseek(&s->pb, fsize-4, SEEK_SET);
86 size= get_be32(&s->pb);
87 url_fseek(&s->pb, fsize-3-size, SEEK_SET);
88 if(size == get_be24(&s->pb) + 11){
89 s->duration= get_be24(&s->pb) * (int64_t)AV_TIME_BASE / 1000;
90 }
91 }
92
93 url_fseek(&s->pb, offset, SEEK_SET); 82 url_fseek(&s->pb, offset, SEEK_SET);
94 83
95 s->start_time = 0; 84 s->start_time = 0;
96 85
97 return 0; 86 return 0;
187 } 176 }
188 if ((flags & FLV_VIDEO_FRAMETYPE_MASK) == FLV_FRAME_KEY) 177 if ((flags & FLV_VIDEO_FRAMETYPE_MASK) == FLV_FRAME_KEY)
189 av_add_index_entry(st, pos, pts, size, 0, AVINDEX_KEYFRAME); 178 av_add_index_entry(st, pos, pts, size, 0, AVINDEX_KEYFRAME);
190 break; 179 break;
191 } 180 }
181
182 // if not streamed and no duration from metadata then seek to end to find the duration from the timestamps
183 if(!url_is_streamed(&s->pb) && s->duration==AV_NOPTS_VALUE){
184 int size;
185 const int pos= url_ftell(&s->pb);
186 const int fsize= url_fsize(&s->pb);
187 url_fseek(&s->pb, fsize-4, SEEK_SET);
188 size= get_be32(&s->pb);
189 url_fseek(&s->pb, fsize-3-size, SEEK_SET);
190 if(size == get_be24(&s->pb) + 11){
191 s->duration= get_be24(&s->pb) * (int64_t)AV_TIME_BASE / 1000;
192 }
193 url_fseek(&s->pb, pos, SEEK_SET);
194 }
192 195
193 if(is_audio){ 196 if(is_audio){
194 if(st->codec->sample_rate == 0){ 197 if(st->codec->sample_rate == 0){
195 st->codec->channels = (flags & FLV_AUDIO_CHANNEL_MASK) == FLV_STEREO ? 2 : 1; 198 st->codec->channels = (flags & FLV_AUDIO_CHANNEL_MASK) == FLV_STEREO ? 2 : 1;
196 if((flags & FLV_AUDIO_CODECID_MASK) == FLV_CODECID_NELLYMOSER_8HZ_MONO) 199 if((flags & FLV_AUDIO_CODECID_MASK) == FLV_CODECID_NELLYMOSER_8HZ_MONO)