History

interface clean and inside modification

clean and comment some API. move the SKIP mv pred location remove the unused buffer in intra construction.

huili2 committed 12 years ago

Commit 32fd2c41 parent 42389009 files · +162 −185Browse files

Showing the changes to codec/decoder (7 of 9 files). Show all

Unified · Split

7 files
  1. codec/decoder/core/inc/mv_pred.h +8 −1
  2. codec/decoder/core/inc/parse_mb_syn_cavlc.h +0 −1
  3. codec/decoder/core/inc/wels_common_basis.h +0 −8
  4. codec/decoder/core/src/decode_slice.cpp +3 −13
  5. codec/decoder/core/src/decoder_core.cpp +0 −11
  6. codec/decoder/core/src/mv_pred.cpp +149 −0
  7. codec/decoder/core/src/parse_mb_syn_cavlc.cpp +0 −149
codec/decoder/core/inc/mv_pred.h+8−1
@@ -71,10 +71,17 @@ void_t UpdateP8x16MotionInfo (PDqLayer pCurDqLayer, int16_t iMotionVector[LIST_A · 70 unmodified lines
7171 int8_t iRefIndex[LIST_A][30],
7272 int32_t iPartIdx, int8_t iRef, int16_t iMVs[2]);
7373
74+/*!
75+ * \brief get the motion predictor for skip mode
76+ * \param
77+ * \param output iMvp[]
78+ */
79+void_t PredPSkipMvFromNeighbor (PDqLayer pCurLayer, int16_t iMvp[2]);
80+
7481 /*!
7582 * \brief get the motion predictor for 4*4 or 8*8 or 16*16 block
7683 * \param
77− * \param output mvp_x and mvp_y
84+ * \param output iMvp[]
7885 */
7986 void_t PredMv (int16_t iMotionVector[LIST_A][30][MV_A], int8_t iRefIndex[LIST_A][30],
8087 int32_t iPartIdx, int32_t iPartWidth, int8_t iRef, int16_t iMVP[2]);
codec/decoder/core/inc/parse_mb_syn_cavlc.h+0−1
@@ -143,7 +143,6 @@ void_t WelsFillCacheConstrain1Intra4x4 (PNeighAvail pNeighAvail, uint8_t* pNonZe · 142 unmodified lines
143143 void_t WelsFillCacheInter (PNeighAvail pNeighAvail, uint8_t* pNonZeroCount,
144144 int16_t iMvArray[LIST_A][30][MV_A], int8_t iRefIdxArray[LIST_A][30], PDqLayer pCurLayer);
145145
146−void_t PredPSkipMvFromNeighbor (PDqLayer pCurLayer, int16_t iMvp[2]);
147146
148147 /*!
149148 * \brief check iPredMode for intra16x16 eligible or not
codec/decoder/core/inc/wels_common_basis.h+0−8
@@ -155,14 +155,6 @@ SI_SLICE = 4, · 154 unmodified lines
155155 UNKNOWN_SLICE = 5
156156 } ESliceType;
157157
158−/* Slice Types in scalable extension */
159−typedef uint8_t SliceTypeExt;
160−enum {
161−EP_SLICE = 0, // EP_SLICE: 0, 5
162−EB_SLICE = 1, // EB_SLICE: 1, 6
163−EI_SLICE = 2 // EI_SLICE: 2, 7
164−};
165−
166158 /* List Index */
167159 typedef uint8_t ListIndex;
168160 enum {
codec/decoder/core/src/decode_slice.cpp+3−13
@@ -247,27 +247,17 @@ int32_t WelsMbIntraPredictionConstruction (PWelsDecoderContext pCtx, PDqLayer pC · 246 unmodified lines
247247 //seems IPCM should not enter this path
248248 int32_t iMbXy = pCurLayer->iMbXyIndex;
249249
250− FORCE_STACK_ALIGN_1D (int16_t, pTempScaledTCoeff, MB_COEFF_LIST_SIZE, 16);
251−
252− memcpy (pTempScaledTCoeff, pCurLayer->pScaledTCoeff[iMbXy], 384 * sizeof (pCurLayer->pScaledTCoeff[iMbXy][0]));
253−
254250 WelsFillRecNeededMbInfo (pCtx, bOutput, pCurLayer);
255251
256252 if (IS_INTRA16x16 (pCurLayer->pMbType[iMbXy])) {
257− int32_t i, j;
258− // really need?
259− for (i = 0; i < 16; i++) {
260− j = g_kuiLumaDcZigzagScan[i];
261− pTempScaledTCoeff[j] = pCurLayer->pScaledTCoeff[iMbXy][j];
262− }
263− WelsLumaDcDequantIdct (pTempScaledTCoeff, pCurLayer->pLumaQp[iMbXy]);
264− RecI16x16Mb (iMbXy, pCtx, pTempScaledTCoeff, pCurLayer);
253+ WelsLumaDcDequantIdct (pCurLayer->pScaledTCoeff[iMbXy], pCurLayer->pLumaQp[iMbXy]);
254+ RecI16x16Mb (iMbXy, pCtx, pCurLayer->pScaledTCoeff[iMbXy], pCurLayer);
265255
266256 return 0;
267257 }
268258
269259 if (IS_INTRA4x4 (pCurLayer->pMbType[iMbXy]))
270− RecI4x4Mb (iMbXy, pCtx, pTempScaledTCoeff, pCurLayer);
260+ RecI4x4Mb (iMbXy, pCtx, pCurLayer->pScaledTCoeff[iMbXy], pCurLayer);
271261
272262 return 0;
273263 }
codec/decoder/core/src/decoder_core.cpp+0−11
@@ -628,17 +628,6 @@ int32_t ParseSliceHeaderSyntaxs (PWelsDecoderContext pCtx, PBitStringAux pBs, co · 627 unmodified lines
628628 pSliceHead->uiRefCount[1] = pPps->uiNumRefIdxL1Active;
629629 if (kbExtensionFlag) {
630630 uiQualityId = pNalHeaderExt->uiQualityId;
631− if (BASE_QUALITY_ID == uiQualityId && (EP_SLICE == uiSliceType || EB_SLICE == uiSliceType)) {
632− const bool_t kbBipredFlag = (EB_SLICE == uiSliceType);
633− if (kbBipredFlag) {
634− WelsLog (pCtx, WELS_LOG_WARNING, "ParseSliceHeaderSyntaxs(): kbBipredFlag = 1 not supported.\n");
635− return GENERATE_ERROR_NO (ERR_LEVEL_SLICE_HEADER, ERR_INFO_UNSUPPORTED_BIPRED);
636− }
637− pSliceHead->bNumRefIdxActiveOverrideFlag = !!BsGetOneBit (pBs);
638− if (pSliceHead->bNumRefIdxActiveOverrideFlag) {
639− pSliceHead->uiRefCount[0] = 1 + BsGetUe (pBs);
640− }
641− }
642631 } else if (uiSliceType == P_SLICE || uiSliceType == SP_SLICE || uiSliceType == B_SLICE) {
643632 const bool_t kbBipredFlag = (B_SLICE == uiSliceType);
644633 if (kbBipredFlag) {
codec/decoder/core/src/mv_pred.cpp+149−0
@@ -43,6 +43,155 @@ · 42 unmodified lines
4343 #include "mb_cache.h"
4444
4545 namespace WelsDec {
46+void_t PredPSkipMvFromNeighbor (PDqLayer pCurLayer, int16_t iMvp[2]) {
47+ bool_t bTopAvail, bLeftTopAvail, bRightTopAvail, bLeftAvail;
48+
49+ int32_t iCurSliceIdc, iTopSliceIdc, iLeftTopSliceIdc, iRightTopSliceIdc, iLeftSliceIdc;
50+ int32_t iLeftTopType, iRightTopType, iTopType, iLeftType;
51+ int32_t iCurX, iCurY, iCurXy, iLeftXy, iTopXy, iLeftTopXy, iRightTopXy;
52+
53+ int8_t iLeftRef;
54+ int8_t iTopRef;
55+ int8_t iRightTopRef;
56+ int8_t iLeftTopRef;
57+ int8_t iDiagonalRef;
58+ int8_t iMatchRef;
59+ int16_t iMvA[2], iMvB[2], iMvC[2], iMvD[2];
60+
61+ iCurXy = pCurLayer->iMbXyIndex;
62+ iCurX = pCurLayer->iMbX;
63+ iCurY = pCurLayer->iMbY;
64+ iCurSliceIdc = pCurLayer->pSliceIdc[iCurXy];
65+
66+ if (iCurX != 0) {
67+ iLeftXy = iCurXy - 1;
68+ iLeftSliceIdc = pCurLayer->pSliceIdc[iLeftXy];
69+ bLeftAvail = (iLeftSliceIdc == iCurSliceIdc);
70+ } else {
71+ bLeftAvail = 0;
72+ bLeftTopAvail = 0;
73+ }
74+
75+ if (iCurY != 0) {
76+ iTopXy = iCurXy - pCurLayer->iMbWidth;
77+ iTopSliceIdc = pCurLayer->pSliceIdc[iTopXy];
78+ bTopAvail = (iTopSliceIdc == iCurSliceIdc);
79+ if (iCurX != 0) {
80+ iLeftTopXy = iTopXy - 1;
81+ iLeftTopSliceIdc = pCurLayer->pSliceIdc[iLeftTopXy];
82+ bLeftTopAvail = (iLeftTopSliceIdc == iCurSliceIdc);
83+ } else {
84+ bLeftTopAvail = 0;
85+ }
86+ if (iCurX != (pCurLayer->iMbWidth - 1)) {
87+ iRightTopXy = iTopXy + 1;
88+ iRightTopSliceIdc = pCurLayer->pSliceIdc[iRightTopXy];
89+ bRightTopAvail = (iRightTopSliceIdc == iCurSliceIdc);
90+ } else {
91+ bRightTopAvail = 0;
92+ }
93+ } else {
94+ bTopAvail = 0;
95+ bLeftTopAvail = 0;
96+ bRightTopAvail = 0;
97+ }
98+
99+ iLeftType = ((iCurX != 0 && bLeftAvail) ? pCurLayer->pMbType[iLeftXy] : 0);
100+ iTopType = ((iCurY != 0 && bTopAvail) ? pCurLayer->pMbType[iTopXy] : 0);
101+ iLeftTopType = ((iCurX != 0 && iCurY != 0 && bLeftTopAvail)
102+ ? pCurLayer->pMbType[iLeftTopXy] : 0);
103+ iRightTopType = ((iCurX != pCurLayer->iMbWidth - 1 && iCurY != 0 && bRightTopAvail)
104+ ? pCurLayer->pMbType[iRightTopXy] : 0);
105+
106+ /*get neb mv&iRefIdxArray*/
107+ /*left*/
108+ if (bLeftAvail && IS_INTER (iLeftType)) {
109+ ST32 (iMvA, LD32 (pCurLayer->pMv[0][iLeftXy][3]));
110+ iLeftRef = pCurLayer->pRefIndex[0][iLeftXy][3];
111+ } else {
112+ ST32 (iMvA, 0);
113+ if (0 == bLeftAvail) { //not available
114+ iLeftRef = REF_NOT_AVAIL;
115+ } else { //available but is intra mb type
116+ iLeftRef = REF_NOT_IN_LIST;
117+ }
118+ }
119+ if (REF_NOT_AVAIL == iLeftRef ||
120+ (0 == iLeftRef && 0 == * (int32_t*)iMvA)) {
121+ ST32 (iMvp, 0);
122+ return;
123+ }
124+
125+ /*top*/
126+ if (bTopAvail && IS_INTER (iTopType)) {
127+ ST32 (iMvB, LD32 (pCurLayer->pMv[0][iTopXy][12]));
128+ iTopRef = pCurLayer->pRefIndex[0][iTopXy][12];
129+ } else {
130+ ST32 (iMvB, 0);
131+ if (0 == bTopAvail) { //not available
132+ iTopRef = REF_NOT_AVAIL;
133+ } else { //available but is intra mb type
134+ iTopRef = REF_NOT_IN_LIST;
135+ }
136+ }
137+ if (REF_NOT_AVAIL == iTopRef ||
138+ (0 == iTopRef && 0 == * (int32_t*)iMvB)) {
139+ ST32 (iMvp, 0);
140+ return;
141+ }
142+
143+ /*right_top*/
144+ if (bRightTopAvail && IS_INTER (iRightTopType)) {
145+ ST32 (iMvC, LD32 (pCurLayer->pMv[0][iRightTopXy][12]));
146+ iRightTopRef = pCurLayer->pRefIndex[0][iRightTopXy][12];
147+ } else {
148+ ST32 (iMvC, 0);
149+ if (0 == bRightTopAvail) { //not available
150+ iRightTopRef = REF_NOT_AVAIL;
151+ } else { //available but is intra mb type
152+ iRightTopRef = REF_NOT_IN_LIST;
153+ }
154+ }
155+
156+ /*left_top*/
157+ if (bLeftTopAvail && IS_INTER (iLeftTopType)) {
158+ ST32 (iMvD, LD32 (pCurLayer->pMv[0][iLeftTopXy][15]));
159+ iLeftTopRef = pCurLayer->pRefIndex[0][iLeftTopXy][15];
160+ } else {
161+ ST32 (iMvD, 0);
162+ if (0 == bLeftTopAvail) { //not available
163+ iLeftTopRef = REF_NOT_AVAIL;
164+ } else { //available but is intra mb type
165+ iLeftTopRef = REF_NOT_IN_LIST;
166+ }
167+ }
168+
169+ iDiagonalRef = iRightTopRef;
170+ if (REF_NOT_AVAIL == iDiagonalRef) {
171+ iDiagonalRef = iLeftTopRef;
172+ * (int32_t*)iMvC = * (int32_t*)iMvD;
173+ }
174+
175+ if (REF_NOT_AVAIL == iTopRef && REF_NOT_AVAIL == iDiagonalRef && iLeftRef >= REF_NOT_IN_LIST) {
176+ ST32 (iMvp, LD32 (iMvA));
177+ return;
178+ }
179+
180+ iMatchRef = (0 == iLeftRef) + (0 == iTopRef) + (0 == iDiagonalRef);
181+ if (1 == iMatchRef) {
182+ if (0 == iLeftRef) {
183+ ST32 (iMvp, LD32 (iMvA));
184+ } else if (0 == iTopRef) {
185+ ST32 (iMvp, LD32 (iMvB));
186+ } else {
187+ ST32 (iMvp, LD32 (iMvC));
188+ }
189+ } else {
190+ iMvp[0] = WelsMedian (iMvA[0], iMvB[0], iMvC[0]);
191+ iMvp[1] = WelsMedian (iMvA[1], iMvB[1], iMvC[1]);
192+ }
193+}
194+
46195
47196 //basic iMVs prediction unit for iMVs partition width (4, 2, 1)
48197 void_t PredMv (int16_t iMotionVector[LIST_A][30][MV_A], int8_t iRefIndex[LIST_A][30],
codec/decoder/core/src/parse_mb_syn_cavlc.cpp+0−149
@@ -52,155 +52,6 @@ · 51 unmodified lines
5252
5353 namespace WelsDec {
5454
55−void_t PredPSkipMvFromNeighbor (PDqLayer pCurLayer, int16_t iMvp[2]) {
56− bool_t bTopAvail, bLeftTopAvail, bRightTopAvail, bLeftAvail;
57−
58− int32_t iCurSliceIdc, iTopSliceIdc, iLeftTopSliceIdc, iRightTopSliceIdc, iLeftSliceIdc;
59− int32_t iLeftTopType, iRightTopType, iTopType, iLeftType;
60− int32_t iCurX, iCurY, iCurXy, iLeftXy, iTopXy, iLeftTopXy, iRightTopXy;
61−
62− int8_t iLeftRef;
63− int8_t iTopRef;
64− int8_t iRightTopRef;
65− int8_t iLeftTopRef;
66− int8_t iDiagonalRef;
67− int8_t iMatchRef;
68− int16_t iMvA[2], iMvB[2], iMvC[2], iMvD[2];
69−
70− iCurXy = pCurLayer->iMbXyIndex;
71− iCurX = pCurLayer->iMbX;
72− iCurY = pCurLayer->iMbY;
73− iCurSliceIdc = pCurLayer->pSliceIdc[iCurXy];
74−
75− if (iCurX != 0) {
76− iLeftXy = iCurXy - 1;
77− iLeftSliceIdc = pCurLayer->pSliceIdc[iLeftXy];
78− bLeftAvail = (iLeftSliceIdc == iCurSliceIdc);
79− } else {
80− bLeftAvail = 0;
81− bLeftTopAvail = 0;
82− }
83−
84− if (iCurY != 0) {
85− iTopXy = iCurXy - pCurLayer->iMbWidth;
86− iTopSliceIdc = pCurLayer->pSliceIdc[iTopXy];
87− bTopAvail = (iTopSliceIdc == iCurSliceIdc);
88− if (iCurX != 0) {
89− iLeftTopXy = iTopXy - 1;
90− iLeftTopSliceIdc = pCurLayer->pSliceIdc[iLeftTopXy];
91− bLeftTopAvail = (iLeftTopSliceIdc == iCurSliceIdc);
92− } else {
93− bLeftTopAvail = 0;
94− }
95− if (iCurX != (pCurLayer->iMbWidth - 1)) {
96− iRightTopXy = iTopXy + 1;
97− iRightTopSliceIdc = pCurLayer->pSliceIdc[iRightTopXy];
98− bRightTopAvail = (iRightTopSliceIdc == iCurSliceIdc);
99− } else {
100− bRightTopAvail = 0;
101− }
102− } else {
103− bTopAvail = 0;
104− bLeftTopAvail = 0;
105− bRightTopAvail = 0;
106− }
107−
108− iLeftType = ((iCurX != 0 && bLeftAvail) ? pCurLayer->pMbType[iLeftXy] : 0);
109− iTopType = ((iCurY != 0 && bTopAvail) ? pCurLayer->pMbType[iTopXy] : 0);
110− iLeftTopType = ((iCurX != 0 && iCurY != 0 && bLeftTopAvail)
111− ? pCurLayer->pMbType[iLeftTopXy] : 0);
112− iRightTopType = ((iCurX != pCurLayer->iMbWidth - 1 && iCurY != 0 && bRightTopAvail)
113− ? pCurLayer->pMbType[iRightTopXy] : 0);
114−
115− /*get neb mv&iRefIdxArray*/
116− /*left*/
117− if (bLeftAvail && IS_INTER (iLeftType)) {
118− ST32 (iMvA, LD32 (pCurLayer->pMv[0][iLeftXy][3]));
119− iLeftRef = pCurLayer->pRefIndex[0][iLeftXy][3];
120− } else {
121− ST32 (iMvA, 0);
122− if (0 == bLeftAvail) { //not available
123− iLeftRef = REF_NOT_AVAIL;
124− } else { //available but is intra mb type
125− iLeftRef = REF_NOT_IN_LIST;
126− }
127− }
128− if (REF_NOT_AVAIL == iLeftRef ||
129− (0 == iLeftRef && 0 == * (int32_t*)iMvA)) {
130− ST32 (iMvp, 0);
131− return;
132− }
133−
134− /*top*/
135− if (bTopAvail && IS_INTER (iTopType)) {
136− ST32 (iMvB, LD32 (pCurLayer->pMv[0][iTopXy][12]));
137− iTopRef = pCurLayer->pRefIndex[0][iTopXy][12];
138− } else {
139− ST32 (iMvB, 0);
140− if (0 == bTopAvail) { //not available
141− iTopRef = REF_NOT_AVAIL;
142− } else { //available but is intra mb type
143− iTopRef = REF_NOT_IN_LIST;
144− }
145− }
146− if (REF_NOT_AVAIL == iTopRef ||
147− (0 == iTopRef && 0 == * (int32_t*)iMvB)) {
148− ST32 (iMvp, 0);
149− return;
150− }
151−
152− /*right_top*/
153− if (bRightTopAvail && IS_INTER (iRightTopType)) {
154− ST32 (iMvC, LD32 (pCurLayer->pMv[0][iRightTopXy][12]));
155− iRightTopRef = pCurLayer->pRefIndex[0][iRightTopXy][12];
156− } else {
157− ST32 (iMvC, 0);
158− if (0 == bRightTopAvail) { //not available
159− iRightTopRef = REF_NOT_AVAIL;
160− } else { //available but is intra mb type
161− iRightTopRef = REF_NOT_IN_LIST;
162− }
163− }
164−
165− /*left_top*/
166− if (bLeftTopAvail && IS_INTER (iLeftTopType)) {
167− ST32 (iMvD, LD32 (pCurLayer->pMv[0][iLeftTopXy][15]));
168− iLeftTopRef = pCurLayer->pRefIndex[0][iLeftTopXy][15];
169− } else {
170− ST32 (iMvD, 0);
171− if (0 == bLeftTopAvail) { //not available
172− iLeftTopRef = REF_NOT_AVAIL;
173− } else { //available but is intra mb type
174− iLeftTopRef = REF_NOT_IN_LIST;
175− }
176− }
177−
178− iDiagonalRef = iRightTopRef;
179− if (REF_NOT_AVAIL == iDiagonalRef) {
180− iDiagonalRef = iLeftTopRef;
181− * (int32_t*)iMvC = * (int32_t*)iMvD;
182− }
183−
184− if (REF_NOT_AVAIL == iTopRef && REF_NOT_AVAIL == iDiagonalRef && iLeftRef >= REF_NOT_IN_LIST) {
185− ST32 (iMvp, LD32 (iMvA));
186− return;
187− }
188−
189− iMatchRef = (0 == iLeftRef) + (0 == iTopRef) + (0 == iDiagonalRef);
190− if (1 == iMatchRef) {
191− if (0 == iLeftRef) {
192− ST32 (iMvp, LD32 (iMvA));
193− } else if (0 == iTopRef) {
194− ST32 (iMvp, LD32 (iMvB));
195− } else {
196− ST32 (iMvp, LD32 (iMvC));
197− }
198− } else {
199− iMvp[0] = WelsMedian (iMvA[0], iMvB[0], iMvC[0]);
200− iMvp[1] = WelsMedian (iMvA[1], iMvB[1], iMvC[1]);
201− }
202−}
203−
20455 void_t GetNeighborAvailMbType (PNeighAvail pNeighAvail, PDqLayer pCurLayer) {
20556 int32_t iCurSliceIdc, iTopSliceIdc, iLeftTopSliceIdc, iRightTopSliceIdc, iLeftSliceIdc;
20657 int32_t iCurXy, iTopXy, iLeftXy, iLeftTopXy, iRightTopXy;

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t