mirror of https://git.ffmpeg.org/ffmpeg.git
resync ffm if error in stream
Originally committed as revision 18065 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
parent
21c6438f2c
commit
7c45723a98
|
@ -87,13 +87,26 @@ static int ffm_is_avail_data(AVFormatContext *s, int size)
|
|||
return AVERROR(EAGAIN);
|
||||
}
|
||||
|
||||
static int ffm_resync(AVFormatContext *s, int state)
|
||||
{
|
||||
av_log(s, AV_LOG_ERROR, "resyncing\n");
|
||||
while (state != PACKET_ID) {
|
||||
if (url_feof(s->pb)) {
|
||||
av_log(s, AV_LOG_ERROR, "cannot find FFM syncword\n");
|
||||
return -1;
|
||||
}
|
||||
state = (state << 8) | get_byte(s->pb);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* first is true if we read the frame header */
|
||||
static int ffm_read_data(AVFormatContext *s,
|
||||
uint8_t *buf, int size, int header)
|
||||
{
|
||||
FFMContext *ffm = s->priv_data;
|
||||
ByteIOContext *pb = s->pb;
|
||||
int len, fill_size, size1, frame_offset;
|
||||
int len, fill_size, size1, frame_offset, id;
|
||||
|
||||
size1 = size;
|
||||
while (size > 0) {
|
||||
|
@ -107,7 +120,10 @@ static int ffm_read_data(AVFormatContext *s,
|
|||
if (url_ftell(pb) == ffm->file_size)
|
||||
url_fseek(pb, ffm->packet_size, SEEK_SET);
|
||||
retry_read:
|
||||
get_be16(pb); /* PACKET_ID */
|
||||
id = get_be16(pb); /* PACKET_ID */
|
||||
if (id != PACKET_ID)
|
||||
if (ffm_resync(s, id) < 0)
|
||||
return -1;
|
||||
fill_size = get_be16(pb);
|
||||
ffm->dts = get_be64(pb);
|
||||
frame_offset = get_be16(pb);
|
||||
|
|
Loading…
Reference in New Issue