Commit ecc7d7a4 authored by michael's avatar michael

extract duration if available


git-svn-id: file:///var/local/repositories/ffmpeg/trunk@4459 9553f0bf-9b14-0410-a0b8-cfaf0461ba5b
parent 7bad5900
...@@ -58,7 +58,7 @@ static int flv_read_header(AVFormatContext *s, ...@@ -58,7 +58,7 @@ static int flv_read_header(AVFormatContext *s,
static int flv_read_packet(AVFormatContext *s, AVPacket *pkt) 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; AVStream *st = NULL;
for(;;){ for(;;){
...@@ -74,19 +74,59 @@ static int flv_read_packet(AVFormatContext *s, AVPacket *pkt) ...@@ -74,19 +74,59 @@ static int flv_read_packet(AVFormatContext *s, AVPacket *pkt)
if(size == 0) if(size == 0)
continue; continue;
next= size + url_ftell(&s->pb);
if (type == 8) { if (type == 8) {
is_audio=1; is_audio=1;
flags = get_byte(&s->pb); flags = get_byte(&s->pb);
size--;
} else if (type == 9) { } else if (type == 9) {
is_audio=0; is_audio=0;
flags = get_byte(&s->pb); 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 { } else {
/* skip packet */ /* skip packet */
av_log(s, AV_LOG_ERROR, "skipping flv packet: type %d, size %d, flags %d\n", type, size, flags); 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; continue;
} }
...@@ -109,7 +149,7 @@ static int flv_read_packet(AVFormatContext *s, AVPacket *pkt) ...@@ -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_BIDIR && ((flags >> 4)==3 && !is_audio))
|| st->discard >= AVDISCARD_ALL || st->discard >= AVDISCARD_ALL
){ ){
url_fskip(&s->pb, size); url_fseek(&s->pb, next, SEEK_SET);
continue; continue;
} }
break; break;
...@@ -147,7 +187,7 @@ static int flv_read_packet(AVFormatContext *s, AVPacket *pkt) ...@@ -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) { if (ret <= 0) {
return AVERROR_IO; return AVERROR_IO;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment