aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorReimar Döffinger <Reimar.Doeffinger@gmx.de>2009-02-22 09:42:56 +0000
committerReimar Döffinger <Reimar.Doeffinger@gmx.de>2009-02-22 09:42:56 +0000
commit67d44b84c1fd2c7e1f873741dcd6d68a3b123b3e (patch)
tree82c7d4629987edeea41f42de5bc03e02e5a5558f
parente51b7a41ee8e88e26a6873df7ccb1ef475467c14 (diff)
downloadffmpeg-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.c14
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);