Ticket #843: pipplayer.8.diff

File pipplayer.8.diff, 15.8 KB (added by skamithi, 13 years ago)

get chromakey osd to go over pip. code untested. also has a couple of bug fixes.

  • libs/libmythtv/NuppelVideoPlayer.cpp

     
    502502
    503503    PIPType piptype = kPIPOff;
    504504
     505    if (ispip)
     506    {
     507        if (m_tv)
     508        {
     509            VideoOutput *vid = m_tv->GetVideoOutput();
     510            if (vid && !vid->IsResolutionSupported(video_width, video_height))
     511                return false;
     512            if (livetv)
     513                piptype = kPIPOnLiveTV;
     514            else
     515                piptype = kPIPOnTV;
     516        }
     517        else
     518            piptype = kPIPOn;
     519    }
     520
    505521    if (using_null_videoout)
    506522    {
    507523        videoOutput = new VideoOutputNull();
    508524        if (ispip)
    509         {
    510             if (m_tv)
    511             {
    512                 if (livetv)
    513                     piptype = kPIPOnLiveTV;
    514                 else
    515                     piptype = kPIPOnTV;
    516             }
    517             else
    518                 piptype = kPIPOn;
    519 
    520525            videoOutput->SetAsPIP(piptype);
    521         }
    522    
    523526           
    524527        if (!videoOutput->Init(video_width, video_height, video_aspect,
    525528                               0, 0, 0, 0, 0, 0))
     
    565568        }
    566569
    567570        if (ispip)
     571            videoOutput->SetAsPIP(piptype);
     572
     573        int xpos = 0;
     574        int ypos = 0;
     575        int widgetID = widget->winId();
     576        if (piptype >= kPIPOnTV && !softwareScalingPIP)
    568577        {
     578            xpos = widget->x();
     579            ypos = widget->y();
    569580            if (m_tv)
    570                 piptype = kPIPOnTV;
    571             else
    572                 piptype = kPIPOn;
    573            
    574             videoOutput->SetAsPIP(piptype);
     581                widgetID = m_tv->GetWidgetID();
    575582        }
    576 
     583       
    577584        if (!videoOutput->Init(video_width, video_height, video_aspect,
    578                                widget->winId(), 0, 0, widget->width(),
     585                               widgetID, xpos, ypos, widget->width(),
    579586                               widget->height(), 0))
    580587        {
    581588            errored = true;
  • libs/libmythtv/tv_play.h

     
    3434class OSDGenericTree;
    3535class LiveTVChain;
    3636class PIPPlayer;
     37class VideoOutput;
    3738
    3839typedef QValueVector<QString>    str_vec_t;
    3940typedef QMap<QString,QString>    InfoMap;
     
    172173
    173174    // Non-const queries
    174175    OSD *GetOSD(void);
     176    int GetWidgetID(void);
     177    VideoOutput *GetVideoOutput(void);
    175178
    176179    void SetCurrentlyPlaying(ProgramInfo *pginfo);
    177180
  • libs/libmythtv/pipplayer.h

     
    1818class PIPPlayer
    1919{
    2020    public:
    21         PIPPlayer(void);
     21        PIPPlayer(const QRect &rect, int location = -1);
    2222        ~PIPPlayer(void);
    23         static PIPPlayer *Create(const QRect &rect);
    24         static PIPPlayer * Create(NuppelVideoPlayer *parentnvp, int location);
    2523        bool StartPlaying(ProgramInfo *rec = NULL,
    2624                            bool piptype = false,
    2725                            bool nullvideo = false,
     
    4543        void Show(void);
    4644        bool UsingNullVideo(void) { return using_nullvideo; }
    4745        void GetARGBFrame(void);
    48         QSize GetVideoDimensions(void)
    49                 { return QSize(video_width, video_height); }
    5046        bool IsPaused(void) { return paused; }
    5147        void Pause(void);
    5248        void Play(float speed = 1.0);
     
    5551    private:
    5652        bool StartRecorder(RemoteEncoder *rec, int maxWait);
    5753        void Reinitialize(void);
    58         void Init(QRect rect, QString name);
    5954
    6055    private:
    6156        RemoteEncoder *piprecorder;
     
    6964        bool islivetv;
    7065        bool reinit;
    7166        bool using_nullvideo;
    72         int video_width;
    73         int video_height;
    7467        bool paused;
    7568};
    7669
  • libs/libmythtv/tv_play.cpp

     
    31573157
    31583158void TV::TogglePIPView(void)
    31593159{
    3160     if (!pipplayer)
     3160    if (!pipplayer && nvp)
    31613161    {
    31623162        int pip_location = gContext->GetNumSetting("PIPLocation", 0);
    3163         QRect rect = activenvp->getVideoOutput()->GetPIPRect(pip_location, NULL);
    3164         pipplayer = PIPPlayer::Create(rect);
    3165         if (!pipplayer)
    3166             return;
     3163        QRect rect = nvp->getVideoOutput()->GetPIPRect(pip_location, NULL);
     3164        pipplayer = new PIPPlayer(rect, pip_location);
    31673165        pipplayer->StartPlaying(NULL, true, false, this);
    31683166        if (pipplayer->IsPlaying())
    31693167        {
     
    31733171        }
    31743172        else
    31753173        {
    3176             QSize pipdim = pipplayer->GetVideoDimensions();
    3177             VideoOutput *vid = nvp->getVideoOutput();
    3178             if (vid &&
    3179                 vid->IsResolutionSupported(pipdim.width(), pipdim.height()))
     3174            if (pipplayer->GetNVP() &&
     3175                pipplayer->GetNVP()->PIPSoftwareScaling() &&
     3176                nvp->getVideoOutput() &&
     3177                nvp->getVideoOutput()->hasXVAcceleration())
    31803178            {
    3181                 if (pipplayer->GetNVP() &&
    3182                     pipplayer->GetNVP()->PIPSoftwareScaling() &&
    3183                     nvp->getVideoOutput() &&
    3184                     nvp->getVideoOutput()->hasXVAcceleration())
     3179                VERBOSE(VB_PLAYBACK, LOC + "Attempting to start Software Scaled PIP");
     3180                pipplayer->StartPlaying(NULL, true, true, this);
     3181                if (pipplayer->IsPlaying())
    31853182                {
    3186                     pipplayer->StartPlaying(NULL, true, true, this);
    3187                     if (pipplayer->IsPlaying())
    3188                     {
    3189                         pipplayer->Hide();
    3190                         activenvp->SetPIPPlayer(pipplayer->GetNVP());
    3191                         pipplayerCond.wait();
    3192                         pipplayer->GetNVP()->DiscardVideoFrames(true);
    3193                         return;
    3194                     }
     3183                    pipplayer->Hide();
     3184                    nvp->SetPIPPlayer(pipplayer->GetNVP());
     3185                    pipplayerCond.wait();
     3186                    pipplayer->GetNVP()->DiscardVideoFrames(true);
     3187                    return;
    31953188                }
    31963189            }
    31973190        }
     
    59055898    return NULL;
    59065899}
    59075900
     5901VideoOutput *TV::GetVideoOutput(void)
     5902{
     5903    if (nvp)
     5904        return nvp->getVideoOutput();
     5905    return NULL;
     5906}
     5907
    59085908void TV::TreeMenuEntered(OSDListTreeType *tree, OSDGenericTree *item)
    59095909{
    59105910    // show help text somewhere, perhaps?
     
    75357535    return true;
    75367536}
    75377537
     7538int TV::GetWidgetID(void)
     7539{
     7540    if (myWindow)
     7541        return myWindow->winId();
     7542    return -1;
     7543}
    75387544/* vim: set expandtab tabstop=4 shiftwidth=4: */
  • libs/libmythtv/videooutbase.cpp

     
    248248                .arg(db_move.x()).arg(db_move.y()));
    249249    }
    250250
    251     display_visible_rect = QRect(0, 0, winw, winh);
     251    display_visible_rect = QRect(winx, winy, winw, winh);
    252252    video_dim            = QSize(width, height);
    253253    video_rect           = QRect(QPoint(winx, winy), fix_1080i(video_dim));
    254254
  • libs/libmythtv/pipplayer.cpp

     
    1313    return NULL;
    1414}
    1515 
    16 PIPPlayer::PIPPlayer(void)
     16PIPPlayer::PIPPlayer(const QRect &rect, int location)
    1717    :   piprecorder(NULL), piprbuffer(NULL),
    1818        piptvchain(NULL), piprecinfo(NULL),
    1919        pipnvp(NULL), pipWindow(NULL),
    2020        islivetv(false),
    2121        reinit(true), using_nullvideo(false),
    22         video_width(0), video_height(0),
    2322        paused(false)
    2423{
     24    QString name;
     25    if (location > -1)
     26        name = QString("pip player %1").arg((int)location);
     27    else
     28        name = "pip player";
     29   
     30    QRect piprect = QRect(rect);
     31    MythMainWindow *mainWindow = gContext->GetMainWindow();
     32    QWidget *parentWidget = mainWindow->currentWidget();
     33    MythDialog *window = new MythDialog(gContext->GetMainWindow(), name);
     34    window->setNoErase();
     35    window->setGeometry(piprect);
     36    window->setFixedSize(piprect.size());
     37    window->show();
     38    mainWindow->detach(window);
     39    pipWindow = window;
     40    if (parentWidget && location > -1)
     41        pipWindow->stackUnder(parentWidget);
    2542};
    2643
    2744PIPPlayer::~PIPPlayer(void)
     
    3148        pipWindow->deleteLater();
    3249};
    3350
    34 PIPPlayer * PIPPlayer::Create(NuppelVideoPlayer *parentnvp, int location)
    35 {
    36     PIPPlayer *tmppip = new PIPPlayer();
    37     if (parentnvp)
    38     {
    39         QRect rect = parentnvp->getVideoOutput()->GetPIPRect(location, NULL);
    40         tmppip->Init(rect, QString("pip player %1").arg((int)location));
    41         return tmppip;
    42     }
    43     delete tmppip;
    44     return NULL;
    45 }
    46 
    47 PIPPlayer * PIPPlayer::Create(const QRect &rect)
    48 {
    49     PIPPlayer *tmppip = new PIPPlayer();
    50     tmppip->Init(rect, "pip player");
    51     return tmppip;
    52 }
    53 
    54 void PIPPlayer::Init(QRect rect, QString name)
    55 {
    56     QRect piprect = QRect(rect);
    57     MythDialog *window = new MythDialog(gContext->GetMainWindow(), name);
    58     window->setNoErase();
    59     window->setGeometry(piprect);
    60     window->setFixedSize(piprect.size());
    61     window->show();
    62     window->setBackgroundColor(Qt::black);
    63     gContext->GetMainWindow()->detach(window);
    64     pipWindow = window;
    65 }
    66 
    6751void PIPPlayer::Reinitialize(void)
    6852{
    6953    if (pipnvp)
     
    213197        usleep(5000);
    214198    }
    215199   
    216     video_width = pipnvp->GetVideoWidth();
    217     video_height = pipnvp->GetVideoHeight();
    218    
    219200    if (!pipnvp->IsPlaying())
    220201    {
    221202        VERBOSE(VB_PLAYBACK, LOC_ERR + "PIP NVP Failed to Start");
  • libs/libmythtv/videoout_xv.h

     
    229229
    230230    // Chromakey OSD info
    231231    ChromaKeyOSD        *chroma_osd;
     232
     233    //PIP Stuff
     234    /// \brief disable X11 setforeground on PIP when ChromakeyOSD is showing.
     235    static bool pip_disable_setForeground;
    232236};
    233237
    234238CodecID myth2av_codecid(MythCodecID codec_id,
  • libs/libmythtv/videoout_xv.cpp

     
    8585    "unknown", "xlib", "xshm", "xv-blit", "xvmc", "xvmc", "xvmc",
    8686};
    8787
     88bool VideoOutputXv::pip_disable_setForeground = false;
     89
    8890/** \class  VideoOutputXv
    8991 *  \brief Supports common video output methods used with %X11 Servers.
    9092 *
     
    176178
    177179    if (xvmc_tex)
    178180        delete xvmc_tex;
     181
     182    if (piptype == kPIPOff)
     183        pip_disable_setForeground = false;
    179184}
    180185
    181186// this is documented in videooutbase.cpp
     
    730735    if (!done && use_xv)
    731736        done = InitXVideo();
    732737
     738    if (!done && piptype > kPIPOff)
     739        return done;
     740
    733741    // Fall back to shared memory, if we are allowed to use it
    734742    if (!done && use_shm)
    735743        done = InitXShm();
     
    10981106
    10991107    return ret;
    11001108#else // if !USING_XVMC
     1109    (void)ispip;
    11011110    return (MythCodecID)(kCodec_MPEG1 + (stream_type-1));
    11021111#endif // !USING_XVMC
    11031112}
     
    25752584    if (chroma_osd && chroma_osd->GetImage() && xv_need_bobdeint_repaint)
    25762585    {
    25772586        X11L;
     2587        if (piptype == kPIPOff)
     2588            pip_disable_setForeground = true;
    25782589        XShmPutImage(XJ_disp, XJ_curwin, XJ_gc, chroma_osd->GetImage(),
    25792590                     0, 0, 0, 0,
    25802591                     display_visible_rect.width(),
     
    25902601
    25912602    X11L;
    25922603
     2604    if (piptype == kPIPOff)
     2605        pip_disable_setForeground = false;
     2606    else if (pip_disable_setForeground && piptype >= kPIPOnTV)
     2607    {
     2608        needrepaint = false;
     2609        return;
     2610    }
     2611   
    25932612    if (xv_draw_colorkey && needrepaint)
    25942613    {
    25952614        XSetForeground(XJ_disp, XJ_gc, xv_colorkey);
     
    32983317    if (width == 0 || height == 0)
    32993318        return false;
    33003319
     3320    if (!xv_chroma)
     3321    {
     3322        int ids[] = { GUID_I420_PLANAR, GUID_IYUV_PLANAR, GUID_YV12_PLANAR };
     3323        int format_cnt = 0;
     3324        XvImageFormatValues *formats;
     3325        X11S(formats = XvListImageFormats(XJ_disp, xv_port, &format_cnt));
     3326
     3327        for (int i = 0; i < format_cnt; i++)
     3328        {
     3329            char *chr = (char*) &(formats[i].id);
     3330            VERBOSE(VB_PLAYBACK, LOC + QString("IsResolutionSupported() PIP XVideo Format #%1 is '%2%3%4%5'")
     3331            .arg(i).arg(chr[0]).arg(chr[1]).arg(chr[2]).arg(chr[3]));
     3332        }
     3333
     3334#ifdef USE_HACK_FOR_BROKEN_I420_SUPPORT_IN_DRIVER
     3335        swap(ids[0], ids[2]);
     3336#endif // USE_HACK_FOR_BROKEN_I420_SUPPORT_IN_DRIVER
     3337
     3338        for (uint i = 0; i < sizeof(ids)/sizeof(int); i++)
     3339        {
     3340            if (has_format(formats, format_cnt, ids[i]))
     3341            {
     3342                xv_chroma = ids[i];
     3343                break;
     3344            }
     3345        }
     3346               
     3347        // IYUV is bit identical to I420, just pretend we saw I420
     3348        xv_chroma = (GUID_IYUV_PLANAR == xv_chroma) ? GUID_I420_PLANAR : xv_chroma;
     3349        if (formats)
     3350            X11S(XFree(formats));
     3351    }
     3352   
    33013353    if (xv_port >= 0 && xv_chroma)
    33023354    {
    33033355        int size = 0;
     
    33173369            delete info;
    33183370            return false;
    33193371        }
    3320 
    33213372        return true;
    33223373    }
     3374 
     3375    VERBOSE(VB_IMPORTANT, LOC_ERR + "IsResolutionSupported(): No free XV Ports or XV Chroma");
    33233376    return false;
    33243377}
    33253378       
  • programs/mythfrontend/playbackbox.cpp

     
    521521
    522522    if (previewVideoEnabled)
    523523    {
    524         previewPlayer = PIPPlayer::Create(drawVideoBounds);
     524        previewPlayer = new PIPPlayer(drawVideoBounds);
    525525        if (previewPlayer)
    526526            previewPlayer->Hide();
    527527        previewPixmapEnabled = true;
     
    21622162
    21632163    if (previewVideoEnabled && !previewPlayer)
    21642164    {
    2165         previewPlayer = PIPPlayer::Create(drawVideoBounds);
     2165        previewPlayer = new PIPPlayer(drawVideoBounds);
    21662166        if (previewPlayer)
    21672167            previewPlayer->Hide();
    21682168    }
  • programs/mythfrontend/globalsettings.cpp

     
    17791779
    17801780static HostCheckBox *EndOfRecordingExitPrompt()
    17811781{
    1782     HostCheckBox *gc = new HostCheckBox("EndOfRecordingExitPrompt");
     1782    HostCheckBox *gc = new HostCheckBox("EndofRecordingExitPrompt");
    17831783    gc->setLabel(QObject::tr("Prompt at end of recording"));
    17841784    gc->setValue(false);
    17851785    gc->setHelpText(QObject::tr("If set, a menu will be displayed allowing "
     
    18491849    return gc;
    18501850}
    18511851
    1852 static HostCheckBox *PlaybackPreviewLowCPU()
    1853 {
    1854     HostCheckBox *gc = new HostCheckBox("PlaybackPreviewLowCPU");
    1855     gc->setLabel(QObject::tr("CPU friendly preview of recordings"));
    1856     gc->setValue(false);
    1857     gc->setHelpText(QObject::tr("When enabled, recording previews "
    1858                     "will play with reduced FPS to save CPU."));
    1859     return gc;
    1860 }
    1861 
    18621852static HostCheckBox *PlayBoxTransparency()
    18631853{
    18641854    HostCheckBox *gc = new HostCheckBox("PlayBoxTransparency");
     
    41604150    general->addChild(oscan);
    41614151    general->addChild(columns2);
    41624152    general->addChild(PlaybackExitPrompt());
     4153    general->addChild(EndOfRecordingExitPrompt());
    41634154    addChild(general);
    41644155
    41654156    QString tmp = QString(" (%1/%2)").arg(++i).arg(total);