Ticket #1122: 1122-fix-v2.patch

File 1122-fix-v2.patch, 4.8 KB (added by danielk, 15 years ago)

Possible fix for EPIA XvMC

  • libs/libmythtv/videoout_xv.cpp

     
    55#include <cmath>
    66#include <ctime>
    77#include <cerrno>
     8#include <cassert>
    89
    910#include <malloc.h>
    1011#include <fcntl.h>
     
    4849#define round(x) ((int) ((x) + 0.5))
    4950#endif
    5051
     52static QMutex        open_xv_ports_lock;
     53static QMap<int,int> open_xv_ports;
     54static void add_open_xv_port(int port)
     55{
     56    if (port < 0)
     57        return;
     58    QMutexLocker locker(&open_xv_ports_lock);
     59    open_xv_ports[port] = port;
     60}
     61static void del_open_xv_port(int port)
     62{
     63    if (port < 0)
     64        return;
     65    QMutexLocker locker(&open_xv_ports_lock);
     66    open_xv_ports.remove(port);
     67}
     68static bool has_open_xv_port(int port)
     69{
     70    QMutexLocker locker(&open_xv_ports_lock);
     71    return open_xv_ports.find(port) != open_xv_ports.end();
     72}
     73static uint cnt_open_xv_port(void)
     74{
     75    QMutexLocker locker(&open_xv_ports_lock);
     76    return open_xv_ports.count();
     77}
    5178
    5279//#define DEBUG_PAUSE /* enable to debug XvMC pause frame */
    5380
     
    245272    // ungrab port...
    246273    if (xv_port >= 0)
    247274    {
     275        VERBOSE(VB_PLAYBACK, LOC + "Closing XVideo port " << xv_port);
    248276        X11S(XvUngrabPort(XJ_disp, xv_port, CurrentTime));
     277        del_open_xv_port(xv_port);
    249278        xv_port = -1;
    250279    }
    251280
     
    637666               
    638667                if (xvmc_surf_info)
    639668                    surf.set(surfNum, xvmc_surf_info);
     669                add_open_xv_port(p);
    640670                port = p;
    641671#endif // USING_XVMC
    642672            }
     
    646676                {
    647677                    X11S(ret = XvGrabPort(disp, p, CurrentTime));
    648678                    if (Success == ret)
     679                    {
     680                        add_open_xv_port(p);
    649681                        port = p;
     682                    }
    650683                }
    651684            }
    652685        }
     
    785818 */
    786819bool VideoOutputXv::InitXvMC(MythCodecID mcodecid)
    787820{
     821    VERBOSE(VB_IMPORTANT, "InitXvMC() -- begin");
    788822    (void)mcodecid;
    789823#ifdef USING_XVMC
     824    assert(xv_port < 0);
    790825    xv_port = GrabSuitableXvPort(XJ_disp, XJ_root, mcodecid,
    791826                                 XJ_width, XJ_height, xvmc_chroma,
    792827                                 &xvmc_surf_info);
     
    826861            delete xvmc_osd_available[i];
    827862        xvmc_osd_available.clear();
    828863        xvmc_osd_lock.unlock();
     864        VERBOSE(VB_PLAYBACK, LOC + "Closing XVideo port " << xv_port);
    829865        X11S(XvUngrabPort(XJ_disp, xv_port, CurrentTime));
     866        del_open_xv_port(xv_port);
    830867        xv_port = -1;
    831868    }
    832869
     870    VERBOSE(VB_IMPORTANT, "InitXvMC() -- end ok("<<ok<<")");
    833871    return ok;
    834872#else // USING_XVMC
    835873    return false;
     
    903941    {
    904942        VERBOSE(VB_IMPORTANT, LOC_ERR +
    905943                "Couldn't find the proper XVideo image format.");
     944        VERBOSE(VB_PLAYBACK, LOC + "Closing XVideo port " << xv_port);
    906945        X11S(XvUngrabPort(XJ_disp, xv_port, CurrentTime));
     946        del_open_xv_port(xv_port);
    907947        xv_port = -1;
    908948    }
    909949
     
    916956    {
    917957        VERBOSE(VB_IMPORTANT, LOC_ERR + "Failed to create XVideo Buffers.");
    918958        DeleteBuffers(XVideo, false);
     959        VERBOSE(VB_PLAYBACK, LOC + "Closing XVideo port " << xv_port);
    919960        X11S(XvUngrabPort(XJ_disp, xv_port, CurrentTime));
     961        del_open_xv_port(xv_port);
    920962        xv_port = -1;
    921963        ok = false;
    922964    }
     
    10561098                                  width, height);
    10571099            ok = NULL != ctx;
    10581100            DeleteXvMCContext(disp, ctx);
     1101            VERBOSE(VB_PLAYBACK, LOC + "Closing XVideo port " << port);
    10591102            X11S(XvUngrabPort(disp, port, CurrentTime));
     1103            del_open_xv_port(port);
    10601104        }
    10611105    }
    10621106    X11S(XCloseDisplay(disp));
    10631107
    1064     if (!ok)
     1108    if (!ok && !cnt_open_xv_port())
    10651109    {
    10661110        QString msg = LOC_ERR + "Could not open XvMC port...\n"
    10671111                "\n"
     
    11821226        DeleteBuffers(VideoOutputSubType(), true);
    11831227        if (xv_port >= 0)
    11841228        {
     1229            VERBOSE(VB_PLAYBACK, LOC + "Closing XVideo port " << xv_port);
    11851230            X11S(XvUngrabPort(XJ_disp, xv_port, CurrentTime));
     1231            del_open_xv_port(xv_port);
    11861232            xv_port = -1;
    11871233        }
    11881234#endif // USING_XVMC
  • libs/libmythtv/NuppelVideoPlayer.cpp

     
    367367
    368368bool NuppelVideoPlayer::InitVideo(void)
    369369{
     370    VERBOSE(VB_RECORD, "InitVideo()");
    370371    InitFilters();
    371372    if (using_null_videoout)
    372373    {
     
    447448
    448449void NuppelVideoPlayer::ReinitVideo(void)
    449450{
     451    VERBOSE(VB_RECORD, "ReinitVideo()");
    450452    InitFilters();
    451453
    452454    vidExitLock.lock();