Ticket #6834: vdpau_flipqueue_locking.diff

File vdpau_flipqueue_locking.diff, 3.0 KB (added by markk, 11 years ago)

Test patch - apply some locking around creation/deletion of flip queue.

  • home/mark/mythtv/trunk/mythtv/libs/libmythtv/util-vdpau.cpp

     
    7070}
    7171
    7272VDPAUContext::VDPAUContext()
    73   : nextframedelay(0),      lastframetime(0),
     73  : display(NULL),          nextframedelay(0), lastframetime(0),
    7474    pix_fmt(-1),            checkVideoSurfaces(8), pause_surface(0),
    7575    outputSurface(0),       checkOutputSurfaces(false),
    7676    outputSize(QSize(0,0)), decoder(0),        maxReferences(2),
     
    134134                        bool color_control, int color_key,
    135135                        MythCodecID mcodecid, QString options)
    136136{
     137    display = disp;
    137138    outputSize = screen_size;
    138139    ParseOptions(options);
    139140
     
    142143
    143144    bool ok;
    144145
    145     ok = InitProcs(disp);
     146    ok = InitProcs();
    146147    if (!ok)
    147148        return ok;
    148149
     
    185186    return &dummy[0];
    186187}
    187188
    188 bool VDPAUContext::InitProcs(MythXDisplay *disp)
     189bool VDPAUContext::InitProcs(void)
    189190{
     191    if (!display)
     192        return false;
     193
    190194    VdpStatus vdp_st;
    191195    bool ok = true;
    192196    vdp_get_error_string = &dummy_get_error_string;
    193197
    194     XLOCK(disp, vdp_st = vdp_device_create_x11(
    195         disp->GetDisplay(),
    196         disp->GetScreen(),
     198    XLOCK(display, vdp_st = vdp_device_create_x11(
     199        display->GetDisplay(),
     200        display->GetScreen(),
    197201        &vdp_device,
    198202        &vdp_get_proc_address
    199203    ));
     
    540544    VdpStatus vdp_st;
    541545    bool ok = true;
    542546
     547    if (!display)
     548        return false;
     549
     550    display->Lock();
    543551    vdp_st = vdp_presentation_queue_target_create_x11(
    544552        vdp_device,
    545553        win,
     
    569577        CHECK_ST
    570578    }
    571579
     580    display->Unlock();
    572581    return ok;
    573582}
    574583
     
    577586    VdpStatus vdp_st;
    578587    bool ok = true;
    579588
     589    if (display)
     590        display->Lock();
     591
    580592    if (vdp_flip_queue)
    581593    {
    582594        vdp_st = vdp_presentation_queue_destroy(
     
    592604        vdp_flip_target = 0;
    593605        CHECK_ST
    594606    }
     607
     608    if (display)
     609        display->Unlock();
     610
    595611}
    596612
    597613int VDPAUContext::AddBuffer(int width, int height)
  • home/mark/mythtv/trunk/mythtv/libs/libmythtv/util-vdpau.h

     
    103103    void DeinitPIP(NuppelVideoPlayer *pipplayer, bool check_layer = true);
    104104
    105105  private:
    106     bool InitProcs(MythXDisplay *disp);
     106    bool InitProcs(void);
    107107    void DeinitProcs(void);
    108108    void ClearScreen(void);
    109109    VdpVideoMixer CreateMasterMixer(int width, int height);
     
    119119    bool InitPIP(NuppelVideoPlayer *pipplayer, QSize vid_size);
    120120    void ParseOptions(QString options);
    121121
     122    MythXDisplay *display;
    122123    int nextframedelay;
    123124    VdpTime lastframetime;
    124125