mirror of https://git.ffmpeg.org/ffmpeg.git
avformat/flvdec: Detect broken sizes (OBS 0.655b), disable resync for affected files
Fixes Ticket4867 Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
This commit is contained in:
parent
0d097a869c
commit
e3cf978cdd
|
@ -58,6 +58,8 @@ typedef struct FLVContext {
|
||||||
int searched_for_end;
|
int searched_for_end;
|
||||||
|
|
||||||
uint8_t resync_buffer[2*RESYNC_BUFFER_SIZE];
|
uint8_t resync_buffer[2*RESYNC_BUFFER_SIZE];
|
||||||
|
|
||||||
|
int broken_sizes;
|
||||||
} FLVContext;
|
} FLVContext;
|
||||||
|
|
||||||
static int probe(AVProbeData *p, int live)
|
static int probe(AVProbeData *p, int live)
|
||||||
|
@ -516,6 +518,15 @@ static int amf_parse_object(AVFormatContext *s, AVStream *astream,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (amf_type == AMF_DATA_TYPE_STRING) {
|
||||||
|
if (!strcmp(key, "encoder")) {
|
||||||
|
int version = -1;
|
||||||
|
if (1 == sscanf(str_val, "Open Broadcaster Software v0.%d", &version)) {
|
||||||
|
if (version > 0 && version <= 655)
|
||||||
|
flv->broken_sizes = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (amf_type == AMF_DATA_TYPE_OBJECT && s->nb_streams == 1 &&
|
if (amf_type == AMF_DATA_TYPE_OBJECT && s->nb_streams == 1 &&
|
||||||
|
@ -1127,7 +1138,7 @@ retry_duration:
|
||||||
|
|
||||||
leave:
|
leave:
|
||||||
last = avio_rb32(s->pb);
|
last = avio_rb32(s->pb);
|
||||||
if (last != orig_size + 11) {
|
if (last != orig_size + 11 && !flv->broken_sizes) {
|
||||||
av_log(s, AV_LOG_ERROR, "Packet mismatch %d %d\n", last, orig_size + 11);
|
av_log(s, AV_LOG_ERROR, "Packet mismatch %d %d\n", last, orig_size + 11);
|
||||||
avio_seek(s->pb, pos + 1, SEEK_SET);
|
avio_seek(s->pb, pos + 1, SEEK_SET);
|
||||||
ret = resync(s);
|
ret = resync(s);
|
||||||
|
|
Loading…
Reference in New Issue