VirtualBox

Ignore:
Timestamp:
Mar 10, 2008 1:44:45 PM (17 years ago)
Author:
vboxsync
Message:

VBoxHeadless: don't segfault if we couldn't open the output file

Location:
trunk/src/VBox/Frontends/VBoxHeadless/VideoCapture
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Frontends/VBoxHeadless/VideoCapture/FFmpegFB.cpp

    r7292 r7400  
    2626#include <VBox/log.h>
    2727#include <png.h>
     28#include <iprt/stream.h>
    2829
    2930// external constructor for dynamic loading
     
    7576FFmpegFB::FFmpegFB(ULONG width, ULONG height, ULONG bitrate,
    7677                   com::Bstr filename) :
     78    mfUrlOpen(false),
    7779    mBitRate(bitrate),
    7880    mPixelFormat(FramebufferPixelFormat_Opaque),
     
    131133    if (mpFormatContext != 0)
    132134    {
    133         /* Dummy update to make sure we get all the frame (timing). */
    134         BOOL dummy;
    135         NotifyUpdate(0, 0, 0, 0, &dummy);
    136         /* Write the last pending frame before exiting */
    137         int rc = do_rgb_to_yuv_conversion();
    138         if (rc == S_OK)
    139             do_encoding_and_write();
     135        if (mfUrlOpen)
     136        {
     137            /* Dummy update to make sure we get all the frame (timing). */
     138            BOOL dummy;
     139            NotifyUpdate(0, 0, 0, 0, &dummy);
     140            /* Write the last pending frame before exiting */
     141            int rc = do_rgb_to_yuv_conversion();
     142            if (rc == S_OK)
     143                do_encoding_and_write();
    140144#if 1
    141         /* Add another 10 seconds. */
    142         for (int i = 10*25; i > 0; i--)
    143             do_encoding_and_write();
     145            /* Add another 10 seconds. */
     146            for (int i = 10*25; i > 0; i--)
     147                do_encoding_and_write();
    144148#endif
    145         /* write a png file of the last frame */
    146         write_png();
    147         avcodec_close(mpStream->codec);
    148         av_write_trailer(mpFormatContext);
    149         /* free the streams */
    150         for(int i = 0; i < mpFormatContext->nb_streams; i++) {
    151             av_freep(&mpFormatContext->streams[i]->codec);
    152             av_freep(&mpFormatContext->streams[i]);
     149            /* write a png file of the last frame */
     150            write_png();
     151            avcodec_close(mpStream->codec);
     152            av_write_trailer(mpFormatContext);
     153            /* free the streams */
     154            for(int i = 0; i < mpFormatContext->nb_streams; i++) {
     155                av_freep(&mpFormatContext->streams[i]->codec);
     156                av_freep(&mpFormatContext->streams[i]);
     157            }
     158            url_fclose(&mpFormatContext->pb);
    153159        }
    154         url_fclose(&mpFormatContext->pb);
    155160        av_free(mpFormatContext);
    156161    }
     
    782787                               szFileName, URL_WRONLY);
    783788    AssertReturn(rcUrlFopen >= 0, E_UNEXPECTED);
     789    mfUrlOpen = true;
    784790    av_write_header(mpFormatContext);
    785791    return S_OK;
  • trunk/src/VBox/Frontends/VBoxHeadless/VideoCapture/FFmpegFB.h

    r6000 r7400  
    109109
    110110private:
     111    /** true if url_fopen actually succeeded */
     112    bool mfUrlOpen;
    111113    /** Guest framebuffer width */
    112114    ULONG mGuestWidth;
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette