shithub: openh264

Download patch

ref: e801b58bf8a91184b523658164aef31850efaa6f
parent: dd3466cc6b81c74e605bf66488d5d4fbdd701888
parent: 32fd2c4e4d2fc895ca18901c096f0dd488e355d5
author: Ethan Hugg <ethanhugg@gmail.com>
date: Mon Jan 6 06:02:49 EST 2014

Merge pull request #110 from huili2/master

interface clean and inside modification

--- a/codec/api/svc/codec_api.h
+++ b/codec/api/svc/codec_api.h
@@ -94,6 +94,7 @@
 
   /*
    *  src must be 4 byte aligned,   recommend 16 byte aligned.    the available src size must be multiple of 4.
+   *  this API does not work for now!! This is for future use to support non-I420 color format output.
    */
   virtual DECODING_STATE DecodeFrameEx (const unsigned char* pSrc,
                                         const int iSrcLen,
--- a/codec/api/svc/codec_app_def.h
+++ b/codec/api/svc/codec_app_def.h
@@ -91,10 +91,9 @@
   ENCODER_OPTION_CURRENT_PATH
 } ENCODER_OPTION;
 
-/* Option types introduced in SVC decoder application */
+/* Option types introduced in decoder application */
 typedef enum {
   DECODER_OPTION_DATAFORMAT = 0,	/* Set color space of decoding output frame */
-  DECODER_OPTION_TRUNCATED_MODE,	/* Used in decoding bitstream of non integrated frame, only truncated working mode is supported by tune, so skip it */
   DECODER_OPTION_END_OF_STREAM,	/* Indicate bitstream of the final frame to be decoded */
   DECODER_OPTION_VCL_NAL,        //feedback whether or not have VCL NAL in current AU for application layer
   DECODER_OPTION_TEMPORAL_ID,      //feedback temporal id for application layer
--- a/codec/decoder/core/inc/mv_pred.h
+++ b/codec/decoder/core/inc/mv_pred.h
@@ -72,9 +72,16 @@
                               int32_t iPartIdx, int8_t iRef, int16_t iMVs[2]);
 
 /*!
+ * \brief   get the motion predictor for skip mode
+ * \param
+ * \param 	output iMvp[]
+ */
+void_t PredPSkipMvFromNeighbor (PDqLayer pCurLayer, int16_t iMvp[2]);
+
+/*!
  * \brief   get the motion predictor for 4*4 or 8*8 or 16*16 block
  * \param
- * \param 	output mvp_x and mvp_y
+ * \param 	output iMvp[]
  */
 void_t PredMv (int16_t iMotionVector[LIST_A][30][MV_A], int8_t iRefIndex[LIST_A][30],
                int32_t iPartIdx, int32_t iPartWidth, int8_t iRef, int16_t iMVP[2]);
--- a/codec/decoder/core/inc/parse_mb_syn_cavlc.h
+++ b/codec/decoder/core/inc/parse_mb_syn_cavlc.h
@@ -143,7 +143,6 @@
 void_t WelsFillCacheInter (PNeighAvail pNeighAvail, uint8_t* pNonZeroCount,
                            int16_t iMvArray[LIST_A][30][MV_A], int8_t iRefIdxArray[LIST_A][30], PDqLayer pCurLayer);
 
