Ticket #5324: mythtv-vid-26.diff

File mythtv-vid-26.diff, 4.7 KB (added by mark.kendall@…, 16 years ago)

Use an extra resize stage when downscaling and deinterlacing (denterlacing doesn't work otherwise), remove it when not deinterlacing.

  • libs/libmythtv/openglvideo.cpp

    Only in mythtv-vid-26/bindings/perl: Makefile.perl.old
    diff -ur -X excl mythtv-vid-25/libs/libmythtv/openglvideo.cpp mythtv-vid-26/libs/libmythtv/openglvideo.cpp
    old new  
    4444    inputTextureSize(0,0),    currentFrameNum(0),
    4545    inputUpdated(false),     
    4646    textureRects(false),      textureType(GL_TEXTURE_2D),
    47     helperTexture(0),         defaultResize(kGLFilterResize),
     47    helperTexture(0),         defaultUpsize(kGLFilterResize),
    4848    convertSize(0,0),         convertBuf(NULL),
    4949    videoResize(false),       videoResizeRect(0,0,0,0),
    5050    gl_features(0),
     
    122122        gl_context->SetFeatures(gl_features);
    123123
    124124    if (options.contains("openglbicubic"))
    125         defaultResize = kGLFilterBicubic;
     125        defaultUpsize = kGLFilterBicubic;
    126126
    127     if ((defaultResize != kGLFilterBicubic) && (gl_features & kGLExtRect))
     127    if ((defaultUpsize != kGLFilterBicubic) && (gl_features & kGLExtRect))
    128128        gl_context->GetTextureType(textureType, textureRects);
    129129
    130130    SetViewPort(display_visible_rect.size());
     
    196196    bool mmx = false;
    197197#endif
    198198
     199    CheckResize(false);
     200
    199201    VERBOSE(VB_PLAYBACK, LOC +
    200202            QString("Using packed textures with%1 mmx and with%2 PBOs")
    201203            .arg(mmx ? "" : "out").arg(use_pbo ? "" : "out"));
     
    203205    return true;
    204206}
    205207
    206 bool OpenGLVideo::OptimiseFilters(void)
     208void OpenGLVideo::CheckResize(bool deinterlacing)
    207209{
    208     bool resize =  ((video_dim.height() < display_video_rect.height()) ||
    209                     (video_dim.width()  <  display_video_rect.width()));
    210     resize &= !filters.count(kGLFilterResize);
    211     resize &= !filters.count(kGLFilterBicubic);
     210    // to improve performance on slower cards
     211    bool resize_up = (video_dim.height() < display_video_rect.height()) ||
     212                     (video_dim.width()  < display_video_rect.width());
     213
     214    // to ensure deinterlacing works correctly
     215    bool resize_down = (video_dim.height() > display_video_rect.height()) &&
     216                        deinterlacing;
     217
     218    if (resize_up && (defaultUpsize == kGLFilterBicubic))
     219    {
     220        RemoveFilter(kGLFilterResize);
     221        filters.erase(kGLFilterResize);
     222        AddFilter(kGLFilterBicubic);
     223        return;
     224    }
     225
     226    if ((resize_up && (defaultUpsize == kGLFilterResize)) || resize_down)
     227    {
     228        RemoveFilter(kGLFilterBicubic);
     229        filters.erase(kGLFilterBicubic);
     230        AddFilter(kGLFilterResize);
     231        return;
     232    }
     233
     234    if (!filters.count(kGLFilterYUV2RGBA))
     235    {
     236        RemoveFilter(kGLFilterResize);
     237        filters.erase(kGLFilterResize);
     238    }
     239
     240    RemoveFilter(kGLFilterBicubic);
     241    filters.erase(kGLFilterBicubic);
    212242
    213     if (resize)
    214         AddFilter(defaultResize);
     243    OptimiseFilters();
     244}
    215245
     246bool OpenGLVideo::OptimiseFilters(void)
     247{
    216248    glfilt_map_t::reverse_iterator it;
    217249
    218250    // add/remove required frame buffer objects
     
    464496
    465497    if (success)
    466498    {
     499        CheckResize(hardwareDeinterlacing);
    467500        hardwareDeinterlacer = deinterlacer;
    468501        return true;
    469502    }
     
    727760        return;
    728761
    729762    hardwareDeinterlacing = deinterlacing;
     763
     764    OpenGLContextLocker ctx_lock(gl_context);
     765    CheckResize(hardwareDeinterlacing);
    730766}
    731767
    732768// locking ok
  • libs/libmythtv/openglvideo.h

    diff -ur -X excl mythtv-vid-25/libs/libmythtv/openglvideo.h mythtv-vid-26/libs/libmythtv/openglvideo.h
    old new  
    8282    void SetViewPort(const QSize &new_viewport_size);
    8383    bool AddFilter(OpenGLFilterType filter);
    8484    bool RemoveFilter(OpenGLFilterType filter);
     85    void CheckResize(bool deinterlacing);
    8586    bool OptimiseFilters(void);
    8687    bool AddFrameBuffer(uint &framebuffer, QSize fb_size,
    8788                        uint &texture, QSize vid_size);
     
    130131    bool           textureRects;
    131132    uint           textureType;
    132133    uint           helperTexture;
    133     OpenGLFilterType defaultResize;
     134    OpenGLFilterType defaultUpsize;
    134135
    135136    QSize          convertSize;
    136137    unsigned char *convertBuf;