Changeset 4672

Show
Ignore:
Timestamp:
03/05/10 12:55:34 (4 years ago)
Author:
douglask
Message:

Avoid using SWSCALE to scale 1920x1080 to 1920x1072 due to poor performance

clip widescreen resoltion when using CIF & QCIF

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • vic/branches/mpeg4/video/grabber-decklink.cpp

    r4671 r4672  
    105105        cformat = format; 
    106106        for (int i = 0; i < mBufferSize; i++) { 
    107             mBuffer[i] = new uint8_t[width * height * 2]; 
    108             memset((void *)mBuffer[i], width * height * 2, sizeof(uint8_t)); 
     107            if (cformat == CF_422) { 
     108                    mBuffer[i] = new uint8_t[width * height * 2]; 
     109            } else { 
     110                    mBuffer[i] = new uint8_t[width * height * 3 / 2]; 
     111            } 
     112            mBufferFrameNum[i] = 0; 
    109113        } 
    110114    } 
     
    122126        } 
    123127 
    124                 // ignore older frames 
    125                 if (mLastReadFrameNum >= mBufferFrameNum[mReadIndex] && mLastReadFrameNum <= 0xFFFFFFFF - mBufferSize) { 
     128        // ignore older frames 
     129        if (mLastReadFrameNum >= mBufferFrameNum[mReadIndex] && mLastReadFrameNum <= 0xFFFFFFFF - mBufferSize) { 
    126130            return NULL; 
    127131        } 
     
    132136        mReadIndex = nextElement; 
    133137 
    134 // fprintf(stderr, "*pop * mBuffer[%i] = 0x%lx\n", mReadIndex, mBuffer[mReadIndex]); 
    135  
    136138        return retval; 
    137  
    138139    } 
    139140 
     
    196197        if(nextElementIndex != mReadIndex) { 
    197198#ifdef HAVE_SWSCALE 
     199            // don't use SWSCALE to scale 1920x1080 to 1920x1072 
     200            if (outh == 1072) { 
     201                if (cformat == CF_422) { 
     202                    packedUYVY422_to_planarYUYV422((char *)mBuffer[mWriteIndex], outw, outh, 
     203                                                   (char *)videoFrame, arrivedFrame->GetWidth(), arrivedFrame->GetHeight()); 
     204                } else { 
     205                    packedUYVY422_to_planarYUYV420((char *)mBuffer[mWriteIndex], outw, outh, 
     206                                                   (char *)videoFrame, arrivedFrame->GetWidth(), arrivedFrame->GetHeight()); 
     207                } 
     208                mBufferFrameNum[mWriteIndex] = ++mLastWriteFrameNum; 
     209                mWriteIndex = nextElementIndex; 
     210 
     211                return S_OK; 
     212            } 
     213 
    198214            int flags = SWS_FAST_BILINEAR; 
    199215 
     
    246262            sws_scale(sws_context, sws_src, sws_src_stride, 0, arrivedFrame->GetHeight(), sws_tar, sws_tar_stride); 
    247263#else 
    248             memcpy((void *)(mBuffer[mWriteIndex]), videoFrame, arrivedFrame->GetRowBytes() * arrivedFrame->GetHeight()); 
    249 #endif 
    250  
    251 // fprintf(stderr, "*push* mBuffer[%i] = 0x%lx\n", mWriteIndex, mBuffer[mWriteIndex]); 
    252                         mBufferFrameNum[mWriteIndex] = ++mLastWriteFrameNum; 
     264            if (cformat == CF_422) { 
     265                packedUYVY422_to_planarYUYV422((char *)mBuffer[mWriteIndex], outw, outh, 
     266                                               (char *)videoFrame, arrivedFrame->GetWidth(), arrivedFrame->GetHeight()); 
     267            } else { 
     268                packedUYVY422_to_planarYUYV420((char *)mBuffer[mWriteIndex], outw, outh, 
     269                                               (char *)videoFrame, arrivedFrame->GetWidth(), arrivedFrame->GetHeight()); 
     270            } 
     271#endif 
     272            mBufferFrameNum[mWriteIndex] = ++mLastWriteFrameNum; 
    253273            mWriteIndex = nextElementIndex; 
    254274        } 
     
    743763    // Set the image size. 
    744764    switch (decimate_) { 
    745     case 1: // full-sized 
     765    case 1: // large-size 
    746766        if (strcmp(setSoftwareScale, "960p") == 0) { 
    747767            width_ = int(960 * displayModeWidth_ / displayModeHeight_); 
     
    761781        } 
    762782        break; 
    763     case 2: // CIF-sized 
    764         width_ = CIF_WIDTH; 
     783    case 2: // CIF-size 
     784        width_ = int(CIF_HEIGHT * displayModeWidth_ / displayModeHeight_); 
    765785        height_ = CIF_HEIGHT; 
    766786        break; 
    767     case 4: // QCIF-sized 
    768         width_ = QCIF_WIDTH; 
     787    case 4: // QCIF-size 
     788        width_ = int(QCIF_HEIGHT * displayModeWidth_ / displayModeHeight_); 
    769789        height_ = QCIF_HEIGHT; 
    770790        break; 
     
    792812        delegate_->Release(); 
    793813    } 
    794     delegate_ = new DeckLinkCaptureDelegate(outw_, outh_, cformat_); 
     814    if (decimate_ >= 2) { 
     815        delegate_ = new DeckLinkCaptureDelegate(width_, height_, cformat_); 
     816    } else { 
     817        delegate_ = new DeckLinkCaptureDelegate(outw_, outh_, cformat_); 
     818    } 
    795819 
    796820    result = deckLinkInput_->SetCallback(delegate_); 
     
    842866    } 
    843867 
    844 #ifdef HAVE_SWSCALE 
    845     switch (cformat_) { 
    846     case CF_420: 
    847     case CF_CIF: 
    848         memcpy((char *)frame_, (char *)fr, outw_ * outh_ * 3 / 2); 
    849       break; 
    850  
    851     case CF_422: 
    852         memcpy((char *)frame_, (char *)fr, outw_ * outh_ * 2); 
    853       break; 
    854     } 
    855 #else 
    856     switch (cformat_) { 
    857     case CF_420: 
    858     case CF_CIF: 
    859         packedUYVY422_to_planarYUYV420((char *)frame_, outw_, outh_, (char *)fr, inw_, inh_); 
    860       break; 
    861  
    862     case CF_422: 
    863         packedUYVY422_to_planarYUYV422((char *)frame_, outw_, outh_, (char *)fr, inw_, inh_); 
    864       break; 
    865     } 
    866 #endif 
     868 
     869    switch (decimate_) { 
     870    case 1: // large-size 
     871        if (cformat_ == CF_422) { 
     872            memcpy((char *)frame_, (char *)fr, outw_ * outh_ * 2); 
     873        } else { 
     874            memcpy((char *)frame_, (char *)fr, outw_ * outh_ * 3 / 2); 
     875        } 
     876        break; 
     877 
     878    case 2: // CIF-size 
     879        if (cformat_ == CF_422) { 
     880            planarYUYV422_to_planarYUYV422((char *)frame_, CIF_WIDTH, CIF_HEIGHT, (char *)fr, width_, height_); 
     881        } else { 
     882            planarYUYV420_to_planarYUYV420((char *)frame_, CIF_WIDTH, CIF_HEIGHT, (char *)fr, width_, height_); 
     883        } 
     884        break; 
     885 
     886    case 4: // QCIF-size 
     887        if (cformat_ == CF_422) { 
     888            planarYUYV422_to_planarYUYV422((char *)frame_, QCIF_WIDTH, QCIF_HEIGHT, (char *)fr, width_, height_); 
     889        } else { 
     890            planarYUYV420_to_planarYUYV420((char *)frame_, QCIF_WIDTH, QCIF_HEIGHT, (char *)fr, width_, height_); 
     891        } 
     892        break; 
     893    } 
     894 
    867895    suppress(frame_); 
    868896    saveblks(frame_);