-void_t PredPSkipMvFromNeighbor (PDqLayer pCurLayer, int16_t iMvp[2]);
 
 /*!
  * \brief   check iPredMode for intra16x16 eligible or not
--- a/codec/decoder/core/inc/wels_common_basis.h
+++ b/codec/decoder/core/inc/wels_common_basis.h
@@ -155,14 +155,6 @@
 UNKNOWN_SLICE = 5
 } ESliceType;
 
-/* Slice Types in scalable extension */
-typedef uint8_t		SliceTypeExt;
-enum {
-EP_SLICE = 0,	// EP_SLICE: 0, 5
-EB_SLICE = 1,	// EB_SLICE: 1, 6
-EI_SLICE = 2	// EI_SLICE: 2, 7
-};
-
 /* List Index */
 typedef uint8_t		ListIndex;
 enum {
--- a/codec/decoder/core/src/decode_slice.cpp
+++ b/codec/decoder/core/src/decode_slice.cpp
@@ -247,27 +247,17 @@
 //seems IPCM should not enter this path
   int32_t iMbXy = pCurLayer->iMbXyIndex;
 
-  FORCE_STACK_ALIGN_1D (int16_t, pTempScaledTCoeff, MB_COEFF_LIST_SIZE, 16);
-
-  memcpy (pTempScaledTCoeff, pCurLayer->pScaledTCoeff[iMbXy], 384 * sizeof (pCurLayer->pScaledTCoeff[iMbXy][0]));
-
   WelsFillRecNeededMbInfo (pCtx, bOutput, pCurLayer);
 
   if (IS_INTRA16x16 (pCurLayer->pMbType[iMbXy])) {
-    int32_t i, j;
-    // really need?
-    for (i = 0; i < 16; i++) {
-      j = g_kuiLumaDcZigzagScan[i];
-      pTempScaledTCoeff[j] = pCurLayer->pScaledTCoeff[iMbXy][j];
-    }
-    WelsLumaDcDequantIdct (pTempScaledTCoeff, pCurLayer->pLumaQp[iMbXy]);
-    RecI16x16Mb (iMbXy, pCtx, pTempScaledTCoeff, pCurLayer);
+    WelsLumaDcDequantIdct (pCurLayer->pScaledTCoeff[iMbXy], pCurLayer->pLumaQp[iMbXy]);
+    RecI16x16Mb (iMbXy, pCtx, pCurLayer->pScaledTCoeff[iMbXy], pCurLayer);
 
     return 0;
   }
 
   if (IS_INTRA4x4 (pCurLayer->pMbType[iMbXy]))
-    RecI4x4Mb (iMbXy, pCtx, pTempScaledTCoeff, pCurLayer);
+    RecI4x4Mb (iMbXy, pCtx, pCurLayer->pScaledTCoeff[iMbXy], pCurLayer);
 
   return 0;
 }
