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
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