History

fix grey picture when resolution is the same

dongzha committed 11 years ago

Commit fc895c11 parent 054b8ee1 file · +133 −9Browse files

Showing the changes to codec/decoder/core/src/decoder.cpp (1 of 1 file). Show all

Unified · Split

codec/decoder/core/src/decoder.cpp+133−9
@@ -94,6 +94,119 @@ static int32_t CreatePicBuff (PWelsDecoderContext pCtx, PPicBuff* ppPicBuf, cons · 93 unmodified lines
94 return 0;94 return 0;
95}95}
96 96
97static int32_t IncreasePicBuff (PWelsDecoderContext pCtx, PPicBuff* ppPicBuf, const int32_t kiOldSize,
98 const int32_t kiPicWidth, const int32_t kiPicHeight, const int32_t kiNewSize) {
99 PPicBuff pPicOldBuf = *ppPicBuf;
100 PPicBuff pPicNewBuf = NULL;
101 int32_t iPicIdx = 0;
102 if (kiOldSize<=0 || kiNewSize <= 0 || kiPicWidth <= 0 || kiPicHeight <= 0) {
103 return 1;
104 }
105
106 pPicNewBuf = (PPicBuff)WelsMalloc (sizeof (SPicBuff), "PPicBuff");
107
108 if (NULL == pPicNewBuf) {
109 return 1;
110 }
111
112 pPicNewBuf->ppPic = (PPicture*)WelsMalloc (kiNewSize * sizeof (PPicture), "PPicture*");
113
114 if (NULL == pPicNewBuf->ppPic) {
115 return 1;
116 }
117 // copy old PicBuf to new PicBuf
118 memcpy(pPicNewBuf->ppPic, pPicOldBuf->ppPic, kiOldSize * sizeof(PPicture));
119 // initialize context in queue
120 pPicNewBuf->iCapacity = kiNewSize;
121 pPicNewBuf->iCurrentIdx = pPicOldBuf->iCurrentIdx;
122 *ppPicBuf = pPicNewBuf;
123
124 // increase new PicBuf
125 for (iPicIdx = kiOldSize; iPicIdx < kiNewSize; ++ iPicIdx) {
126 PPicture pPic = AllocPicture (pCtx, kiPicWidth, kiPicHeight);
127 if (NULL == pPic) {
128 return 1;
129 }
130 pPicNewBuf->ppPic[iPicIdx] = pPic;
131 }
132
133 // remove old PicBuf
134 if (pPicOldBuf->ppPic != NULL) {
135 WelsFree (pPicOldBuf->ppPic, "pPicOldBuf->queue");
136 pPicOldBuf->ppPic = NULL;
137 }
138 pPicOldBuf->iCapacity = 0;
139 pPicOldBuf->iCurrentIdx = 0;
140 WelsFree (pPicOldBuf, "pPicOldBuf");
141
142 return 0;
143}
144
145static int32_t DecreasePicBuff (PWelsDecoderContext pCtx, PPicBuff* ppPicBuf, const int32_t kiOldSize,
146 const int32_t kiPicWidth, const int32_t kiPicHeight, const int32_t kiNewSize) {
147 PPicBuff pPicOldBuf = *ppPicBuf;
148 PPicBuff pPicNewBuf = NULL;
149 int32_t iPicIdx = 0;
150 if (kiOldSize<=0 || kiNewSize <= 0 || kiPicWidth <= 0 || kiPicHeight <= 0) {
151 return 1;
152 }
153
154 pPicNewBuf = (PPicBuff)WelsMalloc (sizeof (SPicBuff), "PPicBuff");
155
156 if (NULL == pPicNewBuf) {
157 return 1;
158 }
159
160 pPicNewBuf->ppPic = (PPicture*)WelsMalloc (kiNewSize * sizeof (PPicture), "PPicture*");
161
162 if (NULL == pPicNewBuf->ppPic) {
163 return 1;
164 }
165
166 int32_t iPrevPicIdx = -1;
167 for (iPrevPicIdx = 0; iPrevPicIdx < kiOldSize; ++iPrevPicIdx) {
168 if(pCtx->pPreviousDecodedPictureInDpb == pPicOldBuf->ppPic[iPrevPicIdx]) {
169 break;
170 }
171 }
172 int32_t iDelIdx;
173 if(iPrevPicIdx < kiOldSize && iPrevPicIdx >= kiNewSize) {
174 // found pPreviousDecodedPictureInDpb,
175 pPicNewBuf->ppPic[0] = pPicOldBuf->ppPic[iPrevPicIdx];
176 pPicNewBuf->iCurrentIdx = 0;
177 memcpy(pPicNewBuf->ppPic + 1, pPicOldBuf->ppPic, (kiNewSize - 1) * sizeof(PPicture));
178 iDelIdx = kiNewSize - 1;
179 } else {
180 memcpy(pPicNewBuf->ppPic, pPicOldBuf->ppPic, kiNewSize * sizeof(PPicture));
181 pPicNewBuf->iCurrentIdx = iPrevPicIdx < kiNewSize? iPrevPicIdx : 0;
182 iDelIdx = kiNewSize;
183 }
184
185 for(iPicIdx = iDelIdx; iPicIdx < kiOldSize; iPicIdx++) {
186 if(iPrevPicIdx != iPicIdx) {
187 if (pPicOldBuf->ppPic[iPicIdx] != NULL) {
188 FreePicture (pPicOldBuf->ppPic[iPicIdx]);
189 pPicOldBuf->ppPic[iPicIdx] = NULL;
190 }
191 }
192 }
193
194 // initialize context in queue
195 pPicNewBuf->iCapacity = kiNewSize;
196 *ppPicBuf = pPicNewBuf;
197
198 // remove old PicBuf
199 if (pPicOldBuf->ppPic != NULL) {
200 WelsFree (pPicOldBuf->ppPic, "pPicOldBuf->queue");
201 pPicOldBuf->ppPic = NULL;
202 }
203 pPicOldBuf->iCapacity = 0;
204 pPicOldBuf->iCurrentIdx = 0;
205 WelsFree (pPicOldBuf, "pPicOldBuf");
206
207 return 0;
208}
209
97static void DestroyPicBuff (PPicBuff* ppPicBuf) {210static void DestroyPicBuff (PPicBuff* ppPicBuf) {
98 PPicBuff pPicBuf = NULL;211 PPicBuff pPicBuf = NULL;
99 212
@@ -225,18 +338,29 @@ int32_t WelsRequestMem (PWelsDecoderContext pCtx, const int32_t kiMbWidth, const · 125 unmodified lines
225 // sync update pRefList338 // sync update pRefList
226 WelsResetRefPic (pCtx); // added to sync update ref list due to pictures are free339 WelsResetRefPic (pCtx); // added to sync update ref list due to pictures are free
227 340
228 // for Recycled_Pic_Queue341 if(pCtx->bHaveGotMemory && (kiPicWidth == pCtx->iImgWidthInPixel && kiPicHeight == pCtx->iImgHeightInPixel)
229 for (iListIdx = LIST_0; iListIdx < LIST_A; ++ iListIdx) {342 && pCtx->pPicBuff[LIST_0] != NULL && pCtx->pPicBuff[LIST_0]->iCapacity != iPicQueueSize) {
230 PPicBuff* ppPic = &pCtx->pPicBuff[iListIdx];343 // currently only active for LIST_0 due to have no B frames
231 if (NULL != ppPic && NULL != *ppPic) {344 if (pCtx->pPicBuff[LIST_0]->iCapacity < iPicQueueSize) {
232 DestroyPicBuff (ppPic);345 iErr = IncreasePicBuff (pCtx, &pCtx->pPicBuff[LIST_0], pCtx->pPicBuff[LIST_0]->iCapacity, kiPicWidth, kiPicHeight, iPicQueueSize);
346 } else {
347 iErr = DecreasePicBuff (pCtx, &pCtx->pPicBuff[LIST_0], pCtx->pPicBuff[LIST_0]->iCapacity, kiPicWidth, kiPicHeight, iPicQueueSize);
233 }348 }
234 }349 } else {
350 // for Recycled_Pic_Queue
351 for (iListIdx = LIST_0; iListIdx < LIST_A; ++ iListIdx) {
352 PPicBuff* ppPic = &pCtx->pPicBuff[iListIdx];
353 if (NULL != ppPic && NULL != *ppPic) {
354 DestroyPicBuff (ppPic);
355 }
356 }
235 357
236 pCtx->pPreviousDecodedPictureInDpb = NULL;358 pCtx->pPreviousDecodedPictureInDpb = NULL;
359
360 // currently only active for LIST_0 due to have no B frames
361 iErr = CreatePicBuff (pCtx, &pCtx->pPicBuff[LIST_0], iPicQueueSize, kiPicWidth, kiPicHeight);
362 }
237 363
238 // currently only active for LIST_0 due to have no B frames
239 iErr = CreatePicBuff (pCtx, &pCtx->pPicBuff[LIST_0], iPicQueueSize, kiPicWidth, kiPicHeight);
240 if (iErr != ERR_NONE)364 if (iErr != ERR_NONE)
241 return iErr;365 return iErr;
242 366

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