Mercurial > libavcodec.hg
comparison cavs.h @ 5237:6aa42985b8e9 libavcodec
move existing inline functions from cavs.c to cavs.h
author | stefang |
---|---|
date | Sat, 07 Jul 2007 05:03:22 +0000 |
parents | 1e80bd238744 |
children | 871a49faf887 |
comparison
equal
deleted
inserted
replaced
5236:1e80bd238744 | 5237:6aa42985b8e9 |
---|---|
222 | 222 |
223 int got_keyframe; | 223 int got_keyframe; |
224 DCTELEM *block; | 224 DCTELEM *block; |
225 } AVSContext; | 225 } AVSContext; |
226 | 226 |
227 extern const vector_t ff_cavs_un_mv; | |
228 | |
229 static inline void load_intra_pred_luma(AVSContext *h, uint8_t *top, | |
230 uint8_t **left, int block) { | |
231 int i; | |
232 | |
233 switch(block) { | |
234 case 0: | |
235 *left = h->left_border_y; | |
236 h->left_border_y[0] = h->left_border_y[1]; | |
237 memset(&h->left_border_y[17],h->left_border_y[16],9); | |
238 memcpy(&top[1],&h->top_border_y[h->mbx*16],16); | |
239 top[17] = top[16]; | |
240 top[0] = top[1]; | |
241 if((h->flags & A_AVAIL) && (h->flags & B_AVAIL)) | |
242 h->left_border_y[0] = top[0] = h->topleft_border_y; | |
243 break; | |
244 case 1: | |
245 *left = h->intern_border_y; | |
246 for(i=0;i<8;i++) | |
247 h->intern_border_y[i+1] = *(h->cy + 7 + i*h->l_stride); | |
248 memset(&h->intern_border_y[9],h->intern_border_y[8],9); | |
249 h->intern_border_y[0] = h->intern_border_y[1]; | |
250 memcpy(&top[1],&h->top_border_y[h->mbx*16+8],8); | |
251 if(h->flags & C_AVAIL) | |
252 memcpy(&top[9],&h->top_border_y[(h->mbx + 1)*16],8); | |
253 else | |
254 memset(&top[9],top[8],9); | |
255 top[17] = top[16]; | |
256 top[0] = top[1]; | |
257 if(h->flags & B_AVAIL) | |
258 h->intern_border_y[0] = top[0] = h->top_border_y[h->mbx*16+7]; | |
259 break; | |
260 case 2: | |
261 *left = &h->left_border_y[8]; | |
262 memcpy(&top[1],h->cy + 7*h->l_stride,16); | |
263 top[17] = top[16]; | |
264 top[0] = top[1]; | |
265 if(h->flags & A_AVAIL) | |
266 top[0] = h->left_border_y[8]; | |
267 break; | |
268 case 3: | |
269 *left = &h->intern_border_y[8]; | |
270 for(i=0;i<8;i++) | |
271 h->intern_border_y[i+9] = *(h->cy + 7 + (i+8)*h->l_stride); | |
272 memset(&h->intern_border_y[17],h->intern_border_y[16],9); | |
273 memcpy(&top[0],h->cy + 7 + 7*h->l_stride,9); | |
274 memset(&top[9],top[8],9); | |
275 break; | |
276 } | |
277 } | |
278 | |
279 static inline void modify_pred(const int_fast8_t *mod_table, int *mode) { | |
280 *mode = mod_table[*mode]; | |
281 if(*mode < 0) { | |
282 av_log(NULL, AV_LOG_ERROR, "Illegal intra prediction mode\n"); | |
283 *mode = 0; | |
284 } | |
285 } | |
286 | |
287 static inline void set_mvs(vector_t *mv, enum block_t size) { | |
288 switch(size) { | |
289 case BLK_16X16: | |
290 mv[MV_STRIDE ] = mv[0]; | |
291 mv[MV_STRIDE+1] = mv[0]; | |
292 case BLK_16X8: | |
293 mv[1] = mv[0]; | |
294 break; | |
295 case BLK_8X16: | |
296 mv[MV_STRIDE] = mv[0]; | |
297 break; | |
298 } | |
299 } | |
300 | |
301 /** | |
302 * initialise predictors for motion vectors and intra prediction | |
303 */ | |
304 static inline void init_mb(AVSContext *h) { | |
305 int i; | |
306 | |
307 /* copy predictors from top line (MB B and C) into cache */ | |
308 for(i=0;i<3;i++) { | |
309 h->mv[MV_FWD_B2+i] = h->top_mv[0][h->mbx*2+i]; | |
310 h->mv[MV_BWD_B2+i] = h->top_mv[1][h->mbx*2+i]; | |
311 } | |
312 h->pred_mode_Y[1] = h->top_pred_Y[h->mbx*2+0]; | |
313 h->pred_mode_Y[2] = h->top_pred_Y[h->mbx*2+1]; | |
314 /* clear top predictors if MB B is not available */ | |
315 if(!(h->flags & B_AVAIL)) { | |
316 h->mv[MV_FWD_B2] = ff_cavs_un_mv; | |
317 h->mv[MV_FWD_B3] = ff_cavs_un_mv; | |
318 h->mv[MV_BWD_B2] = ff_cavs_un_mv; | |
319 h->mv[MV_BWD_B3] = ff_cavs_un_mv; | |
320 h->pred_mode_Y[1] = h->pred_mode_Y[2] = NOT_AVAIL; | |
321 h->flags &= ~(C_AVAIL|D_AVAIL); | |
322 } else if(h->mbx) { | |
323 h->flags |= D_AVAIL; | |
324 } | |
325 if(h->mbx == h->mb_width-1) //MB C not available | |
326 h->flags &= ~C_AVAIL; | |
327 /* clear top-right predictors if MB C is not available */ | |
328 if(!(h->flags & C_AVAIL)) { | |
329 h->mv[MV_FWD_C2] = ff_cavs_un_mv; | |
330 h->mv[MV_BWD_C2] = ff_cavs_un_mv; | |
331 } | |
332 /* clear top-left predictors if MB D is not available */ | |
333 if(!(h->flags & D_AVAIL)) { | |
334 h->mv[MV_FWD_D3] = ff_cavs_un_mv; | |
335 h->mv[MV_BWD_D3] = ff_cavs_un_mv; | |
336 } | |
337 /* set pointer for co-located macroblock type */ | |
338 h->col_type = &h->col_type_base[h->mby*h->mb_width + h->mbx]; | |
339 } | |
340 | |
341 static inline void check_for_slice(AVSContext *h); | |
342 | |
343 /** | |
344 * save predictors for later macroblocks and increase | |
345 * macroblock address | |
346 * @returns 0 if end of frame is reached, 1 otherwise | |
347 */ | |
348 static inline int next_mb(AVSContext *h) { | |
349 int i; | |
350 | |
351 h->flags |= A_AVAIL; | |
352 h->cy += 16; | |
353 h->cu += 8; | |
354 h->cv += 8; | |
355 /* copy mvs as predictors to the left */ | |
356 for(i=0;i<=20;i+=4) | |
357 h->mv[i] = h->mv[i+2]; | |
358 /* copy bottom mvs from cache to top line */ | |
359 h->top_mv[0][h->mbx*2+0] = h->mv[MV_FWD_X2]; | |
360 h->top_mv[0][h->mbx*2+1] = h->mv[MV_FWD_X3]; | |
361 h->top_mv[1][h->mbx*2+0] = h->mv[MV_BWD_X2]; | |
362 h->top_mv[1][h->mbx*2+1] = h->mv[MV_BWD_X3]; | |
363 /* next MB address */ | |
364 h->mbx++; | |
365 if(h->mbx == h->mb_width) { //new mb line | |
366 h->flags = B_AVAIL|C_AVAIL; | |
367 /* clear left pred_modes */ | |
368 h->pred_mode_Y[3] = h->pred_mode_Y[6] = NOT_AVAIL; | |
369 /* clear left mv predictors */ | |
370 for(i=0;i<=20;i+=4) | |
371 h->mv[i] = ff_cavs_un_mv; | |
372 h->mbx = 0; | |
373 h->mby++; | |
374 /* re-calculate sample pointers */ | |
375 h->cy = h->picture.data[0] + h->mby*16*h->l_stride; | |
376 h->cu = h->picture.data[1] + h->mby*8*h->c_stride; | |
377 h->cv = h->picture.data[2] + h->mby*8*h->c_stride; | |
378 if(h->mby == h->mb_height) { //frame end | |
379 return 0; | |
380 } else { | |
381 //check_for_slice(h); | |
382 } | |
383 } | |
384 return 1; | |
385 } | |
386 | |
227 #endif /* CAVS_H */ | 387 #endif /* CAVS_H */ |