[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