Ticket #3479: zoom.diff

File zoom.diff, 26.7 KB (added by Petr Stehlik <pstehlik@…>, 13 years ago)

separates aspect override and zoom modes

  • libs/libmythtv/NuppelVideoPlayer.cpp

     
    46024602    return retval;
    46034603}
    46044604
    4605 int NuppelVideoPlayer::GetLetterbox(void) const
     4605int NuppelVideoPlayer::GetAspectOverride(void) const
    46064606{
    46074607    if (videoOutput)
    4608         return videoOutput->GetLetterbox();
     4608        return videoOutput->GetAspectOverride();
    46094609    return false;
    46104610}
    46114611
     4612int NuppelVideoPlayer::GetAdjustFill(void) const
     4613{
     4614    if (videoOutput)
     4615        return videoOutput->GetAdjustFill();
     4616    return false;
     4617}
     4618
    46124619void NuppelVideoPlayer::SetForcedAspectRatio(int mpeg2_aspect_value, int letterbox_permission)
    46134620{
    46144621    (void)letterbox_permission;
     
    46294636    }
    46304637}
    46314638
    4632 void NuppelVideoPlayer::ToggleLetterbox(int letterboxMode)
     4639void NuppelVideoPlayer::ToggleAspectOverride(int aspectMode)
    46334640{
    46344641    if (videoOutput)
    46354642    {
    4636         videoOutput->ToggleLetterbox(letterboxMode);
     4643        videoOutput->ToggleAspectOverride(aspectMode);
    46374644        ReinitOSD();
    46384645    }
    46394646}
    46404647
     4648void NuppelVideoPlayer::ToggleAdjustFill(int adjustfillMode)
     4649{
     4650    if (videoOutput)
     4651    {
     4652        videoOutput->ToggleAdjustFill(adjustfillMode);
     4653        ReinitOSD();
     4654    }
     4655}
     4656
    46414657void NuppelVideoPlayer::Zoom(int direction)
    46424658{
    46434659    if (videoOutput)
  • libs/libmythtv/videoout_quartz.cpp

     
    344344    double hscale, vscale;
    345345    switch (parentData->srcMode)
    346346    {
    347         case kLetterbox_4_3_Zoom:
     347        case kAdjustFill_Full:
    348348            // height only fills 3/4 of image, zoom up
    349             hscale = vscale = h * 1.0 / (sh * 0.75);
    350             break;
    351         case kLetterbox_16_9_Zoom:
    352             // width only fills 3/4 of image, zoom up
     349            // (16:9 movie in 4:3 letterbox format on 16:9 screen)
    353350            hscale = vscale = w * 1.0 / (sw * 0.75);
    354351            break;
    355         case kLetterbox_16_9_Stretch:
     352        case kAdjustFill_Half:
     353            // height only fills 3/4 of image, zoom up
     354            // (4:3 movie on 16:9 screen - 14:9 zoom is a good compromise)
     355            hscale = vscale = w * 7.0 / (sw * 6);
     356            break;
     357        case kAdjustFill_Stretch:
    356358            // like 16 x 9 standard, but with a horizontal stretch applied
    357359            hscale = vscale = fmin(h * 1.0 / sh, w * 1.0 / sw);
    358360            hscale *= 4.0 / 3.0;
    359361            break;
    360         case kLetterbox_4_3:
    361         case kLetterbox_16_9:
    362362        default:
    363363            // standard, fill viewport with scaled image
    364364            hscale = vscale = fmin(h * 1.0 / sh, w * 1.0 / sw);
  • libs/libmythtv/tv_play.h

     
    234234
    235235    void ChangeVolume(bool up);
    236236    void ToggleMute(void);
    237     void ToggleLetterbox(int letterboxMode = -1);
     237    void ToggleAspectOverride(int aspectMode = -1);
     238    void ToggleAdjustFill(int adjustfillMode = -1);
    238239
    239240    bool FillMenuTracks(OSDGenericTree*, uint type);
    240241    void ChangeTrack(uint type, int dir);
  • libs/libmythtv/NuppelVideoPlayer.h

     
    170170    void SetVideoResize(const QRect &videoRect);
    171171
    172172    // Toggle Sets
    173     void ToggleLetterbox(int letterboxMode = -1);
     173    void ToggleAspectOverride(int aspectMode = -1);
     174    void ToggleAdjustFill(int adjustfillMode = -1);
    174175
    175176    // Gets
    176177    int     GetVideoWidth(void) const         { return video_width; }
     
    179180    float   GetFrameRate(void) const          { return video_frame_rate; }
    180181
    181182    int     GetSecondsBehind(void) const;
    182     int     GetLetterbox(void) const;
     183    int     GetAspectOverride(void) const;
     184    int     GetAdjustFill(void) const;
    183185    int     GetFFRewSkip(void) const          { return ffrew_skip; }
    184186    float   GetAudioStretchFactor(void) const { return audio_stretchfactor; }
    185187    float   GetNextPlaySpeed(void) const      { return next_play_speed; }
  • libs/libmythtv/tv_play.cpp

     
    22952295                ToggleRecord();
    22962296            else if (action == "VOLUMEDOWN" || action == "VOLUMEUP" ||
    22972297                     action == "STRETCHINC" || action == "STRETCHDEC" ||
    2298                      action == "MUTE" || action == "TOGGLEASPECT")
     2298                     action == "MUTE" || action == "TOGGLEASPECT" || action == "TOGGLEFILL" )
    22992299            {
    23002300                passThru = 1;
    23012301                handled = false;
     
    28902890        else if (action == "STRETCHDEC")
    28912891            ChangeTimeStretch(-1);
    28922892        else if (action == "TOGGLEASPECT")
    2893             ToggleLetterbox();
     2893            ToggleAspectOverride();
     2894        else if (action == "TOGGLEFILL")
     2895            ToggleAdjustFill();
    28942896        else if (action == "MENU")
    28952897            ShowOSDTreeMenu();
    28962898        else
     
    54345436    wantsToQuit = true;
    54355437}
    54365438
    5437 void TV::ToggleLetterbox(int letterboxMode)
     5439void TV::ToggleAspectOverride(int aspectMode)
    54385440{
    5439     nvp->ToggleLetterbox(letterboxMode);
    5440     int letterbox = nvp->GetLetterbox();
     5441    nvp->ToggleAspectOverride(aspectMode);
     5442    int aspectoverride = nvp->GetAspectOverride();
    54415443    QString text;
    54425444
    5443     switch (letterbox)
     5445    switch (aspectoverride)
    54445446    {
    5445         case kLetterbox_4_3:          text = tr("4:3"); break;
    5446         case kLetterbox_16_9:         text = tr("16:9"); break;
    5447         case kLetterbox_4_3_Zoom:     text = tr("4:3 Zoom"); break;
    5448         case kLetterbox_16_9_Zoom:    text = tr("16:9 Zoom"); break;
    5449         case kLetterbox_16_9_Stretch: text = tr("16:9 Stretch"); break;
    5450         case kLetterbox_Fill:         text = tr("Fill"); break;
     5447        case kAspect_4_3:             text = tr("4:3"); break;
     5448        case kAspect_16_9:            text = tr("16:9"); break;
    54515449        default:                      text = tr("Off"); break;
    54525450    }
    54535451
     
    54555453        GetOSD()->SetSettingsText(text, 3);
    54565454}
    54575455
     5456void TV::ToggleAdjustFill(int adjustfillMode)
     5457{
     5458    nvp->ToggleAdjustFill(adjustfillMode);
     5459    int adjustfill = nvp->GetAdjustFill();
     5460    QString text;
     5461
     5462    switch (adjustfill)
     5463    {
     5464        case kAdjustFill_Half:        text = tr("Half Zoom"); break;
     5465        case kAdjustFill_Full:        text = tr("Full Zoom"); break;
     5466        case kAdjustFill_Stretch:     text = tr("Zoom & Stretch"); break;
     5467        default:                      text = tr("Off"); break;
     5468    }
     5469
     5470    if (GetOSD() && !browsemode && !GetOSD()->IsRunningTreeMenu())
     5471        GetOSD()->SetSettingsText(text, 3);
     5472}
     5473
    54585474void TV::EPGChannelUpdate(uint chanid, QString channum)
    54595475{
    54605476    if (chanid && !channum.isEmpty())
     
    64886504    }
    64896505    else if (action.left(12) == "TOGGLEASPECT")
    64906506    {
    6491         ToggleLetterbox(action.right(1).toInt());
     6507        ToggleAspectOverride(action.right(1).toInt());
    64926508    }
     6509    else if (action.left(10) == "TOGGLEFILL")
     6510    {
     6511        ToggleAdjustFill(action.right(1).toInt());
     6512    }
    64936513    else if (action == "GUIDE")
    64946514        EditSchedule(kScheduleProgramGuide);
    64956515    else if (action == "FINDER")
     
    67286748        FillMenuTracks(treeMenu, kTrackTypeTeletextCaptions);
    67296749    }
    67306750
    6731     int letterbox = nvp->GetLetterbox();
     6751    int aspectoverride = nvp->GetAspectOverride();
    67326752    item = new OSDGenericTree(treeMenu, tr("Change Aspect Ratio"));
    67336753    subitem = new OSDGenericTree(item, tr("Off"), "TOGGLEASPECT" +
    6734                                  QString("%1").arg(kLetterbox_Off),
    6735                                  ((letterbox <= kLetterbox_Off) ||
    6736                                   (letterbox >= kLetterbox_END)) ? 1 : 0,
     6754                                 QString("%1").arg(kAspect_Off),
     6755                                 ((aspectoverride <= kAspect_Off) ||
     6756                                  (aspectoverride >= kAspect_END)) ? 1 : 0,
    67376757                                 NULL, "ASPECTGROUP");
    67386758    subitem = new OSDGenericTree(item, tr("4:3"), "TOGGLEASPECT" +
    6739                                  QString("%1").arg(kLetterbox_4_3),
    6740                                  (letterbox == kLetterbox_4_3) ? 1 : 0,
     6759                                 QString("%1").arg(kAspect_4_3),
     6760                                 (aspectoverride == kAspect_4_3) ? 1 : 0,
    67416761                                 NULL, "ASPECTGROUP");
    67426762    subitem = new OSDGenericTree(item, tr("16:9"), "TOGGLEASPECT" +
    6743                                  QString("%1").arg(kLetterbox_16_9),
    6744                                  (letterbox == kLetterbox_16_9) ? 1 : 0,
     6763                                 QString("%1").arg(kAspect_16_9),
     6764                                 (aspectoverride == kAspect_16_9) ? 1 : 0,
    67456765                                 NULL, "ASPECTGROUP");
    6746     subitem = new OSDGenericTree(item, tr("4:3 Zoom"), "TOGGLEASPECT" +
    6747                                  QString("%1").arg(kLetterbox_4_3_Zoom),
    6748                                  (letterbox == kLetterbox_4_3_Zoom) ? 1 : 0,
    6749                                  NULL, "ASPECTGROUP");
    6750     subitem = new OSDGenericTree(item, tr("16:9 Zoom"), "TOGGLEASPECT" +
    6751                                  QString("%1").arg(kLetterbox_16_9_Zoom),
    6752                                  (letterbox == kLetterbox_16_9_Zoom) ? 1 : 0,
    6753                                  NULL, "ASPECTGROUP");
    6754     subitem = new OSDGenericTree(item, tr("16:9 Stretch"), "TOGGLEASPECT" +
    6755                                  QString("%1").arg(kLetterbox_16_9_Stretch),
    6756                                  (letterbox == kLetterbox_16_9_Stretch) ? 1 : 0,
    6757                                  NULL, "ASPECTGROUP");
    6758     subitem = new OSDGenericTree(item, tr("Fill"), "TOGGLEASPECT" +
    6759                                  QString("%1").arg(kLetterbox_Fill),
    6760                                  (letterbox == kLetterbox_Fill) ? 1 : 0,
    6761                                  NULL, "ASPECTGROUP");
    67626766
     6767    int adjustfill = nvp->GetAdjustFill();
     6768    item = new OSDGenericTree(treeMenu, tr("Adjust Fill"));
     6769    subitem = new OSDGenericTree(item, tr("Off"), "TOGGLEFILL" +
     6770                                 QString("%1").arg(kAdjustFill_Off),
     6771                                 ((adjustfill <= kAdjustFill_Off) ||
     6772                                  (adjustfill >= kAdjustFill_END)) ? 1 : 0,
     6773                                 NULL, "ADJUSTFILLGROUP");
     6774    subitem = new OSDGenericTree(item, tr("Half"), "TOGGLEFILL" +
     6775                                 QString("%1").arg(kAdjustFill_Half),
     6776                                 (adjustfill == kAdjustFill_Half) ? 1 : 0,
     6777                                 NULL, "ADJUSTFILLGROUP");
     6778    subitem = new OSDGenericTree(item, tr("Full"), "TOGGLEFILL" +
     6779                                 QString("%1").arg(kAdjustFill_Full),
     6780                                 (adjustfill == kAdjustFill_Full) ? 1 : 0,
     6781                                 NULL, "ADJUSTFILLGROUP");
     6782    subitem = new OSDGenericTree(item, tr("Stretch"), "TOGGLEFILL" +
     6783                                 QString("%1").arg(kAdjustFill_Stretch),
     6784                                 (adjustfill == kAdjustFill_Stretch) ? 1 : 0,
     6785                                 NULL, "ADJUSTFILLGROUP");
     6786
    67636787    if (db_use_picture_attr)
    67646788    {
    67656789        item = new OSDGenericTree(treeMenu, tr("Adjust Picture"));
  • libs/libmythtv/videooutbase.cpp

     
    151151    db_display_dim(0,0),                db_move(0,0),
    152152    db_scale_horiz(0.0f),               db_scale_vert(0.0f),
    153153    db_pip_location(0),                 db_pip_size(26),
    154     db_letterbox(kLetterbox_Off),       db_deint_filtername(QString::null),
     154    db_aspectoverride(kAspect_Off),     db_adjustfill(kAdjustFill_Off),
     155    db_deint_filtername(QString::null),
    155156
    156157    // Manual Zoom
    157158    mz_scale(0),                        mz_move(0,0),
     
    163164    video_dim(640,480),                 video_aspect(1.3333f),
    164165
    165166    // Aspect override
    166     letterboxed_video_aspect(1.3333f),  letterbox(kLetterbox_Off),
     167    overriden_video_aspect(1.3333f),    aspectoverride(kAspect_Off),
    167168
     169    // Adjust Fill
     170    adjustfill(kAdjustFill_Off),
     171
    168172    // Screen settings
    169173    video_rect(0,0,0,0),                display_video_rect(0,0,0,0),
    170174    display_visible_rect(0,0,0,0),      tmp_display_visible_rect(0,0,0,0),
     
    211215    db_pict_attr[kPictureAttribute_Hue] =
    212216        gContext->GetNumSetting("PlaybackHue",         0);
    213217
    214     db_letterbox       = gContext->GetNumSetting("AspectOverride",     0);
     218    db_aspectoverride  = gContext->GetNumSetting("AspectOverride",     0);
     219    db_adjustfill      = gContext->GetNumSetting("AdjustFill",         0);
    215220    db_deint_filtername= gContext->GetSetting("DeinterlaceFilter",
    216221                                              "linearblend");
    217222}
     
    255260    video_dim            = QSize(width, height);
    256261    video_rect           = QRect(QPoint(winx, winy), fix_1080i(video_dim));
    257262
    258     letterbox  = db_letterbox;
     263    aspectoverride  = db_aspectoverride;
     264    adjustfill      = db_adjustfill;
    259265
    260266    VideoAspectRatioChanged(aspect); // apply aspect ratio and letterbox mode
    261267
     
    376382/**
    377383 * \fn VideoOutput::SetVideoAspectRatio(float aspect)
    378384 * \brief Sets VideoOutput::video_aspect to aspect, and sets
    379  *        VideoOutput::letterboxed_video_aspect the letterbox type, unless
    380  *        the letterbox type is kLetterbox_Fill.
     385 *        VideoOutput::overriden_video_aspect if aspectoverride
     386 *        is set to either 4:3 or 16:9.
    381387 *
    382388 * \param aspect video aspect ratio to use
    383389 */
    384390void VideoOutput::SetVideoAspectRatio(float aspect)
    385391{
    386     letterboxed_video_aspect = video_aspect = aspect;
    387    
     392    overriden_video_aspect = video_aspect = aspect;
     393
    388394    // Override video's aspect if configured to do so
    389     if ((kLetterbox_4_3      == letterbox) ||
    390         (kLetterbox_4_3_Zoom == letterbox))
     395    if (kAspect_4_3 == aspectoverride)
    391396    {
    392         letterboxed_video_aspect = 4.0f / 3.0f;
     397        overriden_video_aspect = 4.0f / 3.0f;
    393398    }
    394     else if ((kLetterbox_16_9      == letterbox) ||
    395              (kLetterbox_16_9_Zoom == letterbox))
     399    else if (kAspect_16_9 == aspectoverride)
    396400    {
    397         letterboxed_video_aspect = 16.0f / 9.0f;
     401        overriden_video_aspect = 16.0f / 9.0f;
    398402    }
    399403}
    400404
     
    548552    float dispPixelAdj = (GetDisplayAspect() * display_visible_rect.height()) / display_visible_rect.width();
    549553    // now adjust for scaling of the video on the aspect ratio
    550554    float vs = ((float)vb.width())/vb.height();
    551     visible_aspect = 1.3333f * (vs/letterboxed_video_aspect) * dispPixelAdj;
     555    visible_aspect = 1.3333f * (vs/overriden_video_aspect) * dispPixelAdj;
    552556
    553557    // now adjust for scaling of the video on the size
    554558    font_scaling = 1.0f/sqrtf(2.0/(sq(visible_aspect / 1.3333f) + 1.0f));
    555559    // now adjust for aspect ratio effect on font size (should be in osd.cpp?)
    556     font_scaling *= sqrtf(letterboxed_video_aspect/1.3333f);
     560    font_scaling *= sqrtf(overriden_video_aspect/1.3333f);
    557561    return vb;
    558562}
    559563
     
    717721void VideoOutput::ApplyLetterboxing(void)
    718722{
    719723    float disp_aspect = fix_aspect(GetDisplayAspect());
    720     float aspect_diff = disp_aspect - letterboxed_video_aspect;
     724    float aspect_diff = disp_aspect - overriden_video_aspect;
    721725    bool  aspects_match = abs(aspect_diff / disp_aspect) <= 0.1f;
    722     bool  nomatch_with_fill = !aspects_match && (letterbox == kLetterbox_Fill);
     726    bool  nomatch_with_fill = !aspects_match && (adjustfill == kAdjustFill_Stretch);
    723727    bool  nomatch_without_fill = (!aspects_match) && !nomatch_with_fill;
    724728
    725729    // Adjust for video/display aspect ratio mismatch
    726     if (nomatch_with_fill && (disp_aspect > letterboxed_video_aspect))
     730    if (nomatch_with_fill && (disp_aspect > overriden_video_aspect))
    727731    {
    728732        float pixNeeded =
    729             ((disp_aspect / letterboxed_video_aspect) *
     733            ((disp_aspect / overriden_video_aspect) *
    730734             (float)display_video_rect.height()) + 0.5f;
    731735
    732736        display_video_rect.moveTop(
     
    737741    else if (nomatch_with_fill)
    738742    {
    739743        float pixNeeded =
    740             ((letterboxed_video_aspect / disp_aspect) *
     744            ((overriden_video_aspect / disp_aspect) *
    741745             (float)display_video_rect.width()) + 0.5f;
    742746
    743747        display_video_rect.moveLeft(
     
    746750
    747751        display_video_rect.setWidth((int)pixNeeded);
    748752    }
    749     else if (nomatch_without_fill && (disp_aspect > letterboxed_video_aspect))
     753    else if (nomatch_without_fill && (disp_aspect > overriden_video_aspect))
    750754    {
    751755        float pixNeeded =
    752             ((letterboxed_video_aspect / disp_aspect) *
     756            ((overriden_video_aspect / disp_aspect) *
    753757             (float)display_video_rect.width()) + 0.5f;
    754758
    755759        display_video_rect.moveLeft(
     
    761765    else if (nomatch_without_fill)
    762766    {
    763767        float pixNeeded =
    764             ((disp_aspect / letterboxed_video_aspect) *
     768            ((disp_aspect / overriden_video_aspect) *
    765769             (float)display_video_rect.height()) + 0.5f;
    766770
    767771        display_video_rect.moveTop(
     
    772776    }
    773777
    774778    // Process letterbox zoom modes
    775     if ((letterbox == kLetterbox_4_3_Zoom) ||
    776         (letterbox == kLetterbox_16_9_Zoom))
     779    if (adjustfill == kAdjustFill_Full)
    777780    {
    778781        // Zoom mode -- Expand by 4/3 and overscan.
    779782        // 1/6 of original is 1/8 of new
     
    783786            display_video_rect.width()  * 4 / 3,
    784787            display_video_rect.height() * 4 / 3);
    785788    }
    786     else if (letterbox == kLetterbox_16_9_Stretch)
     789    else if (adjustfill == kAdjustFill_Half)
    787790    {
     791        // Zoom mode -- Expand by 7/6 and overscan.
     792        // Intended for eliminating the top bars on 14:9 material.
     793        // Also good compromise for 4:3 material on 16:9 screen.
     794        // Expanding by 7/6, so remove 1/6 of original from overscan;
     795        // take half from each side, so remove 1/12.
     796        display_video_rect = QRect(
     797            display_video_rect.left() - (display_video_rect.width()  / 12),
     798            display_video_rect.top()  - (display_video_rect.height() / 12),
     799            display_video_rect.width()  * 7 / 6,
     800            display_video_rect.height() * 7 / 6);
     801    }
     802
     803    else if (adjustfill == kAdjustFill_Stretch)
     804    {
    788805        // Stretch mode -- intended to be used to eliminate side
    789806        //                 bars on 4:3 material encoded to 16:9.
    790807        // 1/6 of original is 1/8 of new
     
    852869    printf("Vscan(%f, %f)\n", db_scale_vert, db_scale_vert);
    853870    printf("DisplayAspect: %f\n", GetDisplayAspect());
    854871    printf("VideoAspect(%f)\n", video_aspect);
    855     printf("letterboxed_video_aspect(%f)\n", letterboxed_video_aspect);
     872    printf("overriden_video_aspect(%f)\n", overriden_video_aspect);
    856873    printf("CDisplayAspect: %f\n", fix_aspect(GetDisplayAspect()));
    857     printf("Letterbox: %d\n", letterbox);
     874    printf("AspectOverride: %d\n", aspectoverride);
     875    printf("AdjustFill: %d\n", adjustfill);
    858876#endif
    859877
    860878    VERBOSE(VB_PLAYBACK,
     
    869887                    "height: %4, aspect: %5")
    870888            .arg(video_rect.left()).arg(video_rect.top())
    871889            .arg(video_rect.width()).arg(video_rect.height())
    872             .arg(letterboxed_video_aspect));
     890            .arg(overriden_video_aspect));
    873891
    874892}
    875893
     
    881899 * then we letterbox settings, and finally we apply manual
    882900 * scale & move properties for "Zoom Mode".
    883901 *
    884  * \sa Zoom(int), ToggleLetterbox(int)
     902 * \sa Zoom(int), ToggleAdjustFill(int)
    885903 */
    886904void VideoOutput::MoveResize(void)
    887905{
     
    904922 * \fn VideoOutput::Zoom(int)
    905923 * \brief Sets up zooming into to different parts of the video, the zoom
    906924 *        is actually applied in MoveResize().
    907  * \sa ToggleLetterbox(int), GetLetterbox()
     925 * \sa ToggleAdjustFill(int)
    908926 */
    909927void VideoOutput::Zoom(int direction)
    910928{
     
    938956}
    939957
    940958/**
    941  * \fn VideoOutput::ToggleLetterbox(int)
    942  * \brief Sets up letterboxing for various standard video frame and
    943  *        monitor dimensions, then calls VideoAspectRatioChanged(float)
     959 * \fn VideoOutput::ToggleAspectOverride(int)
     960 * \brief Enforce different aspect ration than detected,
     961 *        then calls VideoAspectRatioChanged(float)
    944962 *        to apply them.
    945  * \sa Zoom(int),
     963 * \sa Zoom(int), ToggleAdjustFill(int)
    946964 */
    947 void VideoOutput::ToggleLetterbox(int letterboxMode)
     965void VideoOutput::ToggleAspectOverride(int aspectMode)
    948966{
    949     if (letterboxMode == kLetterbox_Toggle)
     967    if (aspectMode == kAspect_Toggle)
    950968    {
    951         if (++letterbox >= kLetterbox_END)
    952             letterbox = kLetterbox_Off;
     969        if (++aspectoverride >= kAspect_END)
     970            aspectoverride = kAspect_Off;
    953971    }
    954972    else
    955973    {
    956         letterbox = letterboxMode;
     974        aspectoverride = aspectMode;
    957975    }
    958976
    959977    VideoAspectRatioChanged(video_aspect);
    960978}
    961979
     980/**
     981 * \fn VideoOutput::ToggleAdjustFill(int)
     982 * \brief Sets up letterboxing for various standard video frame and
     983 *        monitor dimensions, then calls MoveResize()
     984 *        to apply them.
     985 * \sa Zoom(int), ToggleAspectOverride(int)
     986 */
     987void VideoOutput::ToggleAdjustFill(int adjustfillMode)
     988{
     989    if (adjustfillMode == kAdjustFill_Toggle)
     990    {
     991        if (++adjustfill >= kAdjustFill_END)
     992            adjustfill = kAdjustFill_Off;
     993    }
     994    else
     995    {
     996        adjustfill = adjustfillMode;
     997    }
     998
     999    MoveResize();
     1000}
     1001
    9621002int VideoOutput::ChangePictureAttribute(int attributeType, bool direction)
    9631003{
    9641004    int curVal = GetPictureAttribute(attributeType);
     
    11091149    int letterXadj = 0;
    11101150    int letterYadj = 0;
    11111151    float letterAdj = 1.0f;
    1112     if (letterbox != kLetterbox_Off)
     1152    if (aspectoverride != kAspect_Off)
    11131153    {
    11141154        letterXadj = max(-display_video_rect.left(), 0);
    11151155        float xadj = (float) video_rect.width() / display_visible_rect.width();
     
    11191159        letterYadj = max(-display_video_rect.top(), 0);
    11201160        letterYadj = (int) (letterYadj * yadj);
    11211161
    1122         letterAdj  = video_aspect / letterboxed_video_aspect;
     1162        letterAdj  = video_aspect / overriden_video_aspect;
    11231163    }
    11241164
    11251165    // adjust for non-square pixels on screen
  • libs/libmythtv/videooutbase.h

     
    8989    kZoomRight
    9090};
    9191
    92 enum LetterboxModes
     92enum AdjustFillModes
    9393{
    94     kLetterbox_Toggle = -1,
    95     kLetterbox_Off = 0,
    96     kLetterbox_4_3,
    97     kLetterbox_16_9,
    98     kLetterbox_4_3_Zoom,
    99     kLetterbox_16_9_Zoom,
    100     kLetterbox_16_9_Stretch,
    101     kLetterbox_Fill,
    102     kLetterbox_END
     94    kAdjustFill_Toggle = -1,
     95    kAdjustFill_Off = 0,
     96    kAdjustFill_Half,
     97    kAdjustFill_Full,
     98    kAdjustFill_Stretch,
     99    kAdjustFill_END
    103100};
    104101
     102enum AspectOverrideModes
     103{
     104    kAspect_Toggle = -1,
     105    kAspect_Off = 0,
     106    kAspect_4_3,
     107    kAspect_16_9,
     108    kAspect_END
     109};
     110
    105111enum FrameScanType
    106112{
    107113    kScan_Ignore      = -1,
     
    200206    /// \brief Returns current display aspect ratio.
    201207    virtual float GetDisplayAspect(void) const { return display_aspect; }
    202208
    203     /// \brief Returns current letterboxing mode
    204     /// \sa ToggleLetterbox(int)
    205     int GetLetterbox(void) { return letterbox; }
    206     void ToggleLetterbox(int letterboxMode = kLetterbox_Toggle);
     209    /// \brief Returns current aspect override mode
     210    /// \sa ToggleAspectOverride(int)
     211    int GetAspectOverride(void) { return aspectoverride; }
     212    void ToggleAspectOverride(int aspectOverrideMode = kAspect_Toggle);
    207213
     214    /// \brief Returns current adjust fill mode
     215    /// \sa ToggleAdjustFill(int)
     216    int GetAdjustFill(void) { return adjustfill; }
     217    void ToggleAdjustFill(int adjustFillMode = kAdjustFill_Toggle);
     218
    208219    // pass in null to use the pause frame, if it exists.
    209220    virtual void ProcessFrame(VideoFrame *frame, OSD *osd,
    210221                              FilterChain *filterList,
     
    343354    int     db_pip_location;
    344355    int     db_pip_size;      ///< percentage of full window to use for PiP
    345356    QMap<int,int> db_pict_attr; ///< Picture settings
    346     int     db_letterbox;
     357    int     db_aspectoverride;
     358    int     db_adjustfill;
    347359    QString db_deint_filtername;
    348360
    349361    // Manual Zoom
     
    359371    float   video_aspect;     ///< Physical aspect ratio of video
    360372
    361373    /// Normally this is the same as videoAspect, but may not be
    362     /// if the user has toggled to a different "letterbox" mode.
    363     float   letterboxed_video_aspect;
    364     /// LetterboxMode to use to modify letterboxed_video_aspect
    365     int     letterbox;
     374    /// if the user has toggled the aspect override mode.
     375    float   overriden_video_aspect;
     376    /// AspectOverrideMode to use to modify overriden_video_aspect
     377    int     aspectoverride;
     378    /// Zoom mode
     379    int     adjustfill;
    366380
    367381    /// Pixel rectangle in video frame to display
    368382    QRect   video_rect;
  • programs/mythfrontend/globalsettings.cpp

     
    15001500    gc->addSelection(QObject::tr("Off"), "0");
    15011501    gc->addSelection(QObject::tr("4/3"), "1");
    15021502    gc->addSelection(QObject::tr("16/9"), "2");
    1503     gc->addSelection(QObject::tr("4/3 Zoom"), "3");
    1504     gc->addSelection(QObject::tr("16/9 Zoom"), "4");
    1505     gc->addSelection(QObject::tr("16/9 Stretch"), "5");
    1506     gc->addSelection(QObject::tr("Fill"), "6");
    15071503    gc->setHelpText(QObject::tr("This will override any aspect ratio in the "
    15081504                    "recorded stream, the same as pressing the W Key during "
    1509                     "playback. Fill will \"fill\" the screen with the image "
    1510                     "clipping as required. Fill is useful when using 4:3 "
    1511                     "interlaced TV's for display."));
     1505                    "playback."));
    15121506    return gc;
    15131507}
    15141508
     1509static HostComboBox *AdjustFill()
     1510{
     1511    HostComboBox *gc = new HostComboBox("AdjustFill");
     1512    gc->setLabel(QObject::tr("Zoom"));
     1513    gc->addSelection(QObject::tr("Off"), "0");
     1514    gc->addSelection(QObject::tr("Half"), "1");
     1515    gc->addSelection(QObject::tr("Full"), "2");
     1516    gc->addSelection(QObject::tr("Stretch"), "3");
     1517    return gc;
     1518}
     1519
    15151520// Theme settings
    15161521
    15171522static HostSpinBox *GuiWidth()
     
    35063511    general->addChild(UseVideoTimebase());
    35073512    general->addChild(DecodeExtraAudio());
    35083513    general->addChild(AspectOverride());
     3514    // general->addChild(AdjustFill());
    35093515    general->addChild(PIPLocation());
    35103516    addChild(general);
    35113517