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