Ticket #4215: ticket_4218_attempt2.diff

File ticket_4218_attempt2.diff, 2.6 KB (added by skamithi, 14 years ago)

use videoframe struct for pip frame.

  • videooutbase.cpp

     
    14321432    {
    14331433        DoPipResize(pipw, piph);
    14341434
     1435        bzero(&pip_tmp_image, sizeof(pip_tmp_image));
     1436
    14351437        if (pip_tmp_buf && pip_scaling_context)
    14361438        {
    14371439            AVPicture img_in, img_out;
     
    14651467            pipw = pip_display_size.width();
    14661468            piph = pip_display_size.height();
    14671469
     1470            init(&pip_tmp_image,
     1471                    FMT_YV12,
     1472                    pipbuf,
     1473                    pipw, piph,
     1474                    pipimage->bpp, sizeof(pipbuf));
    14681475        }
    14691476    }
    14701477
    1471 
    14721478    // Figure out where to put the Picture-in-Picture window
    14731479    int xoff = 0;
    14741480    int yoff = 0;
     
    14931499                break;
    14941500    }
    14951501
    1496     // Copy Y (intensity values)
    1497     for (int i = 0; i < piph; i++)
     1502    uint xoff2[3]  = { xoff, xoff>>1, xoff>>1 };
     1503    uint yoff2[3]  = { yoff, yoff>>1, yoff>>1 };
     1504    uint height[3] = { piph, piph>>1, piph>>1 };
     1505   
     1506    for (int p = 0; p < 3; p++)
    14981507    {
    1499         memcpy(frame->buf + (i + yoff) * frame->width + xoff,
    1500                pipbuf + i * pipw, pipw);
     1508        for (uint h = 0; h < height[p]; h++)
     1509        {
     1510            memcpy((frame->buf + frame->offsets[p]) + (h + yoff2[p]) *
     1511                    frame->pitches[p] + xoff2[p],
     1512                    (pip_tmp_image.buf + pip_tmp_image.offsets[p]) + h *
     1513                    pip_tmp_image.pitches[p], pip_tmp_image.pitches[p]);
     1514        }
    15011515    }
    15021516
    1503     // Copy U & V (half plane chroma values)
    1504     xoff /= 2;
    1505     yoff /= 2;
    1506 
    1507     unsigned char *uptr = frame->buf + frame->width * frame->height;
    1508     unsigned char *vptr = frame->buf + frame->width * frame->height * 5 / 4;
    1509     int vidw = frame->width / 2;
    1510 
    1511     unsigned char *pipuptr = pipbuf + pipw * piph;
    1512     unsigned char *pipvptr = pipbuf + pipw * piph * 5 / 4;
    1513     pipw /= 2;
    1514 
    1515     for (int i = 0; i < piph / 2; i ++)
    1516     {
    1517         memcpy(uptr + (i + yoff) * vidw + xoff, pipuptr + i * pipw, pipw);
    1518         memcpy(vptr + (i + yoff) * vidw + xoff, pipvptr + i * pipw, pipw);
    1519     }
    1520 
    15211517    // we're done with the frame, release it
    15221518    pipplayer->ReleaseCurrentFrame(pipimage);
    15231519}
  • videooutbase.h

     
    313313    unsigned char      *pip_tmp_buf2;
    314314    ImgReSampleContext *pip_scaling_context;
    315315    bool pad_pip_window;
     316    VideoFrame pip_tmp_image;
    316317
    317318    // Video resizing (for ITV)
    318319    bool    vsz_enabled;