Mercurial > libavcodec.hg
comparison mpegvideo.c @ 1655:c92147a61d97 libavcodec
rv20 (h263) b frame decoding support
author | michael |
---|---|
date | Thu, 04 Dec 2003 18:34:47 +0000 |
parents | 834922115010 |
children | d4637a0eaab1 |
comparison
equal
deleted
inserted
replaced
1654:1c123e036890 | 1655:c92147a61d97 |
---|---|
263 * The pixels are allocated/set by calling get_buffer() if shared=0 | 263 * The pixels are allocated/set by calling get_buffer() if shared=0 |
264 */ | 264 */ |
265 static int alloc_picture(MpegEncContext *s, Picture *pic, int shared){ | 265 static int alloc_picture(MpegEncContext *s, Picture *pic, int shared){ |
266 const int big_mb_num= s->mb_stride*(s->mb_height+1) + 1; //the +1 is needed so memset(,,stride*height) doesnt sig11 | 266 const int big_mb_num= s->mb_stride*(s->mb_height+1) + 1; //the +1 is needed so memset(,,stride*height) doesnt sig11 |
267 const int mb_array_size= s->mb_stride*s->mb_height; | 267 const int mb_array_size= s->mb_stride*s->mb_height; |
268 const int b8_array_size= s->b8_stride*s->mb_height*2; | |
269 const int b4_array_size= s->b4_stride*s->mb_height*4; | |
268 int i; | 270 int i; |
269 | 271 |
270 if(shared){ | 272 if(shared){ |
271 assert(pic->data[0]); | 273 assert(pic->data[0]); |
272 assert(pic->type == 0 || pic->type == FF_BUFFER_TYPE_SHARED); | 274 assert(pic->type == 0 || pic->type == FF_BUFFER_TYPE_SHARED); |
308 CHECKED_ALLOCZ(pic->qscale_table , mb_array_size * sizeof(uint8_t)) | 310 CHECKED_ALLOCZ(pic->qscale_table , mb_array_size * sizeof(uint8_t)) |
309 CHECKED_ALLOCZ(pic->mb_type_base , big_mb_num * sizeof(int)) | 311 CHECKED_ALLOCZ(pic->mb_type_base , big_mb_num * sizeof(int)) |
310 pic->mb_type= pic->mb_type_base + s->mb_stride+1; | 312 pic->mb_type= pic->mb_type_base + s->mb_stride+1; |
311 if(s->out_format == FMT_H264){ | 313 if(s->out_format == FMT_H264){ |
312 for(i=0; i<2; i++){ | 314 for(i=0; i<2; i++){ |
313 CHECKED_ALLOCZ(pic->motion_val[i], 2 * 16 * s->mb_num * sizeof(uint16_t)) | 315 CHECKED_ALLOCZ(pic->motion_val_base[i], 2 * (b4_array_size+1) * sizeof(uint16_t)) |
314 CHECKED_ALLOCZ(pic->ref_index[i] , 4 * s->mb_num * sizeof(uint8_t)) | 316 pic->motion_val[i]= pic->motion_val_base[i]+1; |
317 CHECKED_ALLOCZ(pic->ref_index[i] , b8_array_size * sizeof(uint8_t)) | |
318 } | |
319 }else if(s->out_format == FMT_H263){ | |
320 for(i=0; i<2; i++){ | |
321 CHECKED_ALLOCZ(pic->motion_val_base[i], 2 * (b8_array_size+1) * sizeof(uint16_t)) | |
322 pic->motion_val[i]= pic->motion_val_base[i]+1; | |
315 } | 323 } |
316 } | 324 } |
317 pic->qstride= s->mb_stride; | 325 pic->qstride= s->mb_stride; |
318 CHECKED_ALLOCZ(pic->pan_scan , 1 * sizeof(AVPanScan)) | 326 CHECKED_ALLOCZ(pic->pan_scan , 1 * sizeof(AVPanScan)) |
319 } | 327 } |
346 av_freep(&pic->qscale_table); | 354 av_freep(&pic->qscale_table); |
347 av_freep(&pic->mb_type_base); | 355 av_freep(&pic->mb_type_base); |
348 av_freep(&pic->pan_scan); | 356 av_freep(&pic->pan_scan); |
349 pic->mb_type= NULL; | 357 pic->mb_type= NULL; |
350 for(i=0; i<2; i++){ | 358 for(i=0; i<2; i++){ |
351 av_freep(&pic->motion_val[i]); | 359 av_freep(&pic->motion_val_base[i]); |
352 av_freep(&pic->ref_index[i]); | 360 av_freep(&pic->ref_index[i]); |
353 } | 361 } |
354 | 362 |
355 if(pic->type == FF_BUFFER_TYPE_SHARED){ | 363 if(pic->type == FF_BUFFER_TYPE_SHARED){ |
356 for(i=0; i<4; i++){ | 364 for(i=0; i<4; i++){ |
372 s->flags= s->avctx->flags; | 380 s->flags= s->avctx->flags; |
373 | 381 |
374 s->mb_width = (s->width + 15) / 16; | 382 s->mb_width = (s->width + 15) / 16; |
375 s->mb_height = (s->height + 15) / 16; | 383 s->mb_height = (s->height + 15) / 16; |
376 s->mb_stride = s->mb_width + 1; | 384 s->mb_stride = s->mb_width + 1; |
385 s->b8_stride = s->mb_width*2 + 1; | |
386 s->b4_stride = s->mb_width*4 + 1; | |
377 mb_array_size= s->mb_height * s->mb_stride; | 387 mb_array_size= s->mb_height * s->mb_stride; |
378 | 388 |
379 /* set default edge pos, will be overriden in decode_header if needed */ | 389 /* set default edge pos, will be overriden in decode_header if needed */ |
380 s->h_edge_pos= s->mb_width*16; | 390 s->h_edge_pos= s->mb_width*16; |
381 s->v_edge_pos= s->mb_height*16; | 391 s->v_edge_pos= s->mb_height*16; |
2362 uint8_t *ptr, *dest; | 2372 uint8_t *ptr, *dest; |
2363 | 2373 |
2364 mb_x = s->mb_x; | 2374 mb_x = s->mb_x; |
2365 mb_y = s->mb_y; | 2375 mb_y = s->mb_y; |
2366 | 2376 |
2367 if(s->obmc){ | 2377 if(s->obmc && s->pict_type != B_TYPE){ |
2368 int16_t mv_cache[4][4][2]; | 2378 int16_t mv_cache[4][4][2]; |
2369 const int xy= s->mb_x + s->mb_y*s->mb_stride; | 2379 const int xy= s->mb_x + s->mb_y*s->mb_stride; |
2370 const int mot_stride= s->mb_width*2 + 2; | 2380 const int mot_stride= s->mb_width*2 + 2; |
2371 const int mot_xy= 1 + mb_x*2 + (mb_y*2 + 1)*mot_stride; | 2381 const int mot_xy= 1 + mb_x*2 + (mb_y*2 + 1)*mot_stride; |
2372 | 2382 |