mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-06-28 20:14:02 +08:00
resync ffm if error in stream
Originally committed as revision 18065 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
@ -87,13 +87,26 @@ static int ffm_is_avail_data(AVFormatContext *s, int size)
|
|||||||
return AVERROR(EAGAIN);
|
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 */
|
/* first is true if we read the frame header */
|
||||||
static int ffm_read_data(AVFormatContext *s,
|
static int ffm_read_data(AVFormatContext *s,
|
||||||
uint8_t *buf, int size, int header)
|
uint8_t *buf, int size, int header)
|
||||||
{
|
{
|
||||||
FFMContext *ffm = s->priv_data;
|
FFMContext *ffm = s->priv_data;
|
||||||
ByteIOContext *pb = s->pb;
|
ByteIOContext *pb = s->pb;
|
||||||
int len, fill_size, size1, frame_offset;
|
int len, fill_size, size1, frame_offset, id;
|
||||||
|
|
||||||
size1 = size;
|
size1 = size;
|
||||||
while (size > 0) {
|
while (size > 0) {
|
||||||
@ -107,7 +120,10 @@ static int ffm_read_data(AVFormatContext *s,
|
|||||||
if (url_ftell(pb) == ffm->file_size)
|
if (url_ftell(pb) == ffm->file_size)
|
||||||
url_fseek(pb, ffm->packet_size, SEEK_SET);
|
url_fseek(pb, ffm->packet_size, SEEK_SET);
|
||||||
retry_read:
|
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);
|
fill_size = get_be16(pb);
|
||||||
ffm->dts = get_be64(pb);
|
ffm->dts = get_be64(pb);
|
||||||
frame_offset = get_be16(pb);
|
frame_offset = get_be16(pb);
|
||||||
|
Reference in New Issue
Block a user