diff options
author | Reimar Döffinger <Reimar.Doeffinger@gmx.de> | 2009-02-22 09:42:56 +0000 |
---|---|---|
committer | Reimar Döffinger <Reimar.Doeffinger@gmx.de> | 2009-02-22 09:42:56 +0000 |
commit | 67d44b84c1fd2c7e1f873741dcd6d68a3b123b3e (patch) | |
tree | 82c7d4629987edeea41f42de5bc03e02e5a5558f | |
parent | e51b7a41ee8e88e26a6873df7ccb1ef475467c14 (diff) | |
download | ffmpeg-67d44b84c1fd2c7e1f873741dcd6d68a3b123b3e.tar.gz |
Support playback of incorrectly cut DV files where the headers do not
start at the first byte.
Originally committed as revision 17519 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r-- | libavformat/dv.c | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/libavformat/dv.c b/libavformat/dv.c index fa529f68d2..7b4cb0b093 100644 --- a/libavformat/dv.c +++ b/libavformat/dv.c @@ -31,6 +31,7 @@ #include <time.h> #include "avformat.h" #include "libavcodec/dvdata.h" +#include "libavutil/intreadwrite.h" #include "dv.h" struct DVDemuxContext { @@ -399,13 +400,24 @@ typedef struct RawDVContext { static int dv_read_header(AVFormatContext *s, AVFormatParameters *ap) { + unsigned state; RawDVContext *c = s->priv_data; c->dv_demux = dv_init_demux(s); if (!c->dv_demux) return -1; - if (get_buffer(s->pb, c->buf, DV_PROFILE_BYTES) <= 0 || + state = get_be32(s->pb); + while ((state & 0xffffff7f) != 0x1f07003f) { + if (url_feof(s->pb)) { + av_log(s, AV_LOG_ERROR, "Cannot find DV header.\n"); + return -1; + } + state = (state << 8) | get_byte(s->pb); + } + AV_WB32(c->buf, state); + + if (get_buffer(s->pb, c->buf + 4, DV_PROFILE_BYTES - 4) <= 0 || url_fseek(s->pb, -DV_PROFILE_BYTES, SEEK_CUR) < 0) return AVERROR(EIO); |