--- a/codec/decoder/core/src/decoder_core.cpp
+++ b/codec/decoder/core/src/decoder_core.cpp
@@ -628,17 +628,6 @@
   pSliceHead->uiRefCount[1]	= pPps->uiNumRefIdxL1Active;
   if (kbExtensionFlag) {
     uiQualityId = pNalHeaderExt->uiQualityId;
-    if (BASE_QUALITY_ID == uiQualityId && (EP_SLICE == uiSliceType || EB_SLICE == uiSliceType)) {
-      const bool_t kbBipredFlag = (EB_SLICE == uiSliceType);
-      if (kbBipredFlag) {
-        WelsLog (pCtx, WELS_LOG_WARNING, "ParseSliceHeaderSyntaxs(): kbBipredFlag = 1 not supported.\n");
-        return GENERATE_ERROR_NO (ERR_LEVEL_SLICE_HEADER, ERR_INFO_UNSUPPORTED_BIPRED);
-      }
-      pSliceHead->bNumRefIdxActiveOverrideFlag	= !!BsGetOneBit (pBs);
-      if (pSliceHead->bNumRefIdxActiveOverrideFlag) {
-        pSliceHead->uiRefCount[0]	= 1 + BsGetUe (pBs);
-      }
-    }
   } else if (uiSliceType == P_SLICE || uiSliceType == SP_SLICE || uiSliceType == B_SLICE) {
     const bool_t kbBipredFlag = (B_SLICE == uiSliceType);
     if (kbBipredFlag) {
--- a/codec/decoder/core/src/mv_pred.cpp
+++ b/codec/decoder/core/src/mv_pred.cpp
@@ -43,6 +43,155 @@
 #include "mb_cache.h"
 
 namespace WelsDec {
+void_t PredPSkipMvFromNeighbor (PDqLayer pCurLayer, int16_t iMvp[2]) {
+  bool_t bTopAvail, bLeftTopAvail, bRightTopAvail, bLeftAvail;
+
+  int32_t iCurSliceIdc, iTopSliceIdc, iLeftTopSliceIdc, iRightTopSliceIdc, iLeftSliceIdc;
+  int32_t iLeftTopType, iRightTopType, iTopType, iLeftType;
+  int32_t iCurX, iCurY, iCurXy, iLeftXy, iTopXy, iLeftTopXy, iRightTopXy;
+
+  int8_t iLeftRef;
+  int8_t iTopRef;
+  int8_t iRightTopRef;
+  int8_t iLeftTopRef;
+  int8_t iDiagonalRef;
+  int8_t iMatchRef;
+  int16_t iMvA[2], iMvB[2], iMvC[2], iMvD[2];
+
+  iCurXy = pCurLayer->iMbXyIndex;
+  iCurX  = pCurLayer->iMbX;
+  iCurY  = pCurLayer->iMbY;
+  iCurSliceIdc = pCurLayer->pSliceIdc[iCurXy];
+
+  if (iCurX != 0) {
+    iLeftXy = iCurXy - 1;
+    iLeftSliceIdc = pCurLayer->pSliceIdc[iLeftXy];
+    bLeftAvail = (iLeftSliceIdc == iCurSliceIdc);
+  } else {
+    bLeftAvail = 0;
+    bLeftTopAvail = 0;
+  }
+
+  if (iCurY != 0) {
+    iTopXy = iCurXy - pCurLayer->iMbWidth;
+    iTopSliceIdc = pCurLayer->pSliceIdc[iTopXy];
+    bTopAvail = (iTopSliceIdc == iCurSliceIdc);
+    if (iCurX != 0) {
+      iLeftTopXy = iTopXy - 1;
+      iLeftTopSliceIdc = pCurLayer->pSliceIdc[iLeftTopXy];
+      bLeftTopAvail = (iLeftTopSliceIdc  == iCurSliceIdc);
+    } else {
+      bLeftTopAvail = 0;
+    }
+    if (iCurX != (pCurLayer->iMbWidth - 1)) {
+      iRightTopXy = iTopXy + 1;
+      iRightTopSliceIdc = pCurLayer->pSliceIdc[iRightTopXy];
+      bRightTopAvail = (iRightTopSliceIdc == iCurSliceIdc);
+    } else {
+      bRightTopAvail = 0;
+    }
+  } else {
+    bTopAvail = 0;
+    bLeftTopAvail = 0;
+    bRightTopAvail = 0;
+  }
+
+  iLeftType = ((iCurX != 0 && bLeftAvail) ? pCurLayer->pMbType[iLeftXy] : 0);
+  iTopType = ((iCurY != 0 && bTopAvail) ? pCurLayer->pMbType[iTopXy] : 0);
+  iLeftTopType = ((iCurX != 0 && iCurY != 0 && bLeftTopAvail)
+                  ? pCurLayer->pMbType[iLeftTopXy] : 0);
+  iRightTopType = ((iCurX != pCurLayer->iMbWidth - 1 && iCurY != 0 && bRightTopAvail)
+                   ? pCurLayer->pMbType[iRightTopXy] : 0);
+
+  /*get neb mv&iRefIdxArray*/
+  /*left*/
+  if (bLeftAvail && IS_INTER (iLeftType)) {
+    ST32 (iMvA, LD32 (pCurLayer->pMv[0][iLeftXy][3]));
+    iLeftRef = pCurLayer->pRefIndex[0][iLeftXy][3];
+  } else {
+    ST32 (iMvA, 0);
+    if (0 == bLeftAvail) { //not available
+      iLeftRef = REF_NOT_AVAIL;
+    } else { //available but is intra mb type
+      iLeftRef = REF_NOT_IN_LIST;
+    }
+  }
+  if (REF_NOT_AVAIL == iLeftRef ||
+      (0 == iLeftRef && 0 == * (int32_t*)iMvA)) {
+    ST32 (iMvp, 0);
+    return;
+  }
+
+  /*top*/
+  if (bTopAvail && IS_INTER (iTopType)) {
+    ST32 (iMvB, LD32 (pCurLayer->pMv[0][iTopXy][12]));
+    iTopRef = pCurLayer->pRefIndex[0][iTopXy][12];
+  } else {
+    ST32 (iMvB, 0);
+    if (0 == bTopAvail) { //not available
+      iTopRef = REF_NOT_AVAIL;
+    } else { //available but is intra mb type
+      iTopRef = REF_NOT_IN_LIST;
+    }
+  }
+  if (REF_NOT_AVAIL == iTopRef ||
+      (0 == iTopRef  && 0 == * (int32_t*)iMvB)) {
+    ST32 (iMvp, 0);
+    return;
+  }
+
+  /*right_top*/
+  if (bRightTopAvail && IS_INTER (iRightTopType)) {
+    ST32 (iMvC, LD32 (pCurLayer->pMv[0][iRightTopXy][12]));
+    iRightTopRef = pCurLayer->pRefIndex[0][iRightTopXy][12];
+  } else {
+    ST32 (iMvC, 0);
+    if (0 == bRightTopAvail) { //not available
+      iRightTopRef = REF_NOT_AVAIL;
+    } else { //available but is intra mb type
+      iRightTopRef = REF_NOT_IN_LIST;
+    }
+  }
+
+  /*left_top*/
+  if (bLeftTopAvail && IS_INTER (iLeftTopType)) {
+    ST32 (iMvD, LD32 (pCurLayer->pMv[0][iLeftTopXy][15]));
+    iLeftTopRef = pCurLayer->pRefIndex[0][iLeftTopXy][15];
+  } else {
+    ST32 (iMvD, 0);
+    if (0 == bLeftTopAvail) { //not available
+      iLeftTopRef = REF_NOT_AVAIL;
+    } else { //available but is intra mb type
+      iLeftTopRef = REF_NOT_IN_LIST;
+    }
+  }
+
+  iDiagonalRef = iRightTopRef;
+  if (REF_NOT_AVAIL == iDiagonalRef) {
+    iDiagonalRef = iLeftTopRef;
+    * (int32_t*)iMvC = * (int32_t*)iMvD;
+  }
+
+  if (REF_NOT_AVAIL == iTopRef && REF_NOT_AVAIL == iDiagonalRef && iLeftRef >= REF_NOT_IN_LIST) {
+    ST32 (iMvp, LD32 (iMvA));
+    return;
+  }
+
+  iMatchRef = (0 == iLeftRef) + (0 == iTopRef) + (0 == iDiagonalRef);
+  if (1 == iMatchRef) {
+    if (0 == iLeftRef) {
+      ST32 (iMvp, LD32 (iMvA));
+    } else if (0 == iTopRef) {
+      ST32 (iMvp, LD32 (iMvB));
+    } else {
+      ST32 (iMvp, LD32 (iMvC));
+    }
+  } else {
+    iMvp[0] = WelsMedian (iMvA[0], iMvB[0], iMvC[0]);
+    iMvp[1] = WelsMedian (iMvA[1], iMvB[1], iMvC[1]);
+  }
+}
+
 
 //basic iMVs prediction unit for iMVs partition width (4, 2, 1)
 void_t PredMv (int16_t iMotionVector[LIST_A][30][MV_A], int8_t iRefIndex[LIST_A][30],
--- a/codec/decoder/core/src/parse_mb_syn_cavlc.cpp
+++ b/codec/decoder/core/src/parse_mb_syn_cavlc.cpp
@@ -52,155 +52,6 @@
 
 namespace WelsDec {
 
-void_t PredPSkipMvFromNeighbor (PDqLayer pCurLayer, int16_t iMvp[2]) {
-  bool_t bTopAvail, bLeftTopAvail, bRightTopAvail, bLeftAvail;
-
-  int32_t iCurSliceIdc, iTopSliceIdc, iLeftTopSliceIdc, iRightTopSliceIdc, iLeftSliceIdc;
-  int32_t iLeftTopType, iRightTopType, iTopType, iLeftType;
-  int32_t iCurX, iCurY, iCurXy, iLeftXy, iTopXy, iLeftTopXy, iRightTopXy;
-
-  int8_t iLeftRef;
-  int8_t iTopRef;
-  int8_t iRightTopRef;
-  int8_t iLeftTopRef;
-  int8_t iDiagonalRef;
-  int8_t iMatchRef;
-  int16_t iMvA[2], iMvB[2], iMvC[2], iMvD[2];
-
-  iCurXy = pCurLayer->iMbXyIndex;
-  iCurX  = pCurLayer->iMbX;
-  iCurY  = pCurLayer->iMbY;
-  iCurSliceIdc = pCurLayer->pSliceIdc[iCurXy];
-
-  if (iCurX != 0) {
-    iLeftXy = iCurXy - 1;
-    iLeftSliceIdc = pCurLayer->pSliceIdc[iLeftXy];
-    bLeftAvail = (iLeftSliceIdc == iCurSliceIdc);
-  } else {
-    bLeftAvail = 0;
-    bLeftTopAvail = 0;
-  }
-
-  if (iCurY != 0) {
-    iTopXy = iCurXy - pCurLayer->iMbWidth;
-    iTopSliceIdc = pCurLayer->pSliceIdc[iTopXy];
-    bTopAvail = (iTopSliceIdc == iCurSliceIdc);
-    if (iCurX != 0) {
-      iLeftTopXy = iTopXy - 1;
-      iLeftTopSliceIdc = pCurLayer->pSliceIdc[iLeftTopXy];
-      bLeftTopAvail = (iLeftTopSliceIdc  == iCurSliceIdc);
-    } else {
-      bLeftTopAvail = 0;
-    }
-    if (iCurX != (pCurLayer->iMbWidth - 1)) {
-      iRightTopXy = iTopXy + 1;
-      iRightTopSliceIdc = pCurLayer->pSliceIdc[iRightTopXy];
-      bRightTopAvail = (iRightTopSliceIdc == iCurSliceIdc);
-    } else {
-      bRightTopAvail = 0;
-    }
-  } else {
-    bTopAvail = 0;
-    bLeftTopAvail = 0;
-    bRightTopAvail = 0;
-  }
-
-  iLeftType = ((iCurX != 0 && bLeftAvail) ? pCurLayer->pMbType[iLeftXy] : 0);
-  iTopType = ((iCurY != 0 && bTopAvail) ? pCurLayer->pMbType[iTopXy] : 0);
-  iLeftTopType = ((iCurX != 0 && iCurY != 0 && bLeftTopAvail)
-                  ? pCurLayer->pMbType[iLeftTopXy] : 0);
-  iRightTopType = ((iCurX != pCurLayer->iMbWidth - 1 && iCurY != 0 && bRightTopAvail)
-                   ? pCurLayer->pMbType[iRightTopXy] : 0);
-
-  /*get neb mv&iRefIdxArray*/
-  /*left*/
-  if (bLeftAvail && IS_INTER (iLeftType)) {
-    ST32 (iMvA, LD32 (pCurLayer->pMv[0][iLeftXy][3]));
-    iLeftRef = pCurLayer->pRefIndex[0][iLeftXy][3];
-  } else {
-    ST32 (iMvA, 0);
-    if (0 == bLeftAvail) { //not available
-      iLeftRef = REF_NOT_AVAIL;
-    } else { //available but is intra mb type
-      iLeftRef = REF_NOT_IN_LIST;
-    }
-  }
-  if (REF_NOT_AVAIL == iLeftRef ||
-      (0 == iLeftRef && 0 == * (int32_t*)iMvA)) {
-    ST32 (iMvp, 0);
-    return;
-  }
-
-  /*top*/
-  if (bTopAvail && IS_INTER (iTopType)) {
-    ST32 (iMvB, LD32 (pCurLayer->pMv[0][iTopXy][12]));
-    iTopRef = pCurLayer->pRefIndex[0][iTopXy][12];
-  } else {
-    ST32 (iMvB, 0);
-    if (0 == bTopAvail) { //not available
-      iTopRef = REF_NOT_AVAIL;
-    } else { //available but is intra mb type
-      iTopRef = REF_NOT_IN_LIST;
-    }
-  }
-  if (REF_NOT_AVAIL == iTopRef ||
-      (0 == iTopRef  && 0 == * (int32_t*)iMvB)) {
-    ST32 (iMvp, 0);
-    return;
-  }
-
-  /*right_top*/
-  if (bRightTopAvail && IS_INTER (iRightTopType)) {
-    ST32 (iMvC, LD32 (pCurLayer->pMv[0][iRightTopXy][12]));
-    iRightTopRef = pCurLayer->pRefIndex[0][iRightTopXy][12];
-  } else {
-    ST32 (iMvC, 0);
-    if (0 == bRightTopAvail) { //not available
-      iRightTopRef = REF_NOT_AVAIL;
-    } else { //available but is intra mb type
-      iRightTopRef = REF_NOT_IN_LIST;
-    }
-  }
-
-  /*left_top*/
-  if (bLeftTopAvail && IS_INTER (iLeftTopType)) {
-    ST32 (iMvD, LD32 (pCurLayer->pMv[0][iLeftTopXy][15]));
-    iLeftTopRef = pCurLayer->pRefIndex[0][iLeftTopXy][15];
-  } else {
-    ST32 (iMvD, 0);
-    if (0 == bLeftTopAvail) { //not available
-      iLeftTopRef = REF_NOT_AVAIL;
-    } else { //available but is intra mb type
-      iLeftTopRef = REF_NOT_IN_LIST;
-    }
-  }
-
-  iDiagonalRef = iRightTopRef;
-  if (REF_NOT_AVAIL == iDiagonalRef) {
-    iDiagonalRef = iLeftTopRef;
-    * (int32_t*)iMvC = * (int32_t*)iMvD;
-  }
-
-  if (REF_NOT_AVAIL == iTopRef && REF_NOT_AVAIL == iDiagonalRef && iLeftRef >= REF_NOT_IN_LIST) {
-    ST32 (iMvp, LD32 (iMvA));
-    return;
-  }
-
-  iMatchRef = (0 == iLeftRef) + (0 == iTopRef) + (0 == iDiagonalRef);
-  if (1 == iMatchRef) {
-    if (0 == iLeftRef) {
-      ST32 (iMvp, LD32 (iMvA));
-    } else if (0 == iTopRef) {
-      ST32 (iMvp, LD32 (iMvB));
-    } else {
-      ST32 (iMvp, LD32 (iMvC));
-    }
-  } else {
-    iMvp[0] = WelsMedian (iMvA[0], iMvB[0], iMvC[0]);
-    iMvp[1] = WelsMedian (iMvA[1], iMvB[1], iMvC[1]);
-  }
-}
-
 void_t GetNeighborAvailMbType (PNeighAvail pNeighAvail, PDqLayer pCurLayer) {
   int32_t iCurSliceIdc, iTopSliceIdc, iLeftTopSliceIdc, iRightTopSliceIdc, iLeftSliceIdc;
   int32_t iCurXy, iTopXy, iLeftXy, iLeftTopXy, iRightTopXy;