forked from FFmpeg/FFmpeg
extract duration if available
Originally committed as revision 4459 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
parent
2e8f2c20c9
commit
dd9f59160e
1 changed files with 47 additions and 7 deletions
|
@ -58,7 +58,7 @@ static int flv_read_header(AVFormatContext *s,
|
|||
|
||||
static int flv_read_packet(AVFormatContext *s, AVPacket *pkt)
|
||||
{
|
||||
int ret, i, type, size, pts, flags, is_audio;
|
||||
int ret, i, type, size, pts, flags, is_audio, next;
|
||||
AVStream *st = NULL;
|
||||
|
||||
for(;;){
|
||||
|
@ -74,19 +74,59 @@ static int flv_read_packet(AVFormatContext *s, AVPacket *pkt)
|
|||
|
||||
if(size == 0)
|
||||
continue;
|
||||
|
||||
|
||||
next= size + url_ftell(&s->pb);
|
||||
|
||||
if (type == 8) {
|
||||
is_audio=1;
|
||||
flags = get_byte(&s->pb);
|
||||
size--;
|
||||
} else if (type == 9) {
|
||||
is_audio=0;
|
||||
flags = get_byte(&s->pb);
|
||||
size--;
|
||||
} else if (type == 18 && size > 13+1+4) {
|
||||
url_fskip(&s->pb, 13); //onMetaData blah
|
||||
if(get_byte(&s->pb) == 8){
|
||||
url_fskip(&s->pb, 4);
|
||||
}
|
||||
while(url_ftell(&s->pb) + 5 < next){
|
||||
char tmp[128];
|
||||
int type, len;
|
||||
double d= 0;
|
||||
|
||||
len= get_be16(&s->pb);
|
||||
if(len >= sizeof(tmp) || !len)
|
||||
break;
|
||||
get_buffer(&s->pb, tmp, len);
|
||||
tmp[len]=0;
|
||||
|
||||
type= get_byte(&s->pb);
|
||||
if(type==0){
|
||||
d= av_int2dbl(get_be64(&s->pb));
|
||||
}else if(type==2){
|
||||
len= get_be16(&s->pb);
|
||||
if(len >= sizeof(tmp))
|
||||
break;
|
||||
url_fskip(&s->pb, len);
|
||||
}else if(type==8){
|
||||
//array
|
||||
break;
|
||||
}else if(type==11){
|
||||
d= av_int2dbl(get_be64(&s->pb));
|
||||
get_be16(&s->pb);
|
||||
}
|
||||
|
||||
if(!strcmp(tmp, "duration")){
|
||||
s->duration = d*AV_TIME_BASE;
|
||||
}else if(!strcmp(tmp, "videodatarate")){
|
||||
}else if(!strcmp(tmp, "audiodatarate")){
|
||||
}
|
||||
}
|
||||
url_fseek(&s->pb, next, SEEK_SET);
|
||||
continue;
|
||||
} else {
|
||||
/* skip packet */
|
||||
av_log(s, AV_LOG_ERROR, "skipping flv packet: type %d, size %d, flags %d\n", type, size, flags);
|
||||
url_fskip(&s->pb, size);
|
||||
url_fseek(&s->pb, next, SEEK_SET);
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -109,7 +149,7 @@ static int flv_read_packet(AVFormatContext *s, AVPacket *pkt)
|
|||
||(st->discard >= AVDISCARD_BIDIR && ((flags >> 4)==3 && !is_audio))
|
||||
|| st->discard >= AVDISCARD_ALL
|
||||
){
|
||||
url_fskip(&s->pb, size);
|
||||
url_fseek(&s->pb, next, SEEK_SET);
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
|
@ -147,7 +187,7 @@ static int flv_read_packet(AVFormatContext *s, AVPacket *pkt)
|
|||
}
|
||||
}
|
||||
|
||||
ret= av_get_packet(&s->pb, pkt, size);
|
||||
ret= av_get_packet(&s->pb, pkt, size - 1);
|
||||
if (ret <= 0) {
|
||||
return AVERROR_IO;
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue