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/core/src (4 of 9 files). Show all

Unified · Split

4 files
  1. codec/decoder/core/src/decode_slice.cpp +3 −13
  2. codec/decoder/core/src/decoder_core.cpp +0 −11
  3. codec/decoder/core/src/mv_pred.cpp +149 −0
  4. codec/decoder/core/src/parse_mb_syn_cavlc.cpp +0 −149
codec/decoder/core/src/decode_slice.cpp+3−13
@@ -247,27 +247,17 @@ int32_t WelsMbIntraPredictionConstruction (PWelsDecoderContext pCtx, PDqLayer pC · 246 unmodified lines
247//seems IPCM should not enter this path247//seems IPCM should not enter this path
248 int32_t iMbXy = pCurLayer->iMbXyIndex;248 int32_t iMbXy = pCurLayer->iMbXyIndex;
249 249
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
254 WelsFillRecNeededMbInfo (pCtx, bOutput, pCurLayer);250 WelsFillRecNeededMbInfo (pCtx, bOutput, pCurLayer);
255 251
256 if (IS_INTRA16x16 (pCurLayer->pMbType[iMbXy])) {252 if (IS_INTRA16x16 (pCurLayer->pMbType[iMbXy])) {
257 int32_t i, j;253 WelsLumaDcDequantIdct (pCurLayer->pScaledTCoeff[iMbXy], pCurLayer->pLumaQp[iMbXy]);
258 // really need?254 RecI16x16Mb (iMbXy, pCtx, pCurLayer->pScaledTCoeff[iMbXy], pCurLayer);
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);
265 255
266 return 0;256 return 0;
267 }257 }
268 258
269 if (IS_INTRA4x4 (pCurLayer->pMbType[iMbXy]))259 if (IS_INTRA4x4 (pCurLayer->pMbType[iMbXy]))
270 RecI4x4Mb (iMbXy, pCtx, pTempScaledTCoeff, pCurLayer);260 RecI4x4Mb (iMbXy, pCtx, pCurLayer->pScaledTCoeff[iMbXy], pCurLayer);
271 261
272 return 0;262 return 0;
273}263}
codec/decoder/core/src/decoder_core.cpp+0−11
@@ -628,17 +628,6 @@ int32_t ParseSliceHeaderSyntaxs (PWelsDecoderContext pCtx, PBitStringAux pBs, co · 627 unmodified lines
628 pSliceHead->uiRefCount[1] = pPps->uiNumRefIdxL1Active;628 pSliceHead->uiRefCount[1] = pPps->uiNumRefIdxL1Active;
629 if (kbExtensionFlag) {629 if (kbExtensionFlag) {
630 uiQualityId = pNalHeaderExt->uiQualityId;630 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 }
642 } else if (uiSliceType == P_SLICE || uiSliceType == SP_SLICE || uiSliceType == B_SLICE) {631 } else if (uiSliceType == P_SLICE || uiSliceType == SP_SLICE || uiSliceType == B_SLICE) {
643 const bool_t kbBipredFlag = (B_SLICE == uiSliceType);632 const bool_t kbBipredFlag = (B_SLICE == uiSliceType);
644 if (kbBipredFlag) {633 if (kbBipredFlag) {
codec/decoder/core/src/mv_pred.cpp+149−0
@@ -43,6 +43,155 @@ · 42 unmodified lines
43#include "mb_cache.h"43#include "mb_cache.h"
44 44
45namespace WelsDec {45namespace WelsDec {
46void_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
46 195
47//basic iMVs prediction unit for iMVs partition width (4, 2, 1)196//basic iMVs prediction unit for iMVs partition width (4, 2, 1)
48void_t PredMv (int16_t iMotionVector[LIST_A][30][MV_A], int8_t iRefIndex[LIST_A][30],197void_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
52 52
53namespace WelsDec {53namespace WelsDec {
54 54
55void_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
204void_t GetNeighborAvailMbType (PNeighAvail pNeighAvail, PDqLayer pCurLayer) {55void_t GetNeighborAvailMbType (PNeighAvail pNeighAvail, PDqLayer pCurLayer) {
205 int32_t iCurSliceIdc, iTopSliceIdc, iLeftTopSliceIdc, iRightTopSliceIdc, iLeftSliceIdc;56 int32_t iCurSliceIdc, iTopSliceIdc, iLeftTopSliceIdc, iRightTopSliceIdc, iLeftSliceIdc;
206 int32_t iCurXy, iTopXy, iLeftXy, iLeftTopXy, iRightTopXy;57 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