Ticket #1724: resizevideo.patch

File resizevideo.patch, 8.0 KB (added by anonymous, 14 years ago)
  • mythtv/libs/libmythtv/NuppelVideoPlayer.cpp

     
    62476247}
    62486248// EIA-708 caption support -- end
    62496249
     6250void NuppelVideoPlayer::SetVideoResize(const QRect &videoRect)
     6251{
     6252    if (videoOutput)
     6253        videoOutput->SetVideoResize(videoRect);
     6254}
     6255
    62506256/* vim: set expandtab tabstop=4 shiftwidth=4: */
  • mythtv/libs/libmythtv/NuppelVideoPlayer.h

     
    158158
    159159    void SetOSDFontName(const QString osdfonts[22], const QString &prefix);
    160160    void SetOSDThemeName(const QString themename);
     161    void SetVideoResize(const QRect &videoRect);
    161162
    162163    // Toggle Sets
    163164    void ToggleLetterbox(int letterboxMode = -1);
  • mythtv/libs/libmythtv/videooutbase.cpp

     
    175175    piph_out(-1),             pipw_out(-1),
    176176    piptmpbuf(NULL),          pipscontext(NULL),
    177177
     178    // Video resizing
     179    resizew_in(-1),           resizeh_in(-1),
     180    resizew_out(-1),          resizeh_out(-1),
     181    videoResizeSize(0,0,0,0), videotmpbuf(NULL),
     182    videoscontext(NULL),      resizeVideo(false),
     183
    178184    // Deinterlacing
    179185    m_deinterlacing(false),   m_deintfiltername("linearblend"),
    180186    m_deintFiltMan(NULL),     m_deintFilter(NULL),
     
    198204{
    199205    ShutdownPipResize();
    200206
     207    ShutdownVideoResize();
     208
    201209    if (m_deintFilter)
    202210        delete m_deintFilter;
    203211    if (m_deintFiltMan)
     
    11881196    pipplayer->ReleaseCurrentFrame(pipimage);
    11891197}
    11901198
     1199void VideoOutput::DoVideoResize(int video_width, int video_height, int desired_width, int desired_height)
     1200{
     1201    if (video_width   != resizew_in  ||
     1202        video_height  != resizeh_in  ||
     1203        desired_width != resizew_out ||
     1204        desired_height!= resizeh_out )
     1205    {
     1206        ShutdownVideoResize();
     1207
     1208        videotmpbuf = new unsigned char[desired_height * desired_width * 3 / 2];
     1209
     1210        resizeh_in  = video_height;
     1211        resizew_in  = video_width;
     1212        resizew_out = desired_width;
     1213        resizeh_out = desired_height;
     1214
     1215        videoscontext = img_resample_init(resizew_out, resizeh_out, resizew_in, resizeh_in);
     1216    }
     1217}
     1218
     1219void VideoOutput::ResizeVideo(VideoFrame *frame)
     1220{
     1221    if (videoResizeSize.isNull() || frame->codec !=  FMT_YV12)
     1222        return;
     1223
     1224    QRect resize = videoResizeSize;
     1225
     1226    // if resize is outside existing frame, abort
     1227    if((resize.right()  > frame->width  ||
     1228        resize.bottom() > frame->height ||
     1229        resize.width()    > frame->width  ||
     1230        resize.height()   > frame->height))
     1231    {
     1232        resizeVideo = false;
     1233        ShutdownVideoResize();
     1234        videoResizeSize.setRect(0,0,0,0);
     1235        return;
     1236    }
     1237    // if resize = existing frame size, no need to carry on
     1238    if(resize.left()   == 0 &&
     1239       resize.top()    == 0 &&
     1240      (resize.width()  == frame->width) &&
     1241      (resize.height() == frame->height))
     1242    {
     1243        resizeVideo = false;
     1244        ShutdownVideoResize();
     1245        videoResizeSize.setRect(0,0,0,0);
     1246        return;
     1247    }
     1248    DoVideoResize(frame->width, frame->height, resize.width(), resize.height());
     1249    if (videotmpbuf && videoscontext)
     1250    {
     1251        AVPicture img_in, img_out;
     1252
     1253        avpicture_fill(&img_out, (uint8_t *)videotmpbuf, PIX_FMT_YUV420P,
     1254                       resize.width(), resize.height());
     1255        avpicture_fill(&img_in, (uint8_t *)frame->buf, PIX_FMT_YUV420P,
     1256                       frame->width, frame->height);
     1257        img_resample(videoscontext, &img_out, &img_in);
     1258    }
     1259
     1260    int xoff = resize.left();
     1261    int yoff = resize.top();
     1262    int resw = resize.width();
     1263    // Copy Y (intensity values)
     1264    for (int i = 0; i < resize.height(); i++)
     1265    {
     1266        memcpy(frame->buf + (i + yoff) * frame->width + xoff,
     1267               videotmpbuf + i * resw, resw);
     1268    }
     1269    // Copy U & V (half plane chroma values)
     1270    xoff /= 2;
     1271    yoff /= 2;
     1272
     1273    unsigned char *uptr = frame->buf + frame->width * frame->height;
     1274    unsigned char *vptr = frame->buf + frame->width * frame->height * 5 / 4;
     1275    int vidw = frame->width / 2;
     1276
     1277    unsigned char *videouptr = videotmpbuf + resw * resize.height();
     1278    unsigned char *videovptr = videotmpbuf + resw * resize.height() * 5 / 4;
     1279    resw /= 2;
     1280    for (int i = 0; i < resize.height() / 2; i ++)
     1281    {
     1282        memcpy(uptr + (i + yoff) * vidw + xoff, videouptr + i * resw, resw);
     1283        memcpy(vptr + (i + yoff) * vidw + xoff, videovptr + i * resw, resw);
     1284    }
     1285}
     1286
     1287void VideoOutput::ShutdownVideoResize(void)
     1288{
     1289    if (videotmpbuf)
     1290        delete [] videotmpbuf;
     1291    if (videoscontext)
     1292        img_resample_close(videoscontext);
     1293
     1294    videotmpbuf = NULL;
     1295    videoscontext = NULL;
     1296
     1297    resizeh_in = resizeh_out = -1;
     1298    resizew_in = resizew_out = -1;
     1299
     1300}
     1301
     1302void VideoOutput::SetVideoResize(const QRect &videoRect)
     1303{
     1304    if (!videoRect.isValid()    ||
     1305         videoRect.width()  < 1 ||
     1306         videoRect.height() < 1 ||
     1307         videoRect.left()   < 0 ||
     1308         videoRect.top()    < 0 )
     1309    {
     1310        resizeVideo = false;
     1311        ShutdownVideoResize();
     1312        videoResizeSize.setRect(0,0,0,0);
     1313        return;
     1314    }
     1315    resizeVideo = true;
     1316    videoResizeSize = videoRect;
     1317}
     1318
    11911319/**
    11921320 * \fn VideoOutput::DisplayOSD(VideoFrame*,OSD *,int,int)
    11931321 * \brief If the OSD has changed, this will convert the OSD buffer
     
    12041332    if (!osd)
    12051333        return -1;
    12061334
     1335    if(resizeVideo)
     1336        ResizeVideo(frame);
     1337
    12071338    OSDSurface *surface = osd->Display();
    12081339    if (!surface)
    12091340        return -1;
  • mythtv/libs/libmythtv/videooutbase.h

     
    310310    /// \brief Updates frame displayed when video is paused.
    311311    virtual void UpdatePauseFrame(void) = 0;
    312312
     313    /// \brief Tells the player to resize the video frame (used for interactive)
     314    void SetVideoResize(const QRect &videoRect);
     315
    313316  protected:
    314317    void InitBuffers(int numdecode, bool extra_for_pause, int need_free,
    315318                     int needprebuffer_normal, int needprebuffer_small,
     
    327330    void DoPipResize(int pipwidth, int pipheight);
    328331    void ShutdownPipResize(void);
    329332
     333    void ShutdownVideoResize(void);
     334    void ResizeVideo(VideoFrame *frame);
     335    void DoVideoResize(int video_width, int video_height, int desired_width, int desired_height);
     336
    330337    void SetVideoAspectRatio(float aspect);
    331338
    332339    /// Physical width of playback window in millimeters, used to compute display_aspect
     
    391398    unsigned char      *piptmpbuf;
    392399    ImgReSampleContext *pipscontext;
    393400
     401    // video resizing
     402    int resizew_in;
     403    int resizeh_in;
     404    int resizew_out;
     405    int resizeh_out;
     406    QRect videoResizeSize;
     407    unsigned char      *videotmpbuf;
     408    ImgReSampleContext *videoscontext;
     409    bool resizeVideo;
     410
    394411    // Deinterlacing
    395412    bool           m_deinterlacing;
    396413    QString        m_deintfiltername;
  • mythtv/libs/libmythtv/mhi.cpp

     
    415415// e.g. part of the video may be clipped within the displayRect.
    416416void MHIContext::DrawVideo(const QRect &videoRect, const QRect &dispRect)
    417417{
    418     (void) videoRect;
     418    // tell the video player to resize the video stream
     419    if (m_parent->GetNVP())
     420        m_parent->GetNVP()->SetVideoResize(videoRect);
    419421
    420422    QMutexLocker locker(&m_display_lock);
    421423    QRect displayRect(dispRect.x() * m_displayWidth/StdDisplayWidth,