[Sumover-dev] [svn commit] r4672 - vic/branches/mpeg4/video

sumover-dev at cs.ucl.ac.uk sumover-dev at cs.ucl.ac.uk
Fri Mar 5 12:55:34 GMT 2010


Author: douglask
Date: Fri Mar  5 12:55:34 2010
New Revision: 4672

Modified:
   vic/branches/mpeg4/video/grabber-decklink.cpp

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

clip widescreen resoltion when using CIF & QCIF


Modified: vic/branches/mpeg4/video/grabber-decklink.cpp
==============================================================================
--- vic/branches/mpeg4/video/grabber-decklink.cpp	(original)
+++ vic/branches/mpeg4/video/grabber-decklink.cpp	Fri Mar  5 12:55:34 2010
@@ -104,8 +104,12 @@
         outh = height;
         cformat = format;
         for (int i = 0; i < mBufferSize; i++) {
-            mBuffer[i] = new uint8_t[width * height * 2];
-            memset((void *)mBuffer[i], width * height * 2, sizeof(uint8_t));
+            if (cformat == CF_422) {
+                    mBuffer[i] = new uint8_t[width * height * 2];
+            } else {
+                    mBuffer[i] = new uint8_t[width * height * 3 / 2];
+            }
+            mBufferFrameNum[i] = 0;
         }
     }
 
@@ -121,8 +125,8 @@
             return NULL;
         }
 
