summaryrefslogtreecommitdiff
path: root/gen6_mfd.c
diff options
context:
space:
mode:
authorXiang, Haihao <haihao.xiang@intel.com>2011-06-14 09:49:44 +0800
committerXiang, Haihao <haihao.xiang@intel.com>2011-06-14 09:49:44 +0800
commit0fe25b56a332eddc46b922b4aaa1dfbb9ca2162a (patch)
treea9d4bc7b55cc4fc82225227ab20cde27a6790765 /gen6_mfd.c
parent502923c46148ec35730d1badc2c90e0862c44cdf (diff)
i965_drv_video: fix GPU hang issue when decoding field coded MPEG2 picture.
Signed-off-by: Xiang, Haihao <haihao.xiang@intel.com>
Diffstat (limited to 'gen6_mfd.c')
-rw-r--r--gen6_mfd.c29
1 files changed, 19 insertions, 10 deletions
diff --git a/gen6_mfd.c b/gen6_mfd.c
index e6abb32..9a5ab56 100644
--- a/gen6_mfd.c
+++ b/gen6_mfd.c
@@ -1303,15 +1303,24 @@ gen6_mfd_mpeg2_bsd_object(VADriverContextP ctx,
{
struct intel_batchbuffer *batch = gen6_mfd_context->base.batch;
unsigned int width_in_mbs = ALIGN(pic_param->horizontal_size, 16) / 16;
- unsigned int height_in_mbs = ALIGN(pic_param->vertical_size, 16) / 16;
- int mb_count;
+ int mb_count, vpos0, hpos0, vpos1, hpos1, is_field_pic = 0;
- if (next_slice_param == NULL)
- mb_count = width_in_mbs * height_in_mbs -
- (slice_param->slice_vertical_position * width_in_mbs + slice_param->slice_horizontal_position);
- else
- mb_count = (next_slice_param->slice_vertical_position * width_in_mbs + next_slice_param->slice_horizontal_position) -
- (slice_param->slice_vertical_position * width_in_mbs + slice_param->slice_horizontal_position);
+ if (pic_param->picture_coding_extension.bits.picture_structure == MPEG_TOP_FIELD ||
+ pic_param->picture_coding_extension.bits.picture_structure == MPEG_BOTTOM_FIELD)
+ is_field_pic = 1;
+
+ vpos0 = slice_param->slice_vertical_position / (1 + is_field_pic);
+ hpos0 = slice_param->slice_horizontal_position;
+
+ if (next_slice_param == NULL) {
+ vpos1 = ALIGN(pic_param->vertical_size, 16) / 16 / (1 + is_field_pic);
+ hpos1 = 0;
+ } else {
+ vpos1 = next_slice_param->slice_vertical_position / (1 + is_field_pic);
+ hpos1 = next_slice_param->slice_horizontal_position;
+ }
+
+ mb_count = (vpos1 * width_in_mbs + hpos1) - (vpos0 * width_in_mbs + hpos0);
BEGIN_BCS_BATCH(batch, 5);
OUT_BCS_BATCH(batch, MFD_MPEG2_BSD_OBJECT | (5 - 2));
@@ -1320,8 +1329,8 @@ gen6_mfd_mpeg2_bsd_object(VADriverContextP ctx,
OUT_BCS_BATCH(batch,
slice_param->slice_data_offset + (slice_param->macroblock_offset >> 3));
OUT_BCS_BATCH(batch,
- slice_param->slice_horizontal_position << 24 |
- slice_param->slice_vertical_position << 16 |
+ hpos0 << 24 |
+ vpos0 << 16 |
mb_count << 8 |
(next_slice_param == NULL) << 5 |
(next_slice_param == NULL) << 3 |