[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [20717] trunk/blender/extern/ffmpeg: == FFMPEG ==

Peter Schlaile peter at schlaile.de
Sun Jun 7 20:19:31 CEST 2009


Revision: 20717
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=20717
Author:   schlaile
Date:     2009-06-07 20:19:28 +0200 (Sun, 07 Jun 2009)

Log Message:
-----------
== FFMPEG ==

Work around crash in dv-reader of ffmpeg, that can happen, if some
frames don't contain audio. (Someone should do a real fix, but I
don't know ffmpeg internals good enough.)

Modified Paths:
--------------
    trunk/blender/extern/ffmpeg/libavformat/dv.c

Added Paths:
-----------
    trunk/blender/extern/ffmpeg/patches/ffmpeg_work_around_dv_crash.patch

Modified: trunk/blender/extern/ffmpeg/libavformat/dv.c
===================================================================
--- trunk/blender/extern/ffmpeg/libavformat/dv.c	2009-06-07 18:09:22 UTC (rev 20716)
+++ trunk/blender/extern/ffmpeg/libavformat/dv.c	2009-06-07 18:19:28 UTC (rev 20717)
@@ -380,9 +380,12 @@
 
 void dv_offset_reset(DVDemuxContext *c, int64_t frame_offset)
 {
+    // FIXME: sys may be wrong if last dv_read_packet() failed (buffer is junk)
+    const DVprofile* sys = dv_codec_profile(c->vst->codec);
+
     c->frames= frame_offset;
     if (c->ach)
-        c->abytes= av_rescale_q(c->frames, c->sys->time_base,
+        c->abytes= av_rescale_q(c->frames, sys->time_base,
                                 (AVRational){8, c->ast[0]->codec->bit_rate});
     c->audio_pkt[0].size = c->audio_pkt[1].size = 0;
     c->audio_pkt[2].size = c->audio_pkt[3].size = 0;
@@ -460,9 +463,20 @@
     RawDVContext *r   = s->priv_data;
     DVDemuxContext *c = r->dv_demux;
     int64_t offset    = dv_frame_offset(s, c, timestamp, flags);
+    // FIXME: sys may be wrong if last dv_read_packet() failed (buffer is junk)
+    const DVprofile* sys = dv_codec_profile(c->vst->codec);
 
-    dv_offset_reset(c, offset / c->sys->frame_size);
+    if (!c->sys) {
+        av_log(s, AV_LOG_ERROR, 
+	       "dv_read_seek: c->sys == NULL, "
+	       "frame_size=%d, offset=%lld, "
+	       "restoring c->sys using c->vst->codec.\n", 
+	       sys->frame_size, offset);
+	c->sys = sys;
+    }
 
+    dv_offset_reset(c, offset / sys->frame_size);
+
     offset = url_fseek(s->pb, offset, SEEK_SET);
     return (offset < 0) ? offset : 0;
 }

Added: trunk/blender/extern/ffmpeg/patches/ffmpeg_work_around_dv_crash.patch
===================================================================
--- trunk/blender/extern/ffmpeg/patches/ffmpeg_work_around_dv_crash.patch	                        (rev 0)
+++ trunk/blender/extern/ffmpeg/patches/ffmpeg_work_around_dv_crash.patch	2009-06-07 18:19:28 UTC (rev 20717)
@@ -0,0 +1,40 @@
+Index: libavformat/dv.c
+===================================================================
+--- libavformat/dv.c	(revision 20714)
++++ libavformat/dv.c	(working copy)
+@@ -380,9 +380,12 @@
+ 
+ void dv_offset_reset(DVDemuxContext *c, int64_t frame_offset)
+ {
++    // FIXME: sys may be wrong if last dv_read_packet() failed (buffer is junk)
++    const DVprofile* sys = dv_codec_profile(c->vst->codec);
++
+     c->frames= frame_offset;
+     if (c->ach)
+-        c->abytes= av_rescale_q(c->frames, c->sys->time_base,
++        c->abytes= av_rescale_q(c->frames, sys->time_base,
+                                 (AVRational){8, c->ast[0]->codec->bit_rate});
+     c->audio_pkt[0].size = c->audio_pkt[1].size = 0;
+     c->audio_pkt[2].size = c->audio_pkt[3].size = 0;
+@@ -460,9 +463,20 @@
+     RawDVContext *r   = s->priv_data;
+     DVDemuxContext *c = r->dv_demux;
+     int64_t offset    = dv_frame_offset(s, c, timestamp, flags);
++    // FIXME: sys may be wrong if last dv_read_packet() failed (buffer is junk)
++    const DVprofile* sys = dv_codec_profile(c->vst->codec);
+ 
+-    dv_offset_reset(c, offset / c->sys->frame_size);
++    if (!c->sys) {
++        av_log(s, AV_LOG_ERROR, 
++	       "dv_read_seek: c->sys == NULL, "
++	       "frame_size=%d, offset=%lld, "
++	       "restoring c->sys using c->vst->codec.\n", 
++	       sys->frame_size, offset);
++	c->sys = sys;
++    }
+ 
++    dv_offset_reset(c, offset / sys->frame_size);
++
+     offset = url_fseek(s->pb, offset, SEEK_SET);
+     return (offset < 0) ? offset : 0;
+ }





More information about the Bf-blender-cvs mailing list