# HG changeset patch # User cehoyos # Date 1192486659 0 # Node ID 18859ffa5705e97066ef8f5bfe4f2ef38ab7a3e7 # Parent 6ac956b341f2c8a9b81c0897869be448a6506c01 Fix chroma mv offsets for PAFF in a way that is compatible with MBAFF by setting Picture.reference to indicate parity for all Pictures in reference list. Patch by Jeff Downs, heydowns T borg O com diff -r 6ac956b341f2 -r 18859ffa5705 h264.c --- a/h264.c Mon Oct 15 21:41:01 2007 +0000 +++ b/h264.c Mon Oct 15 22:17:39 2007 +0000 @@ -1729,7 +1729,7 @@ if(MB_FIELD){ // chroma offset when predicting from a field of opposite parity - my += 2 * ((s->mb_y & 1) - (h->ref_cache[list][scan8[n]] & 1)); + my += 2 * ((s->mb_y & 1) - (pic->reference - 1)); emu |= (my>>3) < 0 || (my>>3) + 8 >= (pic_height>>1); } src_cb= pic->data[1] + (mx>>3) + (my>>3)*h->mb_uvlinesize; @@ -2764,11 +2764,12 @@ else hl_decode_mb_simple(h); } -static void pic_as_field(Picture *pic, const int bottom){ +static void pic_as_field(Picture *pic, const int parity){ int i; for (i = 0; i < 4; ++i) { - if (bottom) + if (parity == PICT_BOTTOM_FIELD) pic->data[i] += pic->linesize[i]; + pic->reference = parity; pic->linesize[i] *= 2; } } @@ -2779,7 +2780,7 @@ if (match) { *dest = *src; - pic_as_field(dest, parity == PICT_BOTTOM_FIELD); + pic_as_field(dest, parity); dest->pic_id *= 2; dest->pic_id += id_add; } @@ -3133,8 +3134,7 @@ } h->ref_list[list][index]= *ref; if (FIELD_PICTURE){ - int bot = pic_structure == PICT_BOTTOM_FIELD; - pic_as_field(&h->ref_list[list][index], bot); + pic_as_field(&h->ref_list[list][index], pic_structure); } } }else{ @@ -3166,9 +3166,11 @@ field[0] = *frame; for(j=0; j<3; j++) field[0].linesize[j] <<= 1; + field[0].reference = PICT_TOP_FIELD; field[1] = field[0]; for(j=0; j<3; j++) field[1].data[j] += frame->linesize[j]; + field[1].reference = PICT_BOTTOM_FIELD; h->luma_weight[list][16+2*i] = h->luma_weight[list][16+2*i+1] = h->luma_weight[list][i]; h->luma_offset[list][16+2*i] = h->luma_offset[list][16+2*i+1] = h->luma_offset[list][i];