]> de.git.xonotic.org Git - xonotic/darkplaces.git/commitdiff
make AVI writing a bit more robust; if seeking back fails, the block it wanted to...
authordivverent <divverent@d7cf8633-e32d-0410-b094-e92efae38249>
Tue, 10 Feb 2009 11:22:47 +0000 (11:22 +0000)
committerdivverent <divverent@d7cf8633-e32d-0410-b094-e92efae38249>
Tue, 10 Feb 2009 11:22:47 +0000 (11:22 +0000)
git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@8697 d7cf8633-e32d-0410-b094-e92efae38249

cl_screen.c

index 473d8a60c49b4171682edef7aa46ed70d09e0bc8..366cf915acd01fa1eac0727662ecb125c04e2ccf 100644 (file)
@@ -1011,8 +1011,10 @@ static void SCR_CaptureVideo_RIFF_Pop(void)
        offset = SCR_CaptureVideo_RIFF_GetPosition();
        x = (int)(offset - (cls.capturevideo.riffstackstartoffset[cls.capturevideo.riffstacklevel]));
        sizebytes[0] = (x) & 0xff;sizebytes[1] = (x >> 8) & 0xff;sizebytes[2] = (x >> 16) & 0xff;sizebytes[3] = (x >> 24) & 0xff;
-       FS_Seek(cls.capturevideo.videofile, -(x + 4), SEEK_END);
-       FS_Write(cls.capturevideo.videofile, sizebytes, 4);
+       if(FS_Seek(cls.capturevideo.videofile, -(x + 4), SEEK_END) >= 0)
+       {
+               FS_Write(cls.capturevideo.videofile, sizebytes, 4);
+       }
        FS_Seek(cls.capturevideo.videofile, 0, SEEK_END);
        if (offset & 1)
        {
@@ -1092,18 +1094,22 @@ static void SCR_CaptureVideo_RIFF_MakeIxChunk(const char *fcc, const char *dwChu
        pos = SCR_CaptureVideo_RIFF_GetPosition();
        SCR_CaptureVideo_RIFF_Flush();
 
-       FS_Seek(cls.capturevideo.videofile, masteridx_start + 16 * *masteridx_count, SEEK_SET);
-       SCR_CaptureVideo_RIFF_Write32(ix & (fs_offset_t) 0xFFFFFFFFu);
-       SCR_CaptureVideo_RIFF_Write32(((fs_offset_t) ix) >> 32);
-       SCR_CaptureVideo_RIFF_Write32(pos - ix);
-       SCR_CaptureVideo_RIFF_Write32(nMatching);
-       SCR_CaptureVideo_RIFF_Flush();
+       if(FS_Seek(cls.capturevideo.videofile, masteridx_start + 16 * *masteridx_count, SEEK_SET) >= 0)
+       {
+               SCR_CaptureVideo_RIFF_Write32(ix & (fs_offset_t) 0xFFFFFFFFu);
+               SCR_CaptureVideo_RIFF_Write32(((fs_offset_t) ix) >> 32);
+               SCR_CaptureVideo_RIFF_Write32(pos - ix);
+               SCR_CaptureVideo_RIFF_Write32(nMatching);
+               SCR_CaptureVideo_RIFF_Flush();
+       }
 
-       FS_Seek(cls.capturevideo.videofile, masteridx_counter, SEEK_SET);
-       SCR_CaptureVideo_RIFF_Write32(++*masteridx_count);
-       SCR_CaptureVideo_RIFF_Flush();
+       if(FS_Seek(cls.capturevideo.videofile, masteridx_counter, SEEK_SET) >= 0)
+       {
+               SCR_CaptureVideo_RIFF_Write32(++*masteridx_count);
+               SCR_CaptureVideo_RIFF_Flush();
+       }
 
-       FS_Seek(cls.capturevideo.videofile, 0, SEEK_END);
+       FS_Seek(cls.capturevideo.videofile, 0, SEEK_END); // return value doesn't matter here
 }
 
 static void SCR_CaptureVideo_RIFF_Finish(qboolean final)
@@ -1130,9 +1136,11 @@ static void SCR_CaptureVideo_RIFF_Finish(qboolean final)
        if(cls.capturevideo.videofile_firstchunkframes_offset)
        {
                Con_DPrintf("Finishing first chunk (%d frames)\n", cls.capturevideo.frame);
-               FS_Seek(cls.capturevideo.videofile, cls.capturevideo.videofile_firstchunkframes_offset, SEEK_SET);
-               SCR_CaptureVideo_RIFF_Write32(cls.capturevideo.frame);
-               SCR_CaptureVideo_RIFF_Flush();
+               if(FS_Seek(cls.capturevideo.videofile, cls.capturevideo.videofile_firstchunkframes_offset, SEEK_SET) >= 0)
+               {
+                       SCR_CaptureVideo_RIFF_Write32(cls.capturevideo.frame);
+                       SCR_CaptureVideo_RIFF_Flush();
+               }
                FS_Seek(cls.capturevideo.videofile, 0, SEEK_END);
                cls.capturevideo.videofile_firstchunkframes_offset = 0;
        }
@@ -1484,18 +1492,24 @@ void SCR_CaptureVideo_EndVideo(void)
                        SCR_CaptureVideo_RIFF_Finish(true);
                        // go back and fix the video frames and audio samples fields
                        Con_DPrintf("Finishing capture (%d frames, %d audio frames)\n", cls.capturevideo.frame, cls.capturevideo.soundsampleframe);
-                       FS_Seek(cls.capturevideo.videofile, cls.capturevideo.videofile_totalframes_offset1, SEEK_SET);
-                       SCR_CaptureVideo_RIFF_Write32(cls.capturevideo.frame);
-                       SCR_CaptureVideo_RIFF_Flush();
-                       FS_Seek(cls.capturevideo.videofile, cls.capturevideo.videofile_totalframes_offset2, SEEK_SET);
-                       SCR_CaptureVideo_RIFF_Write32(cls.capturevideo.frame);
-                       SCR_CaptureVideo_RIFF_Flush();
-                       if (cls.capturevideo.soundrate)
+                       if(FS_Seek(cls.capturevideo.videofile, cls.capturevideo.videofile_totalframes_offset1, SEEK_SET) >= 0)
+                       {
+                               SCR_CaptureVideo_RIFF_Write32(cls.capturevideo.frame);
+                               SCR_CaptureVideo_RIFF_Flush();
+                       }
+                       if(FS_Seek(cls.capturevideo.videofile, cls.capturevideo.videofile_totalframes_offset2, SEEK_SET) >= 0)
                        {
-                               FS_Seek(cls.capturevideo.videofile, cls.capturevideo.videofile_totalsampleframes_offset, SEEK_SET);
-                               SCR_CaptureVideo_RIFF_Write32(cls.capturevideo.soundsampleframe);
+                               SCR_CaptureVideo_RIFF_Write32(cls.capturevideo.frame);
                                SCR_CaptureVideo_RIFF_Flush();
                        }
+                       if (cls.capturevideo.soundrate)
+                       {
+                               if(FS_Seek(cls.capturevideo.videofile, cls.capturevideo.videofile_totalsampleframes_offset, SEEK_SET) >= 0)
+                               {
+                                       SCR_CaptureVideo_RIFF_Write32(cls.capturevideo.soundsampleframe);
+                                       SCR_CaptureVideo_RIFF_Flush();
+                               }
+                       }
                        break;
                default:
                        break;