-		// ignore older frames
-		if (mLastReadFrameNum >= mBufferFrameNum[mReadIndex] && mLastReadFrameNum <= 0xFFFFFFFF - mBufferSize) {
+        // ignore older frames
+        if (mLastReadFrameNum >= mBufferFrameNum[mReadIndex] && mLastReadFrameNum <= 0xFFFFFFFF - mBufferSize) {
             return NULL;
         }
         mLastReadFrameNum = mBufferFrameNum[mReadIndex];
@@ -131,10 +135,7 @@
         int nextElement = (mReadIndex + 1) % mBufferSize;
         mReadIndex = nextElement;
 
-// fprintf(stderr, "*pop * mBuffer[%i] = 0x%lx\n", mReadIndex, mBuffer[mReadIndex]);
-
         return retval;
-
     }
 
     virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, LPVOID *ppv) {
@@ -195,6 +196,21 @@
 
         if(nextElementIndex != mReadIndex) {
 #ifdef HAVE_SWSCALE
+            // don't use SWSCALE to scale 1920x1080 to 1920x1072
+            if (outh == 1072) {
+                if (cformat == CF_422) {
+                    packedUYVY422_to_planarYUYV422((char *)mBuffer[mWriteIndex], outw, outh,
+                                                   (char *)videoFrame, arrivedFrame->GetWidth(), arrivedFrame->GetHeight());
+                } else {
+                    packedUYVY422_to_planarYUYV420((char *)mBuffer[mWriteIndex], outw, outh,
+                                                   (char *)videoFrame, arrivedFrame->GetWidth(), arrivedFrame->GetHeight());
+                }
+                mBufferFrameNum[mWriteIndex] = ++mLastWriteFrameNum;
+                mWriteIndex = nextElementIndex;
+
+                return S_OK;
+            }
+
             int flags = SWS_FAST_BILINEAR;
 
             if (sws_context == NULL){
@@ -245,11 +261,15 @@
 
             sws_scale(sws_context, sws_src, sws_src_stride, 0, arrivedFrame->GetHeight(), sws_tar, sws_tar_stride);
 #else
-            memcpy((void *)(mBuffer[mWriteIndex]), videoFrame, arrivedFrame->GetRowBytes() * arrivedFrame->GetHeight());
+            if (cformat == CF_422) {
+                packedUYVY422_to_planarYUYV422((char *)mBuffer[mWriteIndex], outw, outh,
+                                               (char *)videoFrame, arrivedFrame->GetWidth(), arrivedFrame->GetHeight());
+            } else {
+                packedUYVY422_to_planarYUYV420((char *)mBuffer[mWriteIndex], outw, outh,
+                                               (char *)videoFrame, arrivedFrame->GetWidth(), arrivedFrame->GetHeight());
+            }
 #endif
-
-// fprintf(stderr, "*push* mBuffer[%i] = 0x%lx\n", mWriteIndex, mBuffer[mWriteIndex]);
-			mBufferFrameNum[mWriteIndex] = ++mLastWriteFrameNum;
+            mBufferFrameNum[mWriteIndex] = ++mLastWriteFrameNum;
             mWriteIndex = nextElementIndex;
         }
 
@@ -742,7 +762,7 @@
 
     // Set the image size.
     switch (decimate_) {
-    case 1: // full-sized
+    case 1: // large-size
         if (strcmp(setSoftwareScale, "960p") == 0) {
             width_ = int(960 * displayModeWidth_ / displayModeHeight_);
             height_ = 960;
@@ -760,12 +780,12 @@
           height_ = displayModeHeight_;
         }
         break;
-    case 2: // CIF-sized
-        width_ = CIF_WIDTH;
+    case 2: // CIF-size
+        width_ = int(CIF_HEIGHT * displayModeWidth_ / displayModeHeight_);
         height_ = CIF_HEIGHT;
         break;
-    case 4: // QCIF-sized
-        width_ = QCIF_WIDTH;
+    case 4: // QCIF-size
+        width_ = int(QCIF_HEIGHT * displayModeWidth_ / displayModeHeight_);
         height_ = QCIF_HEIGHT;
         break;
     }
@@ -791,7 +811,11 @@
     if (delegate_) {
         delegate_->Release();
     }
-    delegate_ = new DeckLinkCaptureDelegate(outw_, outh_, cformat_);
+    if (decimate_ >= 2) {
+        delegate_ = new DeckLinkCaptureDelegate(width_, height_, cformat_);
+    } else {
+        delegate_ = new DeckLinkCaptureDelegate(outw_, outh_, cformat_);
+    }
 
     result = deckLinkInput_->SetCallback(delegate_);
 
@@ -841,29 +865,33 @@
         return 0;
     }
 
-#ifdef HAVE_SWSCALE
-    switch (cformat_) {
-    case CF_420:
-    case CF_CIF:
-        memcpy((char *)frame_, (char *)fr, outw_ * outh_ * 3 / 2);
-      break;
 
-    case CF_422:
-        memcpy((char *)frame_, (char *)fr, outw_ * outh_ * 2);
-      break;
-    }
-#else
-    switch (cformat_) {
-    case CF_420:
-    case CF_CIF:
-        packedUYVY422_to_planarYUYV420((char *)frame_, outw_, outh_, (char *)fr, inw_, inh_);
-      break;
+    switch (decimate_) {
+    case 1: // large-size
+        if (cformat_ == CF_422) {
+            memcpy((char *)frame_, (char *)fr, outw_ * outh_ * 2);
+        } else {
+            memcpy((char *)frame_, (char *)fr, outw_ * outh_ * 3 / 2);
+        }
+        break;
 
-    case CF_422:
-        packedUYVY422_to_planarYUYV422((char *)frame_, outw_, outh_, (char *)fr, inw_, inh_);
-      break;
+    case 2: // CIF-size
+        if (cformat_ == CF_422) {
+            planarYUYV422_to_planarYUYV422((char *)frame_, CIF_WIDTH, CIF_HEIGHT, (char *)fr, width_, height_);
+        } else {
+            planarYUYV420_to_planarYUYV420((char *)frame_, CIF_WIDTH, CIF_HEIGHT, (char *)fr, width_, height_);
+        }
+        break;
+
+    case 4: // QCIF-size
+        if (cformat_ == CF_422) {
+            planarYUYV422_to_planarYUYV422((char *)frame_, QCIF_WIDTH, QCIF_HEIGHT, (char *)fr, width_, height_);
+        } else {
+            planarYUYV420_to_planarYUYV420((char *)frame_, QCIF_WIDTH, QCIF_HEIGHT, (char *)fr, width_, height_);
+        }
+        break;
     }
-#endif
+
     suppress(frame_);
     saveblks(frame_);
     YuvFrame f(media_ts(), frame_, crvec_, outw_, outh_);



More information about the Sumover-dev mailing list