You've already forked FFmpeg
mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-08-15 14:13:16 +02:00
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 Originally committed as revision 10744 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
committed by
Carl Eugen Hoyos
parent
f1bf85b8cf
commit
2143b11853
@@ -1729,7 +1729,7 @@ static inline void mc_dir_part(H264Context *h, Picture *pic, int n, int square,
|
|||||||
|
|
||||||
if(MB_FIELD){
|
if(MB_FIELD){
|
||||||
// chroma offset when predicting from a field of opposite parity
|
// 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);
|
emu |= (my>>3) < 0 || (my>>3) + 8 >= (pic_height>>1);
|
||||||
}
|
}
|
||||||
src_cb= pic->data[1] + (mx>>3) + (my>>3)*h->mb_uvlinesize;
|
src_cb= pic->data[1] + (mx>>3) + (my>>3)*h->mb_uvlinesize;
|
||||||
@@ -2764,11 +2764,12 @@ static void hl_decode_mb(H264Context *h){
|
|||||||
else hl_decode_mb_simple(h);
|
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;
|
int i;
|
||||||
for (i = 0; i < 4; ++i) {
|
for (i = 0; i < 4; ++i) {
|
||||||
if (bottom)
|
if (parity == PICT_BOTTOM_FIELD)
|
||||||
pic->data[i] += pic->linesize[i];
|
pic->data[i] += pic->linesize[i];
|
||||||
|
pic->reference = parity;
|
||||||
pic->linesize[i] *= 2;
|
pic->linesize[i] *= 2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2779,7 +2780,7 @@ static int split_field_copy(Picture *dest, Picture *src,
|
|||||||
|
|
||||||
if (match) {
|
if (match) {
|
||||||
*dest = *src;
|
*dest = *src;
|
||||||
pic_as_field(dest, parity == PICT_BOTTOM_FIELD);
|
pic_as_field(dest, parity);
|
||||||
dest->pic_id *= 2;
|
dest->pic_id *= 2;
|
||||||
dest->pic_id += id_add;
|
dest->pic_id += id_add;
|
||||||
}
|
}
|
||||||
@@ -3133,8 +3134,7 @@ static int decode_ref_pic_list_reordering(H264Context *h){
|
|||||||
}
|
}
|
||||||
h->ref_list[list][index]= *ref;
|
h->ref_list[list][index]= *ref;
|
||||||
if (FIELD_PICTURE){
|
if (FIELD_PICTURE){
|
||||||
int bot = pic_structure == PICT_BOTTOM_FIELD;
|
pic_as_field(&h->ref_list[list][index], pic_structure);
|
||||||
pic_as_field(&h->ref_list[list][index], bot);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
@@ -3166,9 +3166,11 @@ static void fill_mbaff_ref_list(H264Context *h){
|
|||||||
field[0] = *frame;
|
field[0] = *frame;
|
||||||
for(j=0; j<3; j++)
|
for(j=0; j<3; j++)
|
||||||
field[0].linesize[j] <<= 1;
|
field[0].linesize[j] <<= 1;
|
||||||
|
field[0].reference = PICT_TOP_FIELD;
|
||||||
field[1] = field[0];
|
field[1] = field[0];
|
||||||
for(j=0; j<3; j++)
|
for(j=0; j<3; j++)
|
||||||
field[1].data[j] += frame->linesize[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_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];
|
h->luma_offset[list][16+2*i] = h->luma_offset[list][16+2*i+1] = h->luma_offset[list][i];
|
||||||
|
Reference in New Issue
Block a user