Mercurial > libavformat.hg
